第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。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐