UEFI 是什么?
UEFI - Unified Extensible Firmware Interface
从规范的角度来看,它是一个规范,定义了计算机操作系统和平台固件之间的接口规范.
从实体的角度来讲,BIOS 和 UEFI 是两种不同类型的计算机固件(什么是固件?就是固化在计算机主板上某个非易失存储区(EEPROM)中的小系统),计算机启动都是先启动它,然后加载真正的操作系统,计算机启动后进入配置界面,我们能直观看到的是 UEFI 固件的 UI,我们通过 UI 来配置这个固件的可配置项,比如:操作系统启动顺序,启动等待时间等等,在 BIOS 时代,所有的设置都只能存储在主板上,容量很小,无法扩展,而 UEFI 将基础固件烧制在主板存储区中,然后在磁盘上创建 EFI 系统分区来存储更多的内容和数据,通过 UEFI 规范来定义如何使用扩展的方式来定制和扩展功能。
EFI 系统分区
我们知道在 UEFI 之前的 BIOS 时代,操作系统的 bootlloader 是存放在主引导记录(MBR)中的,容量受限,所以 UEFI 中引入了一个新的系统分区 ESP (EFI System Partition) ,该分区用来存储操作系统的 bootloader 和 EFI 驱动程序等数据,当计算机启动后,UEFI 固件从该分区中加载所需要的硬件驱动,执行 bootloader 启动指定的操作系统。在 Windows 系统中默认该分区不可见,可以参照 如何查看 EFI 分区内容 查看 EFI 分区中的内容。
EFI 可执行文件
UEFI 标准定义了一种可执行文件格式,所有的 UEFI 固件都能够执行以这种格式编写的代码,操作系统 bootloader 都采用这种格式编写,比如 Windows 10 64位操作系统的 bootloader 叫做 bootx64.efi,该文件存放在 EFI 系统分区的 Boot 文件夹下,如果一台机器上安装了多个厂商的操作系统,他们的 bootloader 都位于 EFI 系统分区的 Boot 目录中,UEFI 就是通过执行这个 bootloader 来启动指定的操作系统。
GPT 分区表
GUID 分区表格式与 UEFI 规范具有密切联系,而且,它并不特别复杂,GPT 是 UEFI 规范提供的良好基础架构之一。GPT 仅仅是分区表的一种标准(磁盘起始位置的信息定义了磁盘所包含的分区)。相比 MBR/MS-DOS 分区表,这种分区表对分区的定义要好得多,并且 UEFI 规范要求 UEFI 兼容固件必须能识别 GPT(也要求固件能识别 MBR,以保证向后兼容)。
BIOS 如何启动
在了解 UEFI 启动之前,我们看一下 BIOS 的启动过程,BIOS 启动过程非常简单,你需要在第一块磁盘上有一个 MBR(主引导记录,这是一个标准,它定义了一种格式来描述该磁盘分区,并在特定的地方包含一个 boot loader),BIOS 通过加载 MBR 中的这段 boot loader 代码去启动操作系统,操作系统安装程序负责在系统安装过程中将 boot loader 代码写入到 MBR 中的特定区域。
从 BIOS 的启动过程中我们可以看出,BIOS 方案存在以下问题:
- 处理不便,你需要特殊工具来写入 MBR,如果要查看 MBR 中包含的内容,唯一的方法几乎就是把 MBR dump 出来,然后进行检查
- MBR 容量受限,无法容纳现代操作系统的 bootloader
- 无法实现从其他启动目标来启动系统,比如:网络启动
- 固件层以上的其他层(比如在操作系统中)无法配置固件的启动行为,BIOS 没有提供相应机制
UEFI 如何启动
UEFI 规范定义了一个 boot manager, 它是一个固件策略引擎,可以灵活配置,通过下图的对比图可以看到 UEFI 的启动过程。整个流程没有什么神奇的地方,主要的优势是灵活性和可配置型以及可定制的安全性。
Secure Boot
安全启动解决的问题就是 rootkit 攻击问题。
UEFI 规范规定了固件可以包含一系列签名,并拒绝运行未签名或签名与固件中包含的签名不一致的 EFI 可执行文件,通俗地讲,安全启动就是使用非对称加密和数字签名技术来确保整个启动链的安全,所有不合法的 UEFI 执行程序和驱动程序都不允许执行,这样就解决了操作系统加载前的启动安全问题。当然这是一个可选项,用户可以在 UEFI 配置界面关闭 Secure Boot。