2. 固件与启动基础

在嵌入式与服务器启动领域,术语繁多且容易混淆。理解这些术语的定位、职责与相互关系,是后续进行 UEFI 与 ATF 对接实战的前提。本节从“谁负责什么、在什么阶段运行、彼此如何衔接”三个角度,梳理固件与启动链路中的核心概念。

一、核心原理:从 BIOS 到 UEFI,从 BootROM 到 TF-A

BIOS(Basic Input/Output System)是传统 x86 平台上的固件接口标准,负责上电自检、硬件初始化和引导操作系统。它运行在 16 位实模式,接口封闭、扩展性差,逐渐被 UEFI 取代。

UEFI(Unified Extensible Firmware Interface)是 BIOS 的现代替代者,定义了固件与操作系统之间的标准接口。UEFI 固件通常以 32/64 位保护模式运行,支持模块化驱动、图形化界面、安全启动(Secure Boot)和丰富的启动服务(Boot Services)与运行时服务(Runtime Services)。在服务器和 PC 上,UEFI 固件往往就是平台启动的第一段可执行代码;但在 ARM 嵌入式平台,UEFI 通常作为“后续阶段”被 TF-A 加载。

ATF(Arm Trusted Firmware)是 ARM 官方提出的可信固件参考实现,后更名为 TF-A(Trusted Firmware-A)。它实现了 ARM 的 Trusted Board Boot 要求,负责安全启动、异常等级切换、PSCI 电源管理以及安全与非安全世界的隔离。TF-A 是 ARM 平台上电后真正意义上的“固件骨架”。

TF-A 将启动过程划分为多个 Boot Loader Stage(BL 阶段),每个阶段有明确的运行位置和职责:

  • BL1:运行于片上 ROM(BootROM)或受信任的 SRAM,是上电后执行的第一段 TF-A 代码。负责最基础的平台初始化、建立信任根、验证并加载 BL2。
  • BL2:运行于 SRAM,负责初始化 DDR、加载并验证后续镜像(BL31、BL32、BL33),是启动链的“调度中心”。
  • BL31:运行于安全内存,是 EL3 运行时固件(Runtime Firmware),提供 PSCI、SMC 处理和安全监控服务,系统启动后常驻。
  • BL32:运行于安全世界,通常是 OP-TEE 等安全操作系统(TEE OS),提供可信执行环境。
  • BL33:运行于非安全世界,通常是 U-Boot、UEFI 固件或直接是操作系统引导程序,是启动链的“最终交付对象”。
关键理解:BL1→BL2→BL31/BL32/BL33 不是简单的顺序执行,而是“信任链逐级传递 + 多镜像并行加载”的组合。BL2 负责把 BL31、BL32、BL33 都加载到内存,再由 BL31 完成 EL3 初始化后,跳转到 BL33 或 BL32。

二、方法流程:典型 ARM 平台启动时序

以一颗典型的 ARMv8 服务器或嵌入式芯片为例,上电后的启动流程如下:

  1. 芯片上电,CPU 从 BootROM 固定地址取指,执行厂商固化的初级引导代码。
  2. BootROM 加载 BL1 到 SRAM,BL1 建立信任根并验证 BL2。
  3. BL2 初始化 DDR 控制器,将 BL31、BL32、BL33 从 Flash 加载到 DDR 对应位置。
  4. BL2 跳转到 BL31,BL31 完成 EL3 运行时环境搭建。
  5. BL31 根据配置决定是否先进入 BL32(安全 OS),再返回 EL3。
  6. BL31 跳转到 BL33(UEFI 或 U-Boot),进入非安全世界。
  7. BL33 作为 UEFI 固件继续执行,加载操作系统引导程序(如 GRUB、systemd-boot)。

下面是一段典型的 TF-A 编译输出镜像列表,可帮助理解各 BL 阶段的产物:

NOTICE:  BL1: v2.10(debug):v2.10
NOTICE:  BL1: Built : 10:23:45, Jan  1 2025
NOTICE:  BL2: v2.10(debug):v2.10
NOTICE:  BL2: Built : 10:23:47, Jan  1 2025
NOTICE:  BL31: v2.10(debug):v2.10
NOTICE:  BL31: Built : 10:23:50, Jan  1 2025
NOTICE:  BL32: v2.10(debug):v2.10
NOTICE:  BL33: U-Boot 2024.01

三、案例/场景:UEFI 与 TF-A 的对接位置

在 ARM 服务器上,UEFI 固件通常就是 BL33。TF-A 完成 BL31 初始化后,把控制权交给 UEFI,UEFI 再负责 ACPI 表生成、PCIe 枚举、启动项管理和 OS 加载。此时 UEFI 不再承担“上电第一段代码”的角色,而是作为“非安全世界的引导环境”。

在嵌入式场景中,BL33 也可能是 U-Boot。U-Boot 负责加载 Linux 内核和设备树,而 UEFI 则可能作为 U-Boot 的一个 payload 或独立固件存在。理解 BL33 的“可替换性”,是理解 UEFI 与 ATF 对接的关键。

对接实战中,最常见的修改点包括:BL2 的镜像加载地址、BL31 的入口参数、BL33 的入口地址,以及 UEFI 侧对 TF-A 传递的硬件描述(如 FDT、ACPI)的解析。

四、误区/复盘:常见混淆点

  • 误区一:UEFI 就是 BIOS 的升级版。 实际上 UEFI 是接口规范,BIOS 是具体实现;UEFI 可以运行在 ARM 上,而传统 BIOS 只存在于 x86。
  • 误区二:ATF 和 TF-A 是两个东西。 ATF 是旧称,TF-A 是 Arm 官方现在的项目名,二者指同一套代码。
  • 误区三:BL1 一定在 BootROM 里。 BL1 可以烧录在 BootROM,也可以放在 Flash 由 BootROM 加载,取决于芯片设计。
  • 误区四:BL31 只在启动时运行。 BL31 是运行时固件,系统运行期间一直驻留在 EL3,处理 PSCI 和 SMC 调用。

下表汇总了各术语的定位与典型运行位置,便于快速对照:

术语 全称/含义 典型运行位置 核心职责
BIOS Basic Input/Output System x86 实模式 上电自检、传统引导
UEFI Unified Extensible Firmware Interface 32/64 位保护模式 标准固件接口、启动服务、安全启动
TF-A Trusted Firmware-A(原 ATF) EL3/S-EL1 安全启动、PSCI、世界切换
BL1 Boot Loader Stage 1 BootROM/SRAM 信任根、加载 BL2
BL2 Boot Loader Stage 2 SRAM DDR 初始化、加载后续镜像
BL31 Boot Loader Stage 3-1 安全内存(EL3) 运行时固件、PSCI、SMC
BL32 Boot Loader Stage 3-2 安全世界(S-EL1) 可信 OS(如 OP-TEE)
BL33 Boot Loader Stage 3-3 非安全世界(EL2/EL1) UEFI/U-Boot,引导 OS

掌握这些术语的定位与衔接关系后,后续分析 UEFI 与 TF-A 的接口、镜像布局和启动参数时,就能快速判断“问题出在哪一级、由谁负责”。

ARM 平台固件启动链路:从 BootROM 到 UEFI BootROM 厂商固化代码 BL1 信任根 / SRAM BL2 DDR 初始化 / 加载 BL31 EL3 运行时固件 BL32 安全 OS(OP-TEE) S-EL1 BL33 UEFI / U-Boot 非安全世界 加载 跳转/切换 BL33 内部:UEFI 固件职责 SEC/PEI 早期初始化 DXE 驱动调度 BDS 启动项选择 TSL OS 加载 BootROM BL1 BL2 BL31 BL32 BL33