1. UEFI 概述:从 BIOS 到 UEFI,我们到底在聊什么?
各位同学好。我是老张,在固件这行摸爬滚打了十几年。今天咱们开始第一课,先把地基打牢。
很多人一听到 UEFI,第一反应就是“哦,新版的 BIOS”。其实这么说不太准确。UEFI 和 BIOS 虽然都是负责把硬件拉起来、把操作系统交出去的那层固件,但它们的思路完全不同。我当年从 BIOS 转到 UEFI 项目时,第一个感觉就是:这玩意儿怎么这么复杂?后来才明白,复杂是为了解决 BIOS 解决不了的问题。
UEFI 与 BIOS 的区别:不只是换了个名字
咱们先看一张对比表,把核心差异说清楚。
| 对比维度 | 传统 BIOS | UEFI |
|---|---|---|
| 接口 | 16 位实模式,中断调用 | 32/64 位保护模式,函数表(Protocol) |
| 磁盘分区 | MBR(最大 2TB,4 个主分区) | GPT(最大 9.4ZB,128 个分区) |
| 启动方式 | 读取 MBR 中的引导代码 | 直接读取 FAT 分区中的 .efi 文件 |
| 驱动模型 | Option ROM,固定地址 | UEFI Driver Model,动态加载 |
| 安全机制 | 几乎没有 | Secure Boot,签名验证 |
| 用户界面 | 文本菜单,键盘操作 | 支持图形界面,鼠标操作 |
| 网络支持 | 需要额外 PXE ROM | 内置 UEFI Network Stack |
说白了,BIOS 是 80 年代的设计,那时候硬盘才几十兆,没人想到会有 2TB 以上的硬盘,也没人想到需要图形界面。UEFI 是站在 21 世纪的角度重新设计的。
我个人的经验:有一次调试一块服务器主板,BIOS 死活认不出 3TB 的硬盘。客户说“你们这固件是不是有问题?”其实不是固件的问题,是 MBR 分区表天生只支持 2TB。换成 UEFI + GPT,问题立刻解决。所以现在新出的主板,基本都默认 UEFI 模式了。
UEFI 规范发展史:从 Intel 到统一标准
UEFI 不是一天建成的。它的前身叫 EFI,是 Intel 在 1998 年为了安腾处理器(Itanium)搞的。安腾这玩意儿后来没火起来,但 EFI 这个设计思路留下来了。
- EFI 1.0(1999 年):Intel 内部规范,主要给安腾用。那时候还没人当回事。
- EFI 1.10(2002 年):开始支持 x86 平台。我记得当时 Intel 推得很卖力,但 OEM 厂商不太买账。
- UEFI 2.0(2006 年):统一可扩展固件接口论坛(UEFI Forum)成立,规范改名 UEFI。这是转折点。
- UEFI 2.3.1(2011 年):加入 Secure Boot。Windows 8 要求所有认证设备必须支持 Secure Boot,这一下把 UEFI 推到了前台。
- UEFI 2.8(2019 年):加入 HTTP Boot、TLS 支持。说白了,固件也要联网了。
- UEFI 2.10(2022 年):最新的稳定版本,增加了更多安全特性。
一个小技巧:你可以在 UEFI Forum 官网免费下载规范文档。虽然有两三千页,但别怕。我一般只看需要的章节,比如 Boot Manager、Protocol、Secure Boot 这几块。其他内容用到再查。
UEFI 启动流程概览:从按下电源到看到桌面
好,咱们进入重点。UEFI 启动到底是怎么一步步把系统拉起来的?我画了一张流程图,大家先看个整体印象。
这张图里,从按下电源到操作系统接管,UEFI 固件要经历 6 个阶段。咱们一个一个说。
SEC(Security Phase)——安全验证阶段
这是 CPU Reset 后执行的第一个代码。说白了,就是检查固件本身有没有被篡改。我做过一个项目,客户要求必须支持 Intel Boot Guard,就是在 SEC 阶段验证 BIOS 的签名。如果签名不对,直接死机。嗯,这里要注意:SEC 阶段连内存都还没初始化,代码只能在 CPU 缓存里跑。
PEI(Pre-EFI Initialization)——内存初始化阶段
这个阶段的核心任务只有一个:把内存(DRAM)初始化好。PEI 阶段由一个个 PEIM(PEI Module)组成,它们像搭积木一样,先把 CPU、芯片组、内存控制器初始化,然后找到内存条,训练时序,最后把内存映射出来。为什么这么重要?因为后面的所有代码都需要内存才能跑。
我曾经踩过的坑:有一次调试一块新板子,PEI 阶段总是卡住。查了两天,发现是内存条插槽的走线有问题,导致内存训练失败。后来在 PEI 阶段加了调试打印,才定位到问题。所以,PEI 阶段的调试手段一定要准备好,不然出了问题你都不知道卡在哪。
DXE(Driver Execution Environment)——驱动执行阶段
内存有了,DXE 阶段就开始大展拳脚了。这个阶段会加载各种 UEFI Driver:PCI 总线驱动、USB 驱动、SATA 驱动、NVMe 驱动……说白了,就是把所有硬件都认出来、初始化好。DXE 阶段的特点是:代码可以动态加载,不需要把所有驱动都编译进固件里。这也是 UEFI 比 BIOS 灵活的地方。
BDS(Boot Device Selection)——启动设备选择阶段
硬件都认出来了,接下来要决定从哪个设备启动。BDS 阶段会读取 NVRAM 里的启动顺序(Boot Order),然后挨个尝试。比如先试硬盘,不行再试 U 盘,再不行试网络启动(PXE)。如果所有设备都启动失败,那就进入 UEFI Shell 或者显示“No bootable device”。
TSL(Transient System Load) / RT(Runtime)——操作系统加载与运行时
最后一步,BDS 找到了启动设备,比如硬盘上的 Windows Boot Manager(bootmgfw.efi)。UEFI 固件把这个 .efi 文件加载到内存,然后跳转执行。从这一刻起,操作系统接管了控制权。UEFI 固件进入 Runtime 状态,只提供一些基本服务,比如设置时间、读取 NVRAM 变量。操作系统跑起来之后,UEFI 基本就退居幕后了。
我个人的习惯:调试启动问题时,我喜欢在 BDS 阶段加一个延时,按 F12 进入启动菜单,手动选择设备。这样可以排除 Boot Order 配置错误的问题。很多新手一上来就怀疑驱动有问题,其实往往是启动顺序没设对。
小结一下
这一章咱们聊了 UEFI 和 BIOS 的区别、UEFI 规范的发展历程,以及 UEFI 启动的 6 个阶段。说白了,UEFI 不是 BIOS 的简单升级,而是一次彻底的重新设计。它解决了 BIOS 的很多历史遗留问题,比如 2TB 限制、16 位实模式、缺乏安全机制等。