Monday, April 30, 2007

IBM PC的系统引导过程之我见

在阅读了不少资料后(越来越觉得HK的网络爽了!——其实可能只是内地不好而已……我要求不高阿……只要能看到wikipedia和大多数外文技术网站就好了……),终于对IBM PC的引导过程有了一定的了解,这里写一篇综述以备忘。
-------------------------------------------------------
首先介绍一下所谓的“引导”的历史。Bootstrapping一词来源于一个德国传说-_-!!!
一位叫Baron Münchhausen的大哥声称能抓着头发,自己把自己提起来……后来黑客们引用这个词语(后来简称为booting了)来比喻计算机启动过程——这是一个鸡与蛋的问题!究竟是先有鸡还是先有蛋?对,计算机的启动过程也是这样。大家都知道,计算机运行的是程序,而程序是装载在内存中的。计算机必须以操作系统为用户接口运行,计算机刚刚启动时,内存中没有任何操作系统,要把操作系统装入内存,本身就要有一个可以执行这个动作的程序阿……这就造成了paradox.

因此,人们想到,可以利用boot loader这样一种程序来加载OS。N年前,还是打孔机时代时,程序员通过手动输入程序到内存中来启动计算机……现在则好多了,使用boot loader可以完成这些任务。通过多级的引导,boot loader一级一级引导程序,最终引导操作系统。


事实上,操作系统(这里都是以IBM PC为例,不同架构可能不同,比如Apple)引导的过程是这样的。基于IBM PC架构的机器都会有BIOS,一个嵌入在主板中的芯片,使用CMOS存储某些程序与信息以完成开机后的“加电自检”,Power On Self Tesing,POST,作用是检测各功能部件,如内存,显卡等。然后,读入MBR——Master Boot Record。
这是一个512字节的扇区,位于可引导存储介质的第一个扇区。这个扇区结构如下:



根据上表,可以看到,该512字节扇区的内部结构,其中也指定了一个磁盘只能有4个分区!因为只有64个字节分配给分区表,而每个分区表占了16字节,因此只有4个。

对于每个磁盘/软盘,或其他可引导存储介质。都必须有一个主引导扇区,因为BIOS加电自检后自动装载这个扇区。但是如果有很多磁盘或软盘或光驱呢?因此在BIOS里有一个启动有限选项可以选择。BIOS逐个检测这些启动介质,知道检测到合法的启动介质。观察512字节中的01FE和01FF字节,可以发现,这是所谓的MBR签名。固定的AA55H标识了这个是一个合法的引导扇区!这是一个段的最后两个字节,硬件就是靠它们来区别这个段是否为引导扇区。这就是
所谓的“第一阶段引导”。如果没有操作系统怎么办?那么就会显示:Please Insert a bootable disc and press a key"这是引导扇区(boot sector)显示的,而不是机器的固件。

接下来,在4个主分区中,只有一个被标识为“活动分区”。BIOS通过检测4个分区表进入这个活动分区,读入这个活动分区的第一个扇区。此时控制权交给了该段扇区存储的程序。这个扇区也称为“分区引导记录”(partition boot record)。分区引导记录实际上是另一个“第一阶段引导程序”。但是它能够从这个分区装载一组代码,这些新代码称为“第二阶段引导程序”,然后进行“第二阶段的引导”。对于GRUB,它在MBR写入第一阶段引导程序(最多前446个字节),然后通过这个第一阶段引导程序跳入活动分区的第二阶段引导程序。此时,已经没有512字节限制了!这时再由第二阶段引导程序载入操作系统内核。对于DOS等老式OS,一般是自己载入自己,即loader本身就在操作系统里面。而对于windows,linux等,则由GRUB,LILO,NTLDR等经过几个阶段的引导再装入自己(kernel).

在linux中,可以使用
dd if=/dev/hda of=mbr.bin bs=512 count=1
来生成MBR的镜像。

-------------------------------------------------------
参考资料:
  1. Booting词条from wikipedia
  2. MBR词条from wikipedia
  3. From Power Up to Bash Prompt链接
  4. LPI 证书 101 考试准备: Linux 安装与包管理 from IBM developerWorks

No comments: