计算机的启动过程
首先BIOS是什么?
-
BIOS是一个程序, 这个程序是写死到主板上面的一个存储芯片中, 这个存储芯片在没有通电时也能够记录数据, 这就是只读存储器(Read Only Memory, ROM).
-
但由于电脑的发展,BIOS程序代码也需要适度修改,所以现在的BIOS都是写入类似闪存或者EEPROM中。
-
BIOS掌握系统硬件的详细信息和启动设备的选择.
早期的BIOS搭配MBR的启动过程
-
按下电源键, 计算机首先会读取BIOS程序.
-
BIOS程序首先会进行硬件自检, 即检查计算机硬件是否满足运行的基本条件.
-
硬件自检完成后, BIOS把控制权转交给下一阶段的启动程序。
这时,BIOS需要知道,“下一阶段的启动程序"具体存放在哪一个设备。也就是说,BIOS需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做"启动顺序”(Boot Sequence)。
打开BIOS的操作界面,里面有一项就是"设定启动顺序"。
-
BIOS按照"启动顺序",把控制权转交给排在第一位的储存设备。
-
这时,计算机读取该设备的第一个扇区,也就是读取最前面的512个字节。如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,控制权于是被转交给"启动顺序"中的下一个设备。
-
早期Linux为了兼容Windows的磁盘, 使用的是支持Windows的MBR(Master Boot Record, 主引导记录)的方式来处理启动引导程序和分区表. 而启动引导程序记录区和分区表都放在磁盘的第一个扇区. 所以第一个扇区的512个字节会有这三个东西:
- 主引导记录(MBR): 可以安装启动引导程序的地方, 有446个字节
- 分区表: 记录整块硬盘分区的状态, 有64个字节
- 主引导记录签名(0x55和0xAA): 2个字节
-
加载MBR中的启动引导程序, 启动引导程序(boot loader)的目的是加载(load)内核文件, 由于启动引导程序是操作系统在安装的时候所提供的, 所以它会认识硬盘内的文件系统格式, 因此就能够读取内核文件, 然后内核文件开始启动操作系统.
-
如果分区表为GPT格式的话, BIOS也能够从LBA0的MBR兼容区块读取第一阶段的启动引导程序代码, 如果你的启动引导程序支持GPT的话, 那么BIOS同样可以读取到正确的操作系统内核.
-
启动引导程序(Boot loader)的主要任务:
- 提供选项: 用户可以选择不同的启动选项, 这也是多重引导的重要功能
- 加载内核文件: 直接指向可使用的程序区段来启动操作系统
- 转交其他启动引导程序: 将启动管理功能转交给其他启动引导程序负责(启动引导程序除了可以安装在MBR之外, 还可以安装在每个分区的启动扇区(boot sector))
新的UEFI搭配GPT的启动过程
-
因为BIOS其实不懂GPT, 还要通过GPT提供兼容模式才能够读写这个磁盘设备, 而且BIOS仅是16位的程序与现阶段的操作系统接轨方面有点弱, 所以就有了UEFI的产生
-
UEFI主要是想要取代BIOS这个固件接口
-
与BIOS相比,UEFI使用模块化理念,它可以加载ESP分区中的EFI应用程序和EFI驱动程序,支持安全启动、GUI等新功能. 只需要把操作系统的引导程序做成一个EFI应用程序就可以使用UEFI加载引导了,如果存在多个操作系统,只需要在UEFI引导界面选择相应的程序就行了。
UEFI的启动流程
- 首先系统开机,随后UEFI 固件被加载,并由它初始化启动要用的硬件。随后启动UEFI引导管理器,它将通过NVRAM中定义的配置决定如何加载UEFI驱动和UEFI可执行文件。已启动的UEFI应用还可以启动其他应用比如bootloader或者启动内核及initramfs,我们只要把操作系统的bootloader做成一个EFI可执行文件,放入EFI分区对应的目录就可以使用UEFI读取启动了。
参考资料 :
-
<<鸟哥的Linux私房菜>>
-
网络博客