4. ATF启动流程概览

ARM Trusted Firmware(ATF,现称 TF-A)把整个启动过程拆成若干可独立编译、独立签名、独立加载的镜像阶段,用 BL(Boot Loader)编号来标识。理解这些阶段的职责边界与交接顺序,是后续做 UEFI 与 ATF 对接、排查“卡在 BL31”“BL33 起不来”这类问题的前提。本节先建立整体时序与镜像布局的全局视图,再逐阶段展开。

一、核心原理:为什么要把启动切成多级

ATF 采用多级启动的根本原因有三点。第一是安全边界隔离:不同镜像运行在不同的异常级别(EL)和安全状态下,BL1 运行在 EL3 安全态,BL31 常驻 EL3,BL32 运行在 EL1 安全态,BL33 运行在 EL1 非安全态。第二是职责单一化:BL1 只负责最基础的信任根与镜像校验,BL2 负责平台初始化与后续镜像加载,BL31 负责运行时服务与安全世界切换,BL32 提供安全 OS 服务,BL33 才是真正的通用引导程序(如 UEFI)。第三是可替换性:BL32 可以是 OP-TEE,也可以为空;BL33 可以是 U-Boot,也可以是 UEFI,ATF 通过标准接口与它们解耦。

关键点:BL1 是信任根(Root of Trust),它之后加载的每一个镜像都必须经过签名校验,校验链从 BL1 一直延伸到 BL33,这就是“信任链传递”。

二、各阶段职责与镜像布局

下面这张图展示了 ATF 各阶段的执行顺序、异常级别归属以及镜像之间的加载关系,是本节最核心的全局视图。

ATF 启动时序与镜像加载关系 EL3(安全态,最高特权) BL1 ROM 固化 / 信任根 校验并加载 BL2 BL2 平台初始化 / 加载 BL31 加载 BL32、BL33 BL31 运行时服务 / PSCI 常驻 EL3 EL1 安全态 BL32 OP-TEE / 安全 OS EL1 非安全态 BL33 UEFI / U-Boot 镜像布局要点 • BL1 通常固化在 Boot ROM 或片上 SRAM,不可修改,是信任根 • BL2 位于 Flash 的 FIP(Firmware Image Package)中,由 BL1 校验后加载到 SRAM • BL31、BL32、BL33 可打包在同一 FIP 中,由 BL2 解析并分别加载到各自运行地址 • BL31 常驻内存不退出,BL32 与 BL33 通过 SMC 指令与 BL31 交互

从图中可以看到,BL1 与 BL2 是“一次性”的加载器,执行完就交出控制权;BL31 则常驻 EL3,是后续所有安全监控调用(SMC)的入口。BL32 和 BL33 是并列关系,分别运行在安全态和非安全态的 EL1,二者通过 BL31 进行世界切换。

三、启动时序与交接细节

上电后,CPU 从复位向量开始执行,通常就是 BL1 的入口。BL1 完成最基础的时钟、串口初始化后,从存储介质读取 BL2 镜像,校验签名,然后跳转到 BL2。BL2 承担了最繁重的平台初始化工作:DDR 初始化、MMU 页表建立、FIP 解析、镜像加载。BL2 把 BL31、BL32、BL33 分别搬到运行地址后,跳转到 BL31。

BL31 初始化运行时服务框架、中断控制器、PSCI 服务,然后根据编译配置决定是否先进入 BL32。如果启用了 BL32,BL31 会跳转到 BL32 入口,BL32 完成自身初始化后再通过 SMC 返回 BL31;随后 BL31 跳转到 BL33,也就是 UEFI 或 U-Boot 的入口。至此,ATF 的使命基本完成,控制权交给通用引导程序。

典型启动日志片段(串口输出):

NOTICE:  BL1: v2.10.0(debug):a1b2c3d
NOTICE:  BL1: Booting BL2
NOTICE:  BL2: v2.10.0(debug):a1b2c3d
NOTICE:  BL2: Booting BL31
NOTICE:  BL31: v2.10.0(debug):a1b2c3d
NOTICE:  BL31: Initializing runtime services
NOTICE:  BL31: Preparing for EL3 exit to normal world
NOTICE:  BL31: Next image: BL33
NOTICE:  BL33: UEFI firmware starting...

四、各阶段职责对照清单

阶段 异常级别 核心职责 典型存放位置 是否常驻
BL1 EL3 信任根、校验并加载 BL2 Boot ROM / SRAM 否
BL2 EL3 平台初始化、FIP 解析、加载 BL31/32/33 Flash FIP 否
BL31 EL3 运行时服务、PSCI、SMC 处理、世界切换 Flash FIP 是
BL32 EL1 安全态 安全 OS 服务(如 OP-TEE) Flash FIP 是
BL33 EL1 非安全态 通用引导程序(UEFI / U-Boot) Flash FIP 是

五、常见误区与排查思路

误区一:认为 BL2 会一直运行。实际上 BL2 只是加载器,跳转到 BL31 后其内存可被复用。
误区二:把 BL33 当成 ATF 的一部分。BL33 是独立工程(UEFI 或 U-Boot),ATF 只负责跳转过去。
误区三:忽略 BL32 可选性。未启用 OP-TEE 时,BL31 会直接跳到 BL33,日志中不会出现 BL32。

排查启动问题时,最有效的手段是打开 ATF 的 VERBOSE 日志,观察串口输出停在哪一级。如果停在 BL1 之后没有 BL2 日志,通常是 FIP 打包错误或签名校验失败;如果 BL31 打印了 “Preparing for EL3 exit” 却没有 BL33 输出,则要检查 BL33 的入口地址和镜像是否被正确加载。掌握各阶段的边界,就能快速定位问题所在的镜像。

实战建议:在 BL2 中打印 FIP 解析出的各镜像加载地址与大小,与链接脚本中的地址对照,可以提前发现绝大多数“跳转后跑飞”的问题。