从开机到加载操作系统计算机究竟干了啥?

2019-07-13 23:09发布

学习了前辈的一篇博客,并加入了自己的感悟。 整个启动和加载过程可分为若干步骤,或者称为若干个状态,或者快照,下面的每一段都是描述一个快照。(类似自动状态机)   1、电源稳定(POWER GOOD   按下启动键后,电源首先启动。为了保证安全使用,电源的设计采取了许多保护措施,所以电源从起振到稳定有一定的延迟。电源各部分(各输入电压和输出电压等)稳定后,会分别发送一个检测信号,此信号电压为高时表示稳定。所有检测信号都为高时,就产生一个POWERGOOD信号传送给主板。如果主板接收不到该信号,时钟芯片会一直向cpu发送RESET信号(等同于按下重启键),这样cpu就不会工作。       2CPU电压稳定   CPU的VID0-VID3引脚,使CPU工作电压与时钟信号匹配。       3CPU跳转到BIOS程序   CPU预编程,使CPU执行0XFFFF0H处的JUMP指令,从而跳转到BIOS(basic input/output system)程序(不同的BIOS,所在地址不同)。(其内容集成在微机主板上的一个ROM芯片上,主要保存着有关微机系统最重要的基本输入输出程序,系统信息设置、开机上电自检程序和系统启动自举程序等)       4CPU执行POSTpower on self-test上电自检)   BIOS首先进行的就是上电自检,用来检测各硬件设备工作状态是否正常。BIOS厂商对每一个设备都给出了检测代码(POST CODE,即开机自我检测代码),对某一个设备进行检测时,首先将检测代码发送到80H检测端口,检测通过后,再发送下一个设备的检测代码进行检测。如果检测失败,检测代码会留在80H端口,检测程序也会停止,并根据预先设定好的警报声(此时显卡还未初始化,不能显示)进行报警(BIOS厂商对不同的设备定义了不同的报警声,我们可以根据报警声的不同来判断故障,Intel POST相关)。       5、初始化   包括创建中断向量表(中断向量表:处理各种中断的中断处理程序的入口地址表。中断:分为强制性中断和自愿性中断,强制性中断例如 硬件故障中断、时钟中断、控制台中断、程序性中断(算数溢出、除以零、企图执行一些非法的机器指令或访问的地址超过了用户存储器空间)这些。一旦出现这些中断计算机无法再继续处理手头的工作,因为这些中断太严重了;自愿性中断:CPU收到中断信号之后,能够进行分析后决定处不处理这些中断,例如I/O引起的中断。一般要通过中断优先级来决定,如果不处理这些中断,那么就叫做中断屏蔽。中断处理的阶段分为:保存现场上下文、找到中断源判断中断原因、转到中断处理程序、恢复现场。)、设置寄存器、对一些外部设备(显卡等)进行初始化和检测,其中最重要的是BIOS的设置,主要是对硬件参数的设置。初始化完毕,如果硬件配置发生变化,会进行ESCD更新。ESCD是BIOS和操作系统交换硬件配置信息的一种方法,它保存在CMOS中。       6BIOSCMOS设定的顺序启动相应设备       7、寻找活动分区   假设操作系统放在硬盘上,在启动硬盘后并不知道硬盘里有什么,一个硬盘有几个区,每个区都可能有操作系统,要想启动操作系统,就必须找到存放操作系统的区。所以,对待硬盘,所有的BIOS都先读取硬盘的0磁头0柱面1扇区,这里存放着主引导记录MBR(Main bootrecord ),该扇区称为主引导扇区。BIOS将控制权交给MBR,来找到并加载操作系统。   要了解如何找到活动分区,首先必须了解主引导扇区的结构。   主引导扇区是0磁头0柱面1扇区,磁头和柱面都是从0计数,扇区则从1计数。0磁头0柱面1扇区是第一物理扇区。该扇区共512字节,分为三部分。第一部分是MBR,存放程序,大小是446字节,范围是0-445字节(0x00H -0x1BDH);第二部分是磁盘分区表DPT(DiskPartition table),大小为64字节,范围是446-509字节(0x1BEH-0x1FDH);第三部分是结束标志,大小为2字节,范围是510-511字节(0x1FEH-0x1FFH),其值一般为0xAA55H   MBR里有启动代码和数据,不同的bootloader启动代码不同,但不论如何,分区表的结构都是相同的,所以先介绍一下分区表。   分区表可以容纳四个分区的信息,(四个分区至少有一个主分区,最多有一个扩展分区,扩展分区进而又能划分为多个逻辑分区,逻辑分区也就是我们看到的D盘、E盘等。让我们产生一种有多个磁盘的错觉)每个分区占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程序的作用是先检查分区表是否完好,然后找到活动分区(将要启动的操作系统所在的分区),并将控制权交给活动分区的系统引导程序。(简单一点来讲,BIOS做好检查、初始化工作,找到MBR,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用来引导不同系统:GNU GRUB 和GRUB是GRand Unified Bootloader的缩写,它是一个多重操作系统启动管理器。用来引导不同系统,如windows,linux。   8、加载内核和操作系统