01_UEFI启动流程
第1章 UEFI启动流程(Boot Flow)
1.1 原学习内容
UEFI 启动流程描述的是一台机器从上电到进入操作系统的完整生命周期。
核心主线:
Power On
↓
SEC
↓
PEI
↓
HOB
↓
DXE
↓
BDS
↓
TSL
↓
RT
↓
OS
后续所有知识点,例如 HOB、Protocol、Handle、Driver Binding、Variable、Boot Option,本质上都依附在这条启动链上。
1.2 学习目标
本章要解决几个问题:
- 机器上电后最先执行什么代码?
- 内存什么时候可用?
- UEFI 驱动什么时候加载?
- Windows Boot Manager 是谁启动的?
ExitBootServices()为什么是 UEFI 与 OS 的分界点?
1.3 启动流程总览
SEC 阶段
SEC 是 Security Phase,主要任务是建立最小执行环境。
核心职责:
建立最基础 CPU 运行环境
建立临时内存,例如 Cache As RAM
验证或定位下一阶段 PEI 入口
特点:
代码少
执行时间短
功能最基础
可以理解为:
SEC = 把 CPU 叫醒,让 CPU 有能力继续往下跑
PEI 阶段
PEI 是 Pre-EFI Initialization,主要负责早期平台初始化。
核心职责:
CPU 初始化
芯片组初始化
DRAM 初始化
发现 Firmware Volume
创建 HOB
加载 DXE Foundation
可以理解为:
PEI = 把机器点亮,把最重要的硬件资源准备出来
PEI 最重要的成果是:
DRAM 可用
资源信息明确
HOB List 创建完成
DXE 可以启动
HOB 阶段
HOB 是 PEI 和 DXE 之间的交接机制。
PEI 阶段初始化出的信息,例如内存区域、FV 位置、CPU 信息、资源描述等,需要传递给 DXE。
因此 PEI 会创建 HOB List,DXE Core 启动后解析 HOB List。
一句话:
HOB = PEI 写给 DXE 的交接单
DXE 阶段
DXE 是 Driver Execution Environment,是 UEFI Framework 最核心的阶段。
核心职责:
加载 DXE Driver
建立 Handle Database
建立 Protocol 生态
枚举 PCI / USB / SATA / NVMe 等设备
执行 Driver Binding
提供 Boot Services
可以理解为:
DXE = 建设完整的 UEFI 驱动运行环境
这一阶段会让存储、文件系统、显卡、USB、网络等设备逐渐可用。
BDS 阶段
BDS 是 Boot Device Selection,启动设备选择阶段。
核心职责:
读取 BootOrder
读取 Boot####
解析 Device Path
选择启动设备
调用 LoadImage()
调用 StartImage()
启动 OS Loader
可以理解为:
BDS = 根据启动项决定启动谁
例如:
Windows Boot Manager
Linux GRUB
UEFI Shell
自定义 EFI Application
TSL 阶段
TSL 是 Transient System Load,主要指操作系统加载器运行的阶段。
例如 Windows 环境下:
BDS 启动 bootmgfw.efi
↓
Windows Boot Manager 运行
↓
准备加载 Windows Kernel
RT 阶段
RT 是 Runtime 阶段。
当 OS Loader 调用:
gBS->ExitBootServices(ImageHandle, MapKey);
之后,UEFI Boot Services 失效,OS 接管内存、设备和中断。
但部分 Runtime Services 仍保留,例如:
GetVariable()
SetVariable()
GetTime()
ResetSystem()
UpdateCapsule()
1.4 源码讲解
Boot Services 示例
DXE、BDS、UEFI Shell App 阶段常见代码:
gBS->LocateProtocol(...);
gBS->InstallProtocolInterface(...);
gBS->LocateHandleBuffer(...);
gBS->CreateEvent(...);
gBS->LoadImage(...);
gBS->StartImage(...);
这些都属于 Boot Services,通常只能在 ExitBootServices() 之前调用。
Runtime Services 示例
Runtime 阶段常见代码:
gRT->GetVariable(...);
gRT->SetVariable(...);
gRT->GetTime(...);
gRT->ResetSystem(...);
这些属于 Runtime Services,在 OS 启动后仍可能被系统调用。
1.5 ChatGPT 讲解
UEFI 启动流程可以理解为一场接力赛:
SEC = 把 CPU 叫醒
PEI = 把机器点亮
HOB = PEI 给 DXE 的交接单
DXE = 建设驱动和服务生态
BDS = 选择启动目标
TSL = OS Loader 接管
RT = OS 运行后保留少量 UEFI 服务
重点不是死记缩写,而是理解每个阶段解决的问题。
1.6 标准答案
UEFI 启动流程由 SEC、PEI、HOB、DXE、BDS、TSL、RT 和 OS 阶段组成。
SEC 负责建立最小执行环境;PEI 负责完成早期硬件初始化,尤其是内存初始化,并通过 HOB 向 DXE 传递信息;DXE 负责加载驱动、建立 Handle 和 Protocol 生态;BDS 负责根据 BootOption 选择启动设备并启动 OS Loader;OS Loader 调用 ExitBootServices() 后,Boot Services 失效,系统进入 Runtime 阶段,仅保留部分 Runtime Services。
1.7 纠正点
误区 1:DXE 负责启动 Windows
不准确。
正确理解:
DXE 负责建立环境
BDS 负责选择并启动 Windows Boot Manager
误区 2:PEI 负责加载所有驱动
错误。
PEI 主要做早期初始化。真正大规模驱动加载和设备枚举发生在 DXE 阶段。
误区 3:ExitBootServices 后还能调用 gBS
错误。
ExitBootServices() 之后 Boot Services 生命周期结束,不能再调用 gBS->LocateProtocol()、gBS->AllocatePool()、gBS->CreateEvent() 等 Boot Services。
1.8 总评
重要程度:★★★★★
面试频率:★★★★★
实战关联:★★★★★
理解难度:★★☆☆☆
本章是整个 UEFI 学习的总纲。只要启动流程没搞清楚,后面的 HOB、Protocol、Variable、BootOption 都会变成零散知识点。
1.9 总结
UEFI 启动流程可以理解为系统从上电到进入操作系统的完整生命周期。首先 SEC 阶段建立最小执行环境,随后 PEI 完成 CPU、芯片组和内存等早期初始化,并通过 HOB 将平台信息传递给 DXE。DXE 阶段加载驱动并建立 Handle 和 Protocol 生态,是 UEFI Framework 的核心阶段。之后 BDS 根据 BootOrder 和 BootOption 选择启动设备,通过 LoadImage 和 StartImage 启动 OS Loader。最后 OS Loader 调用 ExitBootServices,将控制权交给操作系统,只保留 Runtime Services。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)