UEFI 引导与 BIOS 引导在原理上有什么区别

Legacy BIOS 启动原理
旧主板 BIOS 引导程序启动时,将自动搜索和加载硬盘中的第一个扇区(512字节,被称为 MBR 主引导记录)到内存,作为下一级程序来执行,所以各家操作系统都提供了自家的 MBR 引导程序。MBR 只有512字节,太小了,复杂的程序根本放不下,所以各家一般都会另外提供一个二级引导程序(比如磁盘子分区的PBR或文件系统上),让 MBR 程序来加载启动这个更大的二级引导程序,比如 Windows 的 NTLDR、bootmgr 等。
二级引导程序一般是为了实现更复杂的引导,如多系统或加引维护菜单。也不只有操作系统厂家在玩,还有很多第三方也在做同样的事情,来实现比操作系统自带的更为灵活和开放的引导程序,如 Grub、Grub4dos、Plop Boot Manager、WEE 等,不过后两者没有二级引导,他们直接占用硬盘前64个扇区实现一个扩大版的 MBR,而非从文件系统加载二级引导。
UEFI 启动过程
UEFI 是一种新的固件接口标准,相比传统的 BIOS,它更强大、更灵活、更安全、开发和可维护性更好。
当我们的 PC 被按下电源按钮,主板上电后,启动步骤如下:
- SEC 安全启动阶段:运行 NVRAM(靠近南桥的一颗 SPI Flash 芯片)中的 UCODE,以验证固件是否可信。若启用 Secure Boot,会加载证书签名机制,验证固件是否被篡改。
- PEI 预初始化阶段:类似传统 BIOS 上电自检,检查并初始化RAM控制器、时钟、芯片组等外设。一旦内存被初始化,就为加载更复杂的代码做好了准备。
- DXE 驱动执行环境阶段:这是真正的“加载固件”的阶段:加载和初始化 PCIe 、USB 控制器、显卡、NVMe、SATA 控制器等底层硬件驱动,还有 FAT/exFAT文件系统驱动、网络栈(用于PXE启动)等
- BDS 启动设备选择阶段:这是我们最关心的、引导操作系统的重要阶段,它会做以下事情:
- 如果检查到用户按了F8(华硕主板,其它主板不同键),则从 Flash 中加载并显示引导项列表,让用户临时选择一个来启动
- 如果检查到用户按了F4(华硕主板,其它主板不同键),则从U盘的各分区找到 \EFI\BOOT\BOOTx64.EFI 并引导
- 如果没按按键,则读取 Flash 中保存的 BootOrder,并按顺序,依次加载引导项配置的
.efi文件,如 Windows 的 \EFI\Microsoft\Boot\bootmgfw.efi - 如果找不到显式引导项,或所有引导项都启动失败,则尝试后备路径(fallback),加载 ESP 分区的\EFI\BOOT\BOOTx64.EFI
- RT 运行时阶段:引导器开始加载操作系统(如 Linux 的 Grub),UEFI 固件将 OS 引导所需的服务(如图形输出、文件系统访问)导出为 UEFI 运行时服务,同时关闭 Boot Services,将内存映射移交操作系统(graphical 输出转为 kernel 模式)
- 启动操作系统:GRUB 或 Windows Boot Manager 会接管引导流程。一旦操作系统完全接管,就脱离 UEFI 固件流程。在这个过程中,
- GRUB 会加载 kernel + initramfs + device tree + command line
- Windows Boot Manager(bootmgfw.efi)会加载
winload.efi进入 Windows
- 最终阶段:OS 被完全加载,UEFI 完成使命。
- UEFI 固件在系统进入 OS 后“退役”为 background 服务提供者
- 操作系统可以随时调用 UEFI Runtime API(例如查询系统事件日志、修改 Secure Boot key)
所谓 ESP 分区,其实就是一个普通硬盘(U盘、磁盘等)的普通 FAT16 或 FAT32 格式的分区(如果是GPT分区格式,需要指定UUID类型码),这个分区不一定要在硬盘的第一个分区,只是通常我们会安排在第一的位置。我们可以使用任何磁盘分区/格式化工具来创建 ESP 分区,然后手动建立 EFI\BOOT 目录,把某操作系统或第三方引导程序配带的 bootx64.efi 拷贝到 EFI\BOOT 目录,即可完成引导盘的创建,没有任何技巧。因为是 FAT 文件格式,目录和文件名称的大小写随意。
在启动过程中,可以按某个快捷键(如F2、F8,不同主板不一样),列出主板Flash上已预设的可用引导项和U盘、光盘、PXE网络等固定引导项,用户可以临时选择启动哪项。
安全启动
在 UEFI 体系下,引导程序 bootx64.efi 可以做得很大很复杂,关键是还支持安全启动( SecureBoot)。 UEFI 的主板设置中都带有 SecureBoot 选项,用户可以打开或关闭。
SecureBoot 机制可以防止恶意程序(如病毒、后门)的运行。想像一下,作为亿万富豪,某个黑客想监控你的电脑(偷密码或艳照),但现代操作系统的安全机制防得死死的,只要你不作死,黑客完全没有办法。在前 BIOS 时间,黑客还有一个顶级手段,就是改操作系统内核,直接在内核中破坏所有安全防护。但在 UEFI 时代,SecureBoot 把这扇门也关上了。
具体来说,SecureBoot 是一个链式的验正机制,从源头防止黑客更改。电脑刚上电时,CPU 运行的第一级程序是从主板 ROM 芯片上加载的,这是一个硬件的只读芯片,这段主板ROM内置的程序,固化后连厂家都不能改。当主板开启了 SecureBoot 后,它在加载 EFI\BOOT\bootx64.efi 的同时,还会去验证 bootx64.efi 的签名,通过后才会执行它。bootx64.efi 的这一小段签名信息,是厂家使用私钥生成的,任何第三方都不能伪造。grub4dos for UEFI 没有得到厂家的签名,也不可能获取厂家的签名。

