计算机启动和操作系统加载小话
整个启动和加载过程可分为若干步骤,或者称为若干个状态,或者快照,下面的每一段都是描述一个快照。(类似自动状态机)
1、电源稳定(POWER GOOD)
按下启动键后,电源首先启动。为了保证安全使用,电源的设计采取了许多保护措施,所以电源从起振到稳定有一定的延迟。电源各部分(各输入电压和输出电压等)稳定后,会分别发送一个检测信号,此信号电压为高时表示稳定。所有检测信号都为高时,就产生一个POWER GOOD信号。如果主板接收不到该信号,时钟芯片会一直向cpu发送RESET信号(等同于按下重启键),这样cpu就不会工作。
2、CPU电压稳定
CPU的VID0-VID3引脚,使CPU工作电压与时钟信号匹配。
3、CPU跳转到BIOS程序
CPU预编程,使CPU执行0XFFFF0H处的JUMP指令,从而跳转到BIOS(basic input/output system)程序(不同的BIOS,所在地址不同)。
4、CPU执行POST(power on self-test 上电自检)
BIOS首先进行的就是上电自检,用来检测各硬件设备工作状态是否正常。BIOS厂商对每一个设备都给出了检测代码(POST CODE,即开机自我检测代码),对某一个设备进行检测时,首先将检测代码发送到80H检测端口,检测通过后,再发送下一个设备的检测代码进行检测。如果检测失败,检测代码会留在80H端口,检测程序也会停止,并根据预先设定好的警报声(此时显卡还未初始化,不能显示)进行报警(BIOS厂商对不同的设备定义了不同的报警声,我们可以根据报警声的不同来判断故障,Intel POST相关)。
5、初始化
包括创建中断向量表、设置寄存器、对一些外部设备(显卡等)进行初始化和检测,其中最重要的是对BIOS的设置,主要是对硬件参数的设置。初始化完毕,如果硬件配置发生变化,会进行ESCD更新。ESCD是BIOS和操作系统交换硬件配置信息的一种方法,它保存在CMOS中。
6、BIOS按CMOS设定的顺序启动相应设备
7、寻找活动分区
假设操作系统放在硬盘上,在启动硬盘后并不知道硬盘里有什么,一个硬盘有几个区,每个区都可能有操作系统,要想启动操作系统,就必须找到存放操作系统的区。所以,对待硬盘,所有的BIOS都先读取硬盘的0磁头0柱面1扇区,这里存放着主引导记录MBR(Main boot record ),该扇区称为主引导扇区。BIOS将控制权交给MBR,来找到并加载操作系统。
要了解如何找到活动分区,首先必须了解主引导扇区的结构。
主引导扇区是0磁头0柱面1扇区,磁头和柱面都是从0计数,扇区则从1计数。0磁头0柱面1扇区是第一物理扇区。该扇区共512字节,分为三部分。第一部分是MBR,存放程序,大小是446字节,范围是0-445字节(0x00H - 0x1BDH);第二部分是磁盘分区表DPT(Disk Partition table),大小为64字节,范围是446-509字节(0x1BEH-0x1FDH);第三部分是结束标志,大小为2字节,范围是510-511字节(0x1FEH-0x1FFH),其值一般为0xAA55H。
MBR里有启动代码和数据,不同的boot loader启动代码不同,但不论如何,分区表的结构都是相同的,所以先介绍一下分区表。
分区表可以容纳四个分区的信息,每个分区占16个字节。每个分区的16个字节表示的信息如下:
第0个字节:引导字节。80H代表活动分区,00H代表非活动分区;
第1-3个字节:本分区的起始扇区。最低位字节(第一个字节)代表磁头号,次高位字节的低6位代表扇区号,次高位字节的高2位和最高位字节的8位表示柱面号。
第4个字节:分区类型符。
00H——代表该分区未用(即没有指定)
01H——FAT12基本分区
04H——FAT16基本分区
06H——big FAT16基本分区
0BH——FAT32基本分区
05H——扩展分区
07H——NTFS分区
0FH——(LBA模式)扩展分区
83H——linux分区
第5-7个字节:本分区的结束扇区。结构类似开始分区;
第8-11个字节:本分区起始扇区距该分区的分区表所在扇区的扇区数之差;
第12-15个字节:本分区的总扇区数;
下面介绍DOS下引导操作系统的过程。注意:MBR程序的作用是找到活动分区(将要启动的操作系统所在的分区),并将控制权交给活动分区的系统引导程序。
1)BIOS把主引导扇区的512字节拷贝到内存的0:7c00H(为了和软盘的拷贝位置一致,BIOS自动完成此拷贝)处,将控制交给MBR代码。
2)MBR把512个字节搬移到0:600处,为之后活动分区引导程序留出空间。
3)MBR检查依次检测四个分区表的第一个字节,若为80H,则继续检测其他分区表确保只有一个活动分区,否则会发生错误;若为00H,则继续检测其他分区,若四个分区检查完毕,仍没有检测到活动分区,说明没有可以启动的分区,则调用INT 18H进入ROM BASIC(一种程序解释器,可以自己编写BASIC程序运行)。
4)找到活动分区后,根据分区表中分区起始位置等信息,读取该分区第一个扇区的内容到0:7c00H,将控制全交给该活动分区引导程序。该引导程序将加载内核,内核会加载操作系统。
Grub主引导扇区暂留。
8、加载内核和操作系统