linux0.11学习全记录

本文详细解析了Linux系统的启动过程,从BIOS加载bootsect.s开始,介绍如何通过一系列步骤完成从实模式到保护模式的转变,并最终加载根文件系统。
一个基本的linux系统有两部分构成:
内核映像文件,根文件系统。
内核映像文件是用linux的原代码编译成的,由三部分构成:bootsect,setup,system.

具体方法是对 boot/中的 bootsect.s、setup.s 使用 8086 汇编器
进行编译,分别生成各自的执行模块。再对源代码中的其它所有程序(head,main,kernel,mm,fs,lib)使用 GNU 的编译器 gcc/gas 进行编译,并连接成模块 system。然后使用 build 工具将这三块组合成一个内核映象文件 image.

其中 bootsect.s 代码是磁盘引导块程序,驻留在磁盘的第一个扇区中(引导扇区,0 磁道(柱面) ,0磁头,第 1 个扇区)

该内核映象文件 image被写入启动盘。

启动的时候,当 PC 的电源打开后,80x86 结构的
CPU 将自动进入实模式,并从地址 0xFFFF0 开始自动执行程序代码,这个地址通常是 ROM-BIOS 中的
地址。PC 机的 BIOS 将执行某些系统的检测,并在物理地址 0 处开始初始化中断向量。此后,它将可启
动设备的第一个扇区(磁盘引导扇区,512 字节)读入内存绝对地址 0x7C00 处,并跳转到这个地方。启
动设备通常是软驱或是硬盘。

即:BIOS 将bootsect读入内存绝对地址 0x7C00 处。



总结:
  在引导加载程序 bootsect.s 将 setup.s 代码和 system 模块加载到内存中,并且分别把自己和 setup.s 代
码移动到物理内存 0x90000 和 0x90200 处后,就把执行权交给了 setup 程序。其中 system 模块的首部包
含有 head.s 代码。
  setup 程序的主要作用是利用 ROM BIOS 的中断程序获取机器的一些基本参数,并保存在 0x90000
开始的内存块中,    供后面程序使用。     同时把 system 模块往下移动到物理地址 0x00000 开始处, 这样,
                                                               system
中的 head.s 代码就处在 0x00000 开始处了。然后加载描述符表基地址到描述符表寄存器中,为进行 32
位保护模式下的运行作好准备。         接下来对中断控制硬件进行重新设置,        最后通过设置机器控制寄存器 CR0
并跳转到 system 模块的 head.s 代码开始处,使 CPU 进入 32 位保护模式下运行。
  Head.s 代码的主要作用是初步初始化中断描述符表中的 256 项门描述符,           检查 A20 地址线是否已经
打开,测试系统是否含有数学协处理器。然后初始化内存页目录表,为内存的分页管理作好准备工作。
最后跳转到 system 模块中的初始化程序 init.c 中继续执行。

带中文注释可成功编译运行的Linux0.11+Bochs2.62实验环境说明 此注释以网上获得的“linux带中文注释的0.11版本”为基础,对照赵炯博士《Linux内核完全注释(0.11) 》V3.0版(http://oldlinux.org/download/clk011c-3.0.pdf)编辑而成。作为对赵博士感谢,以及对Linux初学者的回馈,特发布在优快云上。 此注释可以在http://oldlinux.org/Linux.old/bochs/提供的Linux-0.11-devel-XXXXXX实验环境下正确编译成功,使用:"make disk"命令重启Bochs虚拟机后,新编译源码直接生效,便于学习者直接阅读源码,直接进行实验。 注意事项: 1、为了使注释版与实验环境上的Linux0.11内核保持一致,达到对应文件可以互换的目的,与Linux0.11原始版本相比,加入了15个系统调用函数(参见include/Linux/sys.h第78-92行。赵博士原书没有这部分注释,我不敢班门弄斧),其它相关的文件加入了相应的定义。新加入的代码只有函数体定义,没有具体实现,对其它原始代码没有改变、没有影响。 2、键盘定义改成了美式键盘(原始代码中是芬兰键盘,会导致个别键出问题,调试的时候我曾被迷糊了好久,以为自己把程序搞乱了)。 3、把网上VC版的注释统一改成了 “/* */” 格式的注释。经测试,在Linux0.11实验环境中(gcc1.40),只有标准C注释语法可以正常编译。 4、由于《Linux内核完全注释(0.11) 》原书版本更新的原因,注释中提到的图、表可能与V3.0版书中不一致。 5、由于代码中加入注释,代码行号发生变化,注释中提到的代码行号会出现不一致,建议对照3.0版查询对应内容。 6、实验方法:请先安装附带的Bochs2.62版安装包,双击Test.bxrc即可启动实验系统,执行命令:sh t,即可完成对linuxcn的编译。 7、linux目录中是此实验系统中/usr/src/linux提取出来的不含中文注释的linux0.11源码(此版本比原始的0.11版多15个系统调用函数),linuxcn是加入了中文注释的源码。 8、diskb.img是实验系统与Windows环境下进行文件交换的1.44M软盘映像,执行脚本命令"sh t"时会自动从此映像中读取linux.tar、linuxcn.tar包,解包并编译,编译结果在:/usr/root/zw/linuxcn目录下。为了方便文件交换,建议使用7zip为压缩/解压缩工具(7zip可以直接生成tar包),用WinImage实现Windows环境与软件映像交换文件。 9、实验系统下 .profile中加入了几个命令,请读者注意。 10、若实验环境的启动盘被破坏,请用压缩包中的bootimage-0.11-hd覆盖对应文件即可。 11、若实验环境的要命文件系统被破坏,请用压缩包中的hdc-0.11-new.img覆盖对应文件即可。 2014-5-4 cyfx2288
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值