下面是详细的流程解析:

1. BL2 阶段(可信启动加载器)

  • 职责:BL2 运行在 Trusted SRAM 中,主要负责加载后续阶段的镜像。
  • 动作
    1. BL2 从存储设备(如 Flash)中读取 BL31(EL3 Runtime Software)BL33(Non-trusted Firmware,通常是 U-Boot) 的镜像到内存中。
    2. BL2 填充镜像描述符,告诉系统这些镜像在哪里,入口点是多少。
    3. 跳转:BL2 完成加载后,会直接跳转到 BL31 的入口点。

2. BL31 阶段(EL3 运行时软件 / Secure Monitor)

这是 ARM TrustZone 架构中最核心的部分。

  • 职责:BL31 运行在最高的特权级 EL3。它负责系统安全状态的切换(Secure World 与 Non-secure World 的切换)。
  • 动作
    1. 初始化:BL31 进行 EL3 级别的环境初始化(如设置异常向量表、配置 PSCI 电源管理等)。
    2. 准备跳转:BL31 初始化完成后,它不会“退出”(return)或消亡。它准备好接收来自 BL33(或 Linux)的 SMC(Secure Monitor Call)调用。
    3. 移交控制权:BL31 会恢复 BL33 的上下文(CPU 寄存器状态),然后执行 eret(Exception Return)指令,从 EL3 切换到 EL2(或 EL1),正式跳转到 BL33 (U-Boot)

3. BL31 与 BL33 的关系(关键点)

  • BL31 不是“退出”了:当 BL33 (U-Boot) 或 Linux 内核运行时,如果需要进行安全操作(例如电源管理、TrustZone 服务),它们会触发 SMC 异常,CPU 会立刻暂停当前任务,跳回 BL31 处理。
  • BL31 是常驻的:在整个系统运行期间,BL31 始终驻留在内存中充当“安全监视器”的角色。

4. BL33 阶段

  • 职责:这就是我们常见的 U-Boot(非安全世界的 Bootloader)。
  • 动作:初始化外设、加载 Linux 内核,最终启动操作系统。

流程图解

BL33 (U-Boot) BL31 (EL3 Monitor) BL2 BL33 (U-Boot) BL31 (EL3 Monitor) BL2 5. EL3 环境初始化 (设置向量表、PSCI等) 6. 准备 BL33 的运行环境 (EL2/EL1 上下文) 8. U-Boot 开始运行 加载 Linux 内核 BL31 此时保持静默 等待 SMC 调用 1. 初始化系统 2. 加载 BL31 镜像到内存 3. 加载 BL33 (U-Boot) 镜像到内存 4. 跳转到 BL31 执行 7. 执行 eret 指令 移交控制权给 BL33

总结

你的理解流程是对的:BL2 加载 -> 跳 BL31 -> 跳 BL33

唯一需要修正的概念是:BL31 不会像普通函数那样“退出”,它是系统的“守门员”,在把控制权交给 BL33 后,它依然在后台待命,随时准备处理来自非安全世界的安全请求。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐