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 启动流程概览 UEFI 启动流程概览 1. 上电 / Reset 2. SEC(安全验证) 3. PEI(内存初始化) 4. DXE(驱动执行) 5. BDS(启动设备选择) 6. TSL / RT(OS 加载) SEC → PEI → DXE → BDS → TSL → RT,共 6 个阶段,每个阶段都有明确职责

这张图里,从按下电源到操作系统接管,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 位实模式、缺乏安全机制等。