1.2.3 加载第三部分代码—system模块(1)

来源:互联网 发布:和合期货软件下载 编辑:程序博客网 时间:2024/05/17 15:35

1.2.3 加载第三部分代码—system模块(1)

第二批代码已经载入内存,现在要加载第三批代码。仍然是使用BIOS提供的int 0x 13h中断,如图1-11所示,方法与图1-9所示的方法基本相同。

 图1-11 再次调用int 0x 13h中断

接下来bootsect程序就要执行第三批程序的载入工作,即将系统模块载入内存。

从底层技术上看,这次载入与前面的setup程序的载入没有本质的区别。比较突出的是这次加载的扇区数是240,是之前4个扇区的60倍,且所需时间也是之前的几十倍。为了防止加载期间用户误认为是机器故障,而执行不适当的操作,Linus在此设计了显示一行屏幕信息“Loading system ...”以提示用户计算机此时正在加载系统。值得注意的是,此时操作系统的main函数还没有开始执行,在屏幕上显示一行字符串远没有用C语言写一句printf(“Loading system ...\n”)调用那么容易,所有工作都要靠一行一行的汇编代码来实现,从体系结构的角度看,显示器也是一个外设,所以还要用到其他的BIOS中断。这些代码比较多,对理解操作系统的启动原理没有特别直接的帮助,只要知道大意就可以了。我们真正需要掌握的是:bootsect借着BIOS中断int 0x 13h,将240个扇区的system模块加载进内存。加载工作主要是由bootsect调用read_it子程序完成的,这个子程序将软盘第6扇区开始的约240个扇区的system模块加载至内存的SYSSEG(0x10000)处往后的120KB空间中。图1-12中对system模块所占用的内存空间给出了形象的说明。

 图1-12 加载system模块

由于是长时间操作软盘,所以需要对软盘设备进行更多的监控,需要不断地对读盘结果进行检测,因此read_it后续的调用步骤比较多,但读盘工作最终是由0x13对应的中断服务程序完成的。

到此为止,第三批程序已经加载完毕,整个操作系统的代码已全部载入内存。bootsect的主体工作已经做完了,还有一点小事,就是要再次确定一下根设备号,如图1-13所示。

经过一系列检测,得知软盘为根设备,所以就把根设备号保存在root_dev中,这个根设备号作为机器系统数据之一,将在第2章中讲到的“根文件系统加载”中发挥关键性的作用。

小贴士

根文件系统设备(Root Device):Linux 0.11使用Minix操作系统的文件系统管理方式,要求系统必须存在一个根文件系统,其他文件系统挂接其上,而不是同等地位。Linux 0.11没有提供在设备上建立文件系统的工具,故必须在一个正在运行的系统上利用工具(类似FDISK和Format)做出一个文件系统并加载至本机。故Linux 0.11的启动需要两部分数据,即系统内核镜像和根文件系统。

注意,这里的文件系统指的不是操作系统内核中的文件系统代码,而是有配套的文件系统格式的设备,如一张格式化好的软盘。

 图1-13 确认根设备号
0 0
原创粉丝点击