3. UEFI启动流程概览
UEFI规范把固件从加电到把控制权交给操作系统内核的整个过程,划分为若干职责明确的阶段。理解这些阶段的边界、执行顺序和交接内容,是后续做ATF对接、移植和安全启动改造的基础。本节先建立一张“全局地图”,把SEC、PEI、DXE、BDS、TSL、RT、AL七个阶段串起来,再逐段说明关键任务与常见误区。
核心记忆点:SEC找入口,PEI搭骨架,DXE装驱动,BDS选启动,TSL交内核,RT供服务,AL收尾清理。前四个阶段属于“启动期”,TSL是“交接点”,RT和AL是“运行期与退出期”。
一、核心原理:为什么需要分阶段
UEFI分阶段设计的本质是“逐层抽象、逐层解耦”。加电瞬间CPU处于实模式或平坦模式,内存尚未初始化,能做的事情极其有限;而操作系统需要的是一个已经枚举好设备、准备好控制台、拥有完整运行时服务的环境。如果把这些工作全部塞进一个阶段,代码将无法维护,也无法适配不同芯片平台。
因此,UEFI把启动过程切成若干“可交接”的阶段,每个阶段只解决自己最擅长的问题,并通过标准数据结构把成果传给下一阶段。最典型的就是HOB(Hand-Off Block):PEI阶段把内存布局、固件卷位置、CPU信息等打包成HOB列表,DXE阶段直接读取,无需重新探测。这种“成果传递”机制是UEFI可移植性的关键。
二、方法流程:七个阶段的执行顺序与关键任务
下面按执行顺序逐段说明。注意:SEC、PEI、DXE、BDS属于启动服务期(Boot Services),TSL是过渡点,RT和AL属于运行期。
- SEC(Security Phase,安全阶段):从CPU复位向量开始,建立临时RAM(Cache as RAM),验证PEI入口的完整性,处理复位原因,最后跳转到PEI入口。它是整个信任链的起点。
- PEI(Pre-EFI Initialization,早期初始化):完成永久内存初始化(Memory Init),发现固件卷(FV),构建HOB列表,最后把控制权交给DXE核心(DXE Core)。
- DXE(Driver Execution Environment,驱动执行环境):调度DXE驱动按依赖顺序执行,建立协议数据库(Protocol Database),枚举PCI等总线设备,安装控制台、存储、网络等基础服务。
- BDS(Boot Device Selection,启动设备选择):根据启动策略加载启动项,执行启动管理器,提供用户交互界面(如启动菜单),最终选择并加载OS加载器。
- TSL(Transient System Load,临时系统加载):OS加载器运行阶段,调用ExitBootServices()终止启动服务,把系统表、内存映射等传递给OS内核,然后跳转到内核入口。
- RT(Runtime,运行时):OS运行期间,固件仍提供运行时服务,如变量读写(GetVariable/SetVariable)、时间服务、复位服务等。
- AL(After Life,退出后):系统关机或复位后的清理阶段,释放运行时资源,完成最终收尾。
三、案例/场景:一次典型启动的日志观察
在QEMU或真实平台上开启UEFI调试日志,可以看到阶段切换的明确标记。下面是一段简化后的串口日志片段:
SEC: Entry point at 0xFFFFFFF0
SEC: Temporary RAM initialized
PEI: Memory Init Start
PEI: HOB list created at 0x7A000000
PEI: DXE Core dispatched
DXE: Protocol database initialized
DXE: PCI enumeration complete
BDS: Boot manager started
BDS: Boot option 0001 selected
TSL: ExitBootServices() called
TSL: Handing off to OS kernel at 0x80000000
RT: Runtime services available
从日志可以清晰看到:SEC负责入口和临时RAM,PEI完成内存初始化和HOB构建,DXE完成协议和总线枚举,BDS选择启动项,TSL调用ExitBootServices并移交内核。这条链路正是后续做ATF对接时需要逐段确认的“交接点”。
四、误区与复盘
常见误区一:把BDS当成“启动OS”。BDS只负责选择并加载OS加载器,真正移交内核发生在TSL阶段。BDS结束时,启动服务仍然可用。
常见误区二:认为RT阶段固件已经“退出”。RT阶段固件仍驻留内存,提供运行时服务。只有调用ExitBootServices后,启动服务才终止,但运行时服务继续存在。
复盘建议:调试启动问题时,先确认当前处于哪个阶段。SEC/PEI问题通常表现为“无串口输出”或“内存初始化失败”;DXE问题多为“驱动加载失败”或“协议未安装”;BDS问题多为“启动项找不到”;TSL问题多为“ExitBootServices返回错误”。定位阶段,才能选对工具。
五、阶段职责速查表
| 阶段 | 核心职责 | 关键产出 | 交接对象 |
|---|---|---|---|
| SEC | 建立临时RAM,验证入口 | 临时运行环境 | PEI入口 |
| PEI | 内存初始化,发现固件卷 | HOB列表 | DXE Core |
| DXE | 驱动调度,协议数据库 | 协议与服务 | BDS |
| BDS | 启动策略,选择启动项 | OS加载器 | TSL |
| TSL | 终止启动服务,移交内核 | 系统表与内存映射 | OS内核 |
| RT | 提供运行时服务 | 变量、时间、复位 | OS运行期 |
| AL | 退出清理 | 资源释放 | 系统结束 |