4. UEFI启动流程总览
UEFI规范把从平台加电到操作系统接管的整个过程划分为若干“阶段”(Phase)。这些阶段并不是简单的代码分段,而是具有明确职责边界、内存模型、可调用服务和交接契约的工程结构。理解阶段划分,是读懂固件启动日志、定位启动卡死、编写DXE驱动以及设计BDS策略的前提。
一、阶段划分与阶段目标
UEFI PI规范定义的阶段包括SEC、PEI、DXE、BDS、TSL、RT、AL。它们按时间顺序推进,但RT与AL并非独立的时间段,而是与DXE/BDS/TSL并行存在的“服务生命周期”概念。
| 阶段 | 核心目标 | 典型执行环境 | 关键交接物 |
|---|---|---|---|
| SEC | 建立可信根、初始化临时内存、处理复位向量 | Cache As RAM,无系统内存 | SEC Core、PEI Core入口、临时RAM |
| PEI | 发现并初始化永久内存,构建HOB列表 | 临时RAM + 早期永久内存 | HOB List、PEI Services、DXE IPL PPI |
| DXE | 加载DXE驱动,建立Boot Services与Runtime Services | 完整系统内存 | DXE Core、协议数据库、BS/RT表 |
| BDS | 连接控制台、枚举启动项、选择启动设备 | Boot Services可用 | Boot Policy、启动项、OS Loader |
| TSL | 将控制权转交OS Loader或OS内核 | Boot Services仍可用 | ExitBootServices()调用 |
| RT | 提供OS运行期可调用的固件服务 | OS运行期 | Runtime Services表 |
| AL | 固件在OS接管后完成自身收尾 | OS运行期 | ACPI、SMM等交接完成 |
二、阶段间交接:HOB、PPI与Protocol
阶段之间不能靠全局变量传递信息,因为各阶段的内存模型和可执行环境不同。PI规范为此设计了三类交接机制:
- HOB(Hand-Off Block):PEI向DXE传递内存、资源、平台信息的只读数据块,是PEI阶段最重要的输出。
- PPI(PEIM-to-PEIM Interface):PEI阶段内部模块之间的接口,通过PEI Services注册和定位。
- Protocol:DXE阶段及之后的服务抽象接口,通过Boot Services的Handle Protocol机制发布和消费。
三者的关系可以概括为:PEI用PPI组织内部协作,用HOB把结果交给DXE;DXE用Protocol组织驱动协作,用Boot Services和Runtime Services把能力交给BDS和OS。
三、典型启动日志与阶段识别
在真实平台上,串口日志会按阶段输出标记。下面是一段简化后的启动日志片段,可用于快速判断当前处于哪个阶段:
SEC: 0x00000000 Reset Vector
PEI: PEI Core Entry
PEI: HOB List @ 0x7A000000
PEI: Memory Init Done, 8GB
DXE: DXE Core Entry
DXE: Loading Driver 0x1A2B3C4D
DXE: Boot Services Available
BDS: Connect Console
BDS: Boot Manager Menu
BDS: Boot Option #1 -> UEFI Shell
TSL: ExitBootServices() called
RT: Runtime Services still active
AL: ACPI tables handed off
看到“PEI Core Entry”说明SEC已完成;看到“HOB List”说明PEI正在向DXE交接;看到“Boot Services Available”说明DXE已建立服务;看到“ExitBootServices() called”说明TSL已执行,系统即将进入OS运行期。
四、案例:一次启动卡死的阶段定位
某服务器上电后无显示,串口停在“PEI: Memory Init Done”之后,没有出现“DXE Core Entry”。这说明SEC和PEI前半段正常,问题出在PEI向DXE交接环节。排查方向包括:HOB List是否完整、DXE IPL PPI是否成功发布、永久内存是否被正确标记为可用。最终发现是内存训练参数错误导致HOB中可用内存范围为空,DXE Core无法加载。修复内存参数后,日志顺利推进到BDS。
五、常见误区与复盘
- 误区一:把RT和AL当成独立时间段。RT服务在DXE阶段就已注册,AL是OS接管后的收尾动作,二者与启动阶段并行存在。
- 误区二:认为BDS只是“显示菜单”。BDS还负责连接控制台、枚举启动项、执行启动策略,是启动策略的决策中心。
- 误区三:忽略HOB的只读性。HOB由PEI构建后,DXE只能读取,不能修改。需要传递可变信息应使用Protocol或变量服务。
- 误区四:在TSL之后继续调用Boot Services。ExitBootServices()之后,Boot Services内存可能被回收,继续调用会导致不可预期行为。