计算机的启动过程是一个复杂的过程,我们根据计算机的控制权在哪一部分手上,可以把这一过程划分为以下四个阶段:
BIOS→主引导记录→Boot Loader→操作系统运行
一、BIOS
当电源开关启动后,主板会通电并初始化固件(即芯片集等),而BIOS(Basic Input Output System 基本输入输出系统)的运行代码则早已被刷入集成在主板的ROM芯片中。
通电后会尝试运行CPU,如果CPU运行不正常,则计算机会处于完全死机状态,同时主板会发出蜂鸣声。
初始化CPU寄存器,比如初始化指令指针IP和代码寄存器CS;他们的初始化的值将CPU执行的第一条指令定位到BIOS的启动代码部分
倘若计算机为多处理器或者是多核处理器时,将会动态的选择自引导处理器(BSP)。除了BSP外,剩下的处理器叫做应用处理器(AP)。AP将会停止运行直到他们被内核唤醒激活。
CPU从地址FFFF:0000H处(即复位向量)开始执行指令(CS的初始值为0FFFFH,IP的初始值为0000H),这是一条跳转指令,跳到BIOS的启动代码处并启动BIOS。
BIOS初始化硬件设备
在BIOS中包含有自诊断程序等程序,而启动了BIOS后,BIOS首先检查计算机的硬件能否满足运行的基本要求,即启动硬件自检(Power-On Self-Test POST)。此时计算机会先检测显卡是否有问题,若出现问题则停止BIOS同时发出蜂鸣声警报并死机。检测完显卡后到其他的设备,此时会根据检测结果在显示器上显示硬件设备的信息或错误信息。
二、主引导记录
计算机中可能存在有许多个存储设备,诸如硬盘、可移动硬盘、U盘等等,这些设备按用户预先设置好的优先级安排一个“启动顺序”。BIOS则根据这个顺序将计算机的控制权交给排在第一位的存储设备。
该设备的第一个扇区(即该设备最前面的512个字节),也叫做主引导记录MBR(Master boot record )或引导扇区。引导加载程序(Boot Loader)的代码便存在这个扇区里面。
主引导记录的主要作用是告诉计算机到该存储设备的哪一个位置去找操作系统。
我们知道硬盘可以进行分区,而不同的分区可以安装不同的操作系统,这样我们就必须要让主引导记录知道要将控制权交个哪一个分区。主引导记录中的第447-510字节存储的就是该存储设备的分区表,总长度为64字节。一个硬盘只能分成四个一级分区(主分区),每个主分区的信息需要占用16个字节。这16个字节中的第一个字节表示该分区是否为激活分区,若该字节为0x80则代表该分区为激活分区,要将控制权交给这个分区,因此四个主分区里面只能有一个是激活的。
排在第一位的存储设备得到控制权后,计算机会读取该设备的第一个扇区(即主引导记录),倘若该扇区最后两个字节为0x55和0xAA则表明这个设备可以用于启动;否则将控制权交个“启动顺序”中的下一个设备。
将主引导记录的内容加载到内存位置0 x7c00并跳转到该位置以开始执行MBR中的代码,即运行主引导加载程序
将控制权交给主引导加载程序
三、Boot Loader
主引导加载程序在执行时需要把计算机的控制权交给存储设备的某个分区,好让计算机从该分区启动操作系统,那具体计算机是怎么知道要交个哪个分区呢?这里分为3种启动情况
-
卷引导记录(Volume boot record VBR)
因为四个主分区里面,只有一个是激活分区,所以该情况下计算机会读取激活分区的第一扇区,判断该分区是激活的之后就相当于告诉计算机,操作系统在这个分区里面了。
-
扩展分区和逻辑分区
“扩展分区”指这个分区里面又分成多个区,这种分区里面的分区就叫做“逻辑分区”。计算机通过读取“扩展分区”的第一个扇区(即“扩展引导记录”),该扇区中也有一张64字节的分区表,但最多只有两项(即两个逻辑分区)。接着读取逻辑分区的第一个扇区,再从里面找到下一个逻辑分区的位置。如此下去,扩展分区可以包含无数个逻辑分区。
-
启动管理器
计算器读取“主引导记录”的前446字节的机器码之后,不把控制权交个某一个分区,而是运行“启动管理器”(boot loader),然后由用户选择启动哪一个操作系统
找到激活分区后,加载该分区的引导扇区,然后运行该代码
分区引导扇区完成的工作包括:引导加载程序将处理器从实模式切换到32位保护模式、从硬盘读取内核
四、操作系统运行
操作系统的内核载入内存
此后,不同的操作系统会有不同的动作,但主要还是包含以下几个方面:
加载底层设备驱动程序和所需要的服务
初始化内核
启用登录程序