关于linux 0.11引导

Makefile:

要理清Linux 0.11内核的整个逻辑,首先从makefile入手,该makefile最终生成的文件为Image映像文件:而该映像文件的生成离不开boot/bootsect、boot/setup、tools/system、tools/build这4个文件,本质上就是使用build工具程序将bootsect、setup和system整合到一个文件中,也就是Image,那么本文件中先讨论引导过程,那就先只看bootsect程序;

bootsect.s

bootsect.s,该文件就是生成bootsect执行文件的源程序,是个汇编代码程序,使用的是Intel汇编代码,汇编器是as86和ld86;该程序经过build组装之后,被放置到引导盘的第一个扇区,该被称之为引导扇区,至于该扇区是如何被加载到内存中的,这是BIOS的工作(BIOS的具体操作我也不懂);在机器上电后,计算机首先执行的程序就是BIOS程序,会进行一系列硬件自检、中断表设置等工作,然后将引导扇区加载到0x7C00位置处,且一开始是实地址模式,最终将执行权限交给了0x7C00代码位置,而该位置就是bootsect.s的入口地址start(看源码的时候会发现上面还定义了一些其他内容,但是最终生成的代码就是start处代码在执行文件起始位置);

控制流到达start标号处后,此时的引导扇区位于0x7C00位置,先将引导扇区移动到了0x90000位置处,这是为了之后将system部分直接移动到从0x0物理地址开始的空间,然后更新cs、ds和es段寄存器到0x9000。接着基于BIOS中断加载了setup程序块到0x9000:0x0200(这段程序块是在build进行数据填充的,占用4个扇区空间setup不足的填充了0),而加载到内存中的setup块刚好加载到引导扇区之后,此时共占据了5个扇区[0x90000, 0x90A00);

接着使用BIOS中断提取了一些磁盘参数信息,然后基于BIOS中断打印了该程序中定义字符串msg1(之所以前面执行一次0x03功能是为了先定位一下坐标信息,此处使用ah作为功能号的习惯也通用到了系统调用处,系统调用使用ax作为功能号的参数设置寄存器);

然后执行read_it子程序,说道该子程序的功能,首先还要了解一下build组合bootsect、setup和system三者的具体布局,这个布局就是bootsect占据一个扇区,setup占据之后的4个扇区,然后system占据之后的空间;由于在使用BIOS中断读取软盘参数的时候需要指定软盘磁道、磁头和扇区三个变量,且要读取的扇区很多(0x30000 byte)该,因此子程序实现的功能用到了几个参数,分别是sread、head和track,这三个参数是配合BIOS中断读取扇区用的,分别为扇区、磁头和磁道。另外还有一个sectors,该参数就是上面读取到的磁盘参数(一个磁道上的扇区数);由于磁盘的总扇区块和柱面、磁头、扇区的对照关系,每读取完一个扇区就移动到下一个总扇区块,对应的柱面、磁头、扇区3个变量也需要进行对应修改,然后利用BIOS中断的int 0x13进行扇区读取,那么

对于ok1_read,该子函数为了判断磁道剩余扇区数量是否会超出段剩余空间,超出就要进行读取数量的截断工作;此处有个点就是ax为16 bit数据,然后0 - n对应的值就是n的64K(2^16)补值(-bx == 64K - 1 - bx + 1),bx为在一个段中的偏移值(BIOS中断也是该寄存器存放要放置数据位置),通过计算查看当前段时候可以容纳磁道上剩余扇区数量,如果可以容纳就进入ok2_head判断,不能容纳就裁剪读取数量为刚好存放段中剩余空间数量;
对于ok2_read,就是执行扇区读取,然后更新当前数据放置段、当前磁道、磁头和扇区信息:如果本周期读取扇区后没满一整个磁道扇区,那就说明本周期数据读取扇区数量经过了截断处理,也就是说需要进行换段操作,由于一个段读取数据量为64K,因此换段需要对es递增0x1000;如果没有,说明本周期刚好读取完毕了当前磁道的所有扇区,需要进行当前磁道、磁头和扇区信息修改指向下一个磁道;

然后共读取了0x30000 byte的数据,也就是196K数据到0x10000位置;

接着判断root_dev的有效性,如果根文件系统设备无效的话,就直接死循环;

然后bootsect引导部分就已经使用完毕,接着进入setup程序;

PS:一开始看《操作系统设计与实现》的时候,看了几章,越看越迷茫,感觉太理论了,因此选择了另外一个角度,即《linux内核完全注释》(感谢赵炯先生,除了内核解析本书还有相当量的硬件知识,收获颇丰),看完之后,对实际的内核程序有了一定的认知,内容太过琐碎,难以总结为一个系统,因此开启这个系列,一方面是为了进行一次系统的疏导,另一方面也许有些中二,只是为了证明自己曾经来过;还有一方面,再读完linux 0.11之后,又看了一下linux 0.12,发现内容增加了颇多,感觉前路漫漫,写一下也是为了调整一下心态,之后视情况将之前准备提笔的STL解析也写一下;争取今年写完吧。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值