4. UEFI启动流程总览

UEFI规范把从平台加电到操作系统接管的整个过程划分为若干“阶段”(Phase)。这些阶段并不是简单的代码分段,而是具有明确职责边界、内存模型、可调用服务和交接契约的工程结构。理解阶段划分,是读懂固件启动日志、定位启动卡死、编写DXE驱动以及设计BDS策略的前提。

核心记忆线索:SEC 建栈 → PEI 找内存 → DXE 装服务 → BDS 选启动项 → TSL 交控制权 → RT 常驻服务 → AL 收尾。前四个阶段属于“启动服务期”,后两个阶段属于“运行时服务期”。

一、阶段划分与阶段目标

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。

UEFI 启动阶段推进与交接主线 SEC 可信根 / 临时RAM 复位向量处理 PEI 永久内存初始化 构建 HOB DXE 驱动调度 / 协议 BS + RT 服务表 BDS 控制台 / 启动项 启动策略选择 TSL 移交 OS Loader ExitBootServices HOB List(PEI → DXE 交接) 内存 / 资源 / 平台信息,只读传递 Protocol 数据库(DXE 内部) 驱动通过 Handle Protocol 发布/消费 启动服务期(Boot Services) • SEC / PEI / DXE / BDS / TSL 顺序推进 • 提供内存分配、事件、协议、镜像加载 • ExitBootServices() 后大部分服务失效 • 是驱动开发和启动调试的主战场 • 典型日志:SEC→PEI→DXE→BDS→TSL 运行时服务期(Runtime Services) • RT 与 DXE/BDS/TSL 并行存在 • 变量读写、时间、复位、胶囊更新 • OS 运行期仍可调用,需常驻内存 • AL 阶段完成 ACPI/SMM 等最终交接 • 典型日志:RT 服务注册、AL 收尾

三、典型启动日志与阶段识别

在真实平台上,串口日志会按阶段输出标记。下面是一段简化后的启动日志片段,可用于快速判断当前处于哪个阶段:

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。

排障口诀:看最后一条阶段日志,判断卡在哪个交接点。SEC卡住查复位向量和临时RAM;PEI卡住查内存初始化和HOB;DXE卡住查驱动依赖和协议;BDS卡住查启动项和控制台;TSL卡住查ExitBootServices条件。

五、常见误区与复盘

  • 误区一:把RT和AL当成独立时间段。RT服务在DXE阶段就已注册,AL是OS接管后的收尾动作,二者与启动阶段并行存在。
  • 误区二:认为BDS只是“显示菜单”。BDS还负责连接控制台、枚举启动项、执行启动策略,是启动策略的决策中心。
  • 误区三:忽略HOB的只读性。HOB由PEI构建后,DXE只能读取,不能修改。需要传递可变信息应使用Protocol或变量服务。
  • 误区四:在TSL之后继续调用Boot Services。ExitBootServices()之后,Boot Services内存可能被回收,继续调用会导致不可预期行为。
工程提醒:编写DXE驱动时,必须明确自己依赖的Protocol是否已在当前阶段发布;编写PEIM时,必须确认所需PPI是否已由前序PEIM安装。阶段顺序不是建议,而是硬性契约。