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 固件或直接是操作系统引导程序,是启动链的“最终交付对象”。
二、方法流程:典型 ARM 平台启动时序
以一颗典型的 ARMv8 服务器或嵌入式芯片为例,上电后的启动流程如下:
- 芯片上电,CPU 从 BootROM 固定地址取指,执行厂商固化的初级引导代码。
- BootROM 加载 BL1 到 SRAM,BL1 建立信任根并验证 BL2。
- BL2 初始化 DDR 控制器,将 BL31、BL32、BL33 从 Flash 加载到 DDR 对应位置。
- BL2 跳转到 BL31,BL31 完成 EL3 运行时环境搭建。
- BL31 根据配置决定是否先进入 BL32(安全 OS),再返回 EL3。
- BL31 跳转到 BL33(UEFI 或 U-Boot),进入非安全世界。
- 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 对接的关键。
四、误区/复盘:常见混淆点
- 误区一: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 的接口、镜像布局和启动参数时,就能快速判断“问题出在哪一级、由谁负责”。