Home > 未分类 > [原创]内核引导启动程序分析

[原创]内核引导启动程序分析

April 28th, 2005

主要参考用书:《linux内核完全分析》
由于比较简单,所以先把bootsect.s看了一下,其实整个内核引导程序有三个,分别是bootsect.s,setup.s,head.s ,前两个都不属于严格意义上的kernel,只不过是对kernel的启动做一些准备,真正的内核是从head.s启动的,现在先分析 bootsect.s:

当你按机箱上的power on的时候,cup会自动去到bios中地址0xFFFF0处开始执行bios中的代码,除了会进行一些初始化工作,这段代码最主要的是将可启动设备的第 一个扇区(bootsect.s)(引导扇区,512字节)读到内存0×07c00处。

当bootsect.s执行时,它已经被读到了0×07c00处,首先它会将自己读到0×90000处,为什么要先读到0×7c00,再读到 0×90000,是由于bios被设置成了先读到0×7c00的地方,再度到0×90000是为了防止后来读入到0×10000处的system模块覆盖 掉bootsect.s。将自己读到0×90000处后先会设置一下堆栈(0×9000:0xff00),然后将setup.s读入到紧接着 bootsect的地方(0×90200),默认的是从软盘读取的(硬盘在当时估计是奢侈品),然后就是取相应磁盘(被当作软盘,写成了hard code)的参数,然后就是利用bios的0×10中断,ah=0×03,将一段话”Loading system…”打印到屏幕上。然后检测要使用哪个根文件系统设备(软盘或者硬盘),具体的方法是判断508,509字节处的根设备号是否被置为1.
问题一.508,509是什么时候设置的?

如果有硬盘的话,就将其保存,否则读取每磁道的扇区数来判断是什么类型的软盘(1.2M还是1.4M),也保存。
问题二.这里硬盘参数ROOT_DEV=0×306,意思是第二个硬盘的第一个分区,为什么是第二个硬盘?

问题三.在这之前的代码都是软盘启动的,是不是就是说,不管你有没有硬盘,都必须从软盘启动,如果不修改bootsect的代码的话

最后执行 jmpi 0,SETUPSEG,跳转到setup.s程序的开始处执行。

未分类

  1. No comments yet.
  1. No trackbacks yet.