BIOS和UEFI的启动项

  • BIOS一律指传统BIOS,
  • UEFI BIOS一律称呼为UEFI。
  • UEFI下的BIOS设置,一律称为UEFI设置。

传统BIOS:

一句话概括:BIOS只认识设备,不认识分区、不认识文件。

BIOS启动的时候,按照CMOS设置里的顺序,挨个存储设备看:(此处不讨论PXE和光盘)
这个存储设备的前512字节是不是以0x55 0xAA结尾?
不是,那就跳过。找下一个设备。
是的话,嗯,这个磁盘可以启动,加载这512字节里的代码,然后执行。
执行之后,后面的事,几乎就跟BIOS没啥关系了。
至于后面启动什么系统,取决于这512字节里存了谁家的代码。这个代码是各家的系统安装程序写进去的,目的是启动自家系统。

比如你装(或者重装)了Windows,这里面就变成了Windows的启动代码。
比如你装(或者重装)了Linux,这里面就会变成Grub的启动代码。
顺便这512字节包含了MBR分区表的信息。但是有人可能注意到,上面半句没提“系统装在哪个分区上了”,硬盘有几个分区。

其实BIOS并不认识分区表。哪怕磁盘上没有分区表,没分过区,只要前512字节有0x55 0xAA的结尾,有合适的引导代码,也是能启动的。

UEFI

一句话概括,UEFI认识设备,还认识设备ROM,还认识分区表、认识文件系统以及文件。

UEFI启动的时候,经过一系列初始化(SEC、CAR、DXE什么的,SEC、CAR你们不需要懂。下一节里会说DXE阶段是干嘛的)
然后按照设置里的顺序,找启动项。启动项分两种,设备启动项和文件启动项:
·文件启动项,大约记录的是某个磁盘的某个分区的某个路径下的某个文件。对于文件启动项,固件会直接加载这个EFI文件,并执行。类似于DOS下你敲了个win.com就执行了Windows 3.2/95/98的启动。文件不存在则失败。
·设备启动项,大约记录的就是“某个U盘”、“某个硬盘”。(此处只讨论U盘、硬盘)对于设备启动项,UEFI标准规定了默认的路径“\EFI\Boot\bootX64.efi”。UEFI会加载磁盘上的这个文件。文件不存在则失败。

UEFI启动后,进入了DXE阶段,就开始加载设备驱动,然后UEFI就会有设备列表了。 对于其中的磁盘,UEFI会加载对应的驱动解析其中的分区表(GPT和MBR)。然后UEFI就会有所有分区的列表了。然后UEFI就会用内置的文件系统驱动,解析每个分区。然后UEFI就会认识分区里的文件了。比如“\EFI\Boot\bootX64.efi”。

至于这个EFI文件会干嘛,主板是不管的。 但是随着Windows8.x,以及UEFI标准2.x,推出了一个叫做SecureBoot的功能。开了SecureBoot之后,主板会验证即将加载的efi文件的签名,如果开发者不是受信任的开发者,就会拒绝加载。 比如CloverX64.efi就好像没有签名。

一个磁盘分区,要格式化之后,才能往里存文件,格式化的时候,又能选择不同的文件系统。 比如Win10可以选FAT32、NTFS、exFAT、ReFS几种,Linux可以选ext2、ext3、ext4、FAT32等,macOS可以选FAT32、HFS+、APFS、exFAT几种。

驱动

  1. 其实每个操作系统,都会有文件系统驱动,然后才能读取某种文件系统。 比如Windows带了上述四种文件系统等驱动,Linux带了FAT32、ext等文件系统等驱动,macOS带了上述四种驱动以及NTFS等只读驱动。
  2. 设备也是一样的。 原版的WinXP只带了IDE驱动,没有SATA驱动;原版Win7只带了IDE和SATA驱动,没带NVMe驱动;Win8/Win10则带了IDE/SATA和NVMe三种驱动;macOS10.12带了SATA驱动以及苹果专用NVMe磁盘的驱动;macOS10.13带了SATA和标准NVMe驱动。

UEFI作为一个模糊了固件和操作系统界限的东西,作为一个设计之初就考虑到了扩展性的东西,它也是有驱动程序的。启动过程中的DXE阶段,全称叫Driver eXecution Environment,就是加载驱动用的。

首先各种PCI-E的设备,比如显卡,比如PCI-E的NVMe固态硬盘,都有固件。
其中支持UEFI的设备,比如10系列的Nvidia显卡,固件里就会有对应的UEFI的驱动。

作为UEFI标准里,钦定的文件系统,FAT32.efi是每个主板都会带的。所有UEFI的主板都认识FAT32分区。这就是UEFI的Windows安装盘为啥非得是FAT32的。 除此之外,苹果的主板还会支持hfs分区。如果某天Linus Torvalds推出了主板,我猜这主板一定会带EXT4.efi,哈哈哈哈哈。

EFI系统分区

UEFI规范里,在GPT分区表的基础上,规定了一个EFI系统分区(EFI System Partition,ESP),ESP要格式化成FAT32,EFI启动文件要放在“\EFI\<厂商>”文件夹下面。

比如Windows的UEFI启动文件,都在“\EFI\Microsoft”下面。
比如Clover的东西,全都放在“\EFI\Clover”下面。

但是Apple比较特殊,它的主板直接去HFS/APFS分区找启动文件。然而即便如此,Mac的ESP里还是会有一堆Apple的文件。

这一节的最后,再说说“\EFI\Boot”这个文件夹。这个文件夹,放谁家的程序都行。无论是“\EFI\Microsoft\Boot\Bootmgfw.efi”,还是“\EFI\Clover\CloverX64.efi”,只要放到“\EFI\Boot”下并且改名“bootX64.efi”,就能在没添加文件启动项的情况下,默认加载对应的系统。

Windows 8/8.1/10在UEFI和BIOS下,各种启动文件的顺序

windowsBoot

按照前文说的,BIOS加载某个磁盘MBR的启动代码,这里特指Windows的引导代码,这段代码会查找活动分区(BIOS不认识活动分区,但这段代码认识活动分区)的位置,加载并执行活动分区的PBR(另一段引导程序)。 Windows的PBR认识FAT32和NTFS两种分区,找到分区根目录的bootmgr文件,加载、执行bootmgr。

bootmgr没了MBR和PBR的大小限制,可以做更多的事。它会加载并分析BCD启动项存储。而且bootmgr可以跨越磁盘读取文件了。所以无论你有几个磁盘,你在多少块磁盘上装了Windows,一个电脑只需要一个bootmgr就行了。

bootmgr会去加载某磁盘某NTFS分区的“\Windows\System32\WinLoad.exe”,后面启动Windows的事就由WinLoad.exe来完成了。

EFI启动盘和Windows启动盘

根据前文说的,UEFI启动项分为文件启动项和设备启动项。

通常情况:主板UEFI初始化,然后找到了默认启动项“Windows Boot Manager”。里面写了bootmgfw.efi的位置。固件加载bootmgfw.efi。bootmgfw.efi根据BCD启动项存储,找到装Windows的磁盘的具体分区,加载其中的WinLoad.efi。由WinLoad.efi完成剩下的启动工作。

其中的虚线,根上面的一样,意思是,Windows启动盘和EFI启动盘,可以是一个硬盘,也可以是不同的硬盘。所以对于UEFI来说,启动盘是bootmgfw.efi所在的那个盘。

MBR && GPT

整块磁盘的第一个扇区特别重要,因为它记录了整块磁盘的重要信息。

早期磁盘第一个扇区里面含有的重要信息我们称为MBR(master boot record),但是由于近年来磁盘的容量不断扩大,造成读写上的一些困扰,甚至有些2TB以上的磁盘分区已经无法让操作系统读取,因此后来多了一个新的磁盘分区格式,称为GPT(GUID partition table),这两种分区格式与限制有所不同。

BIOS模式下的Windows只允许被装在MBR分区表下面。UEFI模式下的Windows只允许被装在GPT分区下。但事实上,MBR分区表,也能启动UEFI模式下的Windows。