ATF (ARM Trusted Firmware) -2:完整启动流程

ARM Trusted Firmware (TF-A/ATF) 完整、详细的冷启动流程,从系统上电到非安全世界操作系统启动的全链路拆解。
整体流程概览
TF-A 采用 链式加载 (Chain Loading) 与 链式验签 架构,流程如下:

系统复位
→ BL1 (ROM)
→ BL2 (Secure EL1)
→ BL31 (EL3)
→ BL32(Secure EL1/TEE)
→ BL33 (Non-secure EL2/EL1)
→ 操作系统启动

在这里插入图片描述

第一阶段:系统复位 (Reset)

触发条件:芯片上电、硬复位(Hard Reset)或软复位(Warm Reset)。

硬件动作
1.CPU 复位向量指向 片内 ROM (Boot ROM) 的固定地址。
2.CPU 初始化为最高特权级:
AArch64:EL3 (Secure Monitor Mode)。
AArch32:Secure Monitor Mode。
3.硬件强制关闭 MMU、Cache,仅使用最基本的片内 SRAM/TCM。

第二阶段:BL1 (Boot Loader Stage 1)

BL1 是固化在芯片 ROM 中的代码(不可修改,是信任根 RoT),由芯片厂商实现(TF-A 仅提供参考代码)。
在这里插入图片描述

核心步骤:

一、最小化硬件初始化

1.初始化CPU 寄存器、Cache 行、基本时钟。
2.初始化片内 SRAM (On-Chip Memory)(此时 DRAM 还未初始化,无法使用)。
3.初始化调试串口(UART)用于输出启动日志(可选)。
先通过链接脚本bl1.ld.S:定义程序入口点为bl1_entrypoint
文件路径:bl1\bl1.ld.S
在这里插入图片描述
通过链接脚本bl1_entrypoint.S中的bl1_entrypoint函数进行跳转到bl1_main主函数,
文件路径:bl1\aarch64\bl1_entrypoint.S
在这里插入图片描述

bl1_main是ARM Trusted Firmware中BL1阶段的主函数,负责初始化硬件、加载下一阶段镜像(如BL2)并准备跳转执行。

在这里插入图片描述
主要功能包括

  1. 平台初始化:设置早期/晚期平台相关配置。
  2. 寄存器管理:初始化EL3及各世界上下文寄存器。
  3. 安全检查:验证MMU、缓存等关键功能是否启用。
  4. 模块初始化:初始化加密、认证和可信启动模块。
  5. 镜像加载:根据[image_id]决定加载BL2或进入固件更新流程。
  6. 环境清理:完成模块收尾工作,准备跳转至下一阶段。

整体确保系统从BL1平滑过渡到后续启动阶段(BL2)。
在这里插入图片描述
bl1_load_bl2完整源码如图:
在这里插入图片描述

二、加载 BL2 镜像

1.从外部存储设备(eMMC、SD Card、SPI NOR/NAND Flash)读取 BL2 镜像。
2.将 BL2 镜像加载到 片内 SRAM 的预定义地址。
在这里插入图片描述

三、验证 BL2 镜像 (验签)

1.读取 BL2 镜像的头部信息(包含签名、哈希值)。
2.使用 ROM 中预置的 根公钥 (Root Public Key) 验证 BL2 的数字签名。
3.若验签失败:系统停止启动(防止运行恶意固件)。
4.若验签通过:信任链建立,准备跳转。
在这里插入图片描述

四、准备跳转环境

1.为 BL2 准备启动参数(如硬件信息、内存布局)。
2.配置 CPU 异常等级:从 EL3 降级到 Secure EL1(主流配置,遵循最小权限原则)。
3.关闭中断,设置好栈指针(SP)。
在这里插入图片描述

五、跳转到 BL2

1.PC 指针跳转到 SRAM 中 BL2 的入口地址。

第三阶段:BL2 (Boot Loader Stage 2)

BL2 是 TF-A 可信启动的核心执行单元,运行在 Secure EL1
在这里插入图片描述

先通过链接脚本bl2.ld.S:定义程序入口点为bl2_entrypoint
在这里插入图片描述
通过链接脚本bl2_entrypoint.S中的bl2_entrypoint函数进行跳转到bl2_main主函数,
文件路径:bl2\aarch64\bl2_el3_entrypoint.S
在这里插入图片描述
bl2_main是ARM Trusted Firmware中BL2阶段的主函数,负责初始化和加载下一阶段的引导镜像。
在这里插入图片描述

主要功能包括

  1. 平台初始化:执行早期和晚期平台设置,启用控制台。
  2. 安全模块初始化:初始化加密、认证和可信启动模块。
  3. 镜像加载:加载并验证下一阶段的引导镜像。
  4. 运行环境准备:根据运行级别(EL1/EL3)启用或禁用指针认证,处理浮点寄存器陷阱。
  5. 控制权移交:通过SMC调用将控制权交给下一阶段(BL1或直接运行BL3x)。

核心步骤

平台硬件初始化 (进阶)

1.初始化 DDR DRAM 控制器:这是 BL2 最重要的工作之一,从此系统可以使用大容量内存。
2.初始化存储控制器(eMMC/SD/Flash)、加密引擎(Crypto Engine)、GIC 中断控制器。
3.初始化控制台(UART),输出启动日志。

完成一系列初始化后将判断当前运行状态若没有运行在BL2_RUNS_AT_EL3则将控制权交BL1继续加载下一个镜像
在这里插入图片描述
若运行在BL2_RUNS_AT_EL3则继续运行引导下一个镜像(BL3x)
在这里插入图片描述

加载 BL3x 镜像

1.从外部存储读取以下镜像到 DRAM 的预定义地址:
BL31 (EL3 Runtime Firmware)
BL32 (TEE OS, e.g., OP-TEE)
BL33 (Non-secure Bootloader, e.g., U-Boot/UEFI)

链式验签 (信任链传递)

1.依次验证 BL31、BL32、BL33 的数字签名和哈希值。
2.检查镜像版本号,执行 防回滚保护 (Anti-rollback)。
3.任何一个镜像验签失败,系统停止启动。

内存布局与安全配置

1.配置 MPU/MMU:划分安全内存(Secure Memory)与非安全内存(Non-secure Memory)。
2.标记 BL31/BL32 所在内存为 “安全区域”,禁止非安全世界访问。

准备跳转参数

1.填充 bl_params 结构体(包含 BL31/BL32/BL33 的加载地址、大小、设备树地址等)。
2.将参数结构体地址传递给 BL31。
在这里插入图片描述

跳转到 BL31

1.CPU 异常等级从 Secure EL1 提升回 EL3。
2.PC 指针跳转到 DRAM 中 BL31 的入口地址

第四阶段:BL31 (Boot Loader Stage 31)

BL31 是 TF-A 的 核心运行时固件,常驻内存,运行在 EL3 (最高特权级)
在这里插入图片描述

先通过链接脚本bl31.ld.S:定义程序入口点为bl31_entrypoint
在这里插入图片描述

通过链接脚本bl31_entrypoint.S中的bl31_entrypoint函数进行跳转到bl31_main主函数,
文件路径:bl31\aarch64\bl31_entrypoint.S
在这里插入图片描述
bl31_main是ARM Trusted Firmware中BL31阶段的主函数,负责系统启动过程中的关键初始化工作。
在这里插入图片描述

主要功能包括

  1. 平台与架构初始化:执行早期和后期平台设置,检测硬件特性。
  2. 安全状态管理:初始化上下文寄存器、异常处理框架及运行时服务(如PSCI)。
  3. 镜像加载准备:根据配置决定下一步执行BL32或RMM,最终准备进入BL33。
  4. 日志与调试支持:输出版本信息、性能监控数据,并刷新控制台缓冲区。

整体流程确保系统从安全世界顺利过渡到下一启动阶段。
核心步骤

EL3 环境初始化

1.初始化 EL3 栈指针、异常向量表(Vector Table)。
2.初始化 GIC 中断控制器:配置安全中断与非安全中断的路由。
3.初始化 XLAT 页表:建立 EL3 阶段的内存映射。
在这里插入图片描述

初始化运行时服务

1.初始化 PSCI (Power State Coordination Interface):用于后续 CPU 热插拔、电源管理。
2.初始化 SMC 处理框架 (Secure Monitor Call):注册标准服务和厂商自定义服务。
3.初始化 TEE dispatcher:为 BL32 (TEE) 准备加载环境。

跳转到 BL32 (Secure World)

1.CPU 异常等级从 EL3 切换到 Secure EL1。
2.配置安全世界上下文(寄存器、SCR_EL3 寄存器)。
3.PC 指针跳转到 BL32 (TEE) 的入口地址。

第五阶段:BL32 (Boot Loader Stage 32 - TEE)

BL32 是 可信执行环境 (TEE),例如 OP-TEE,运行在 Secure EL1

通过链接脚本entrypoint.S中的sp_min_entrypoint函数进行跳转到sp_min_main主函数,
文件路径:bl32\sp_min\aarch32\entrypoint.S
在这里插入图片描述

sp_min_main这段代码是 SP_MIN 的主函数,
在这里插入图片描述
主要功能如下

  1. 打印版本和构建信息:通过 [NOTICE]输出版本字符串和构建消息。
  2. 平台设置:调用 [sp_min_platform_setup()]执行平台相关初始化。
  3. 运行时服务初始化:调用 [runtime_svc_init()] 初始化运行时服务(如 PSCI)。
  4. 准备下一阶段镜像:调用 sp_min_prepare_next_image_entry() 为进入下一异常级别做准备。
  5. 平台运行时设置:调用 [sp_min_plat_runtime_setup()]执行平台特定的运行时配置。
  6. 控制台刷新与切换:刷新控制台缓冲区并切换到运行时状态。

核心步骤

TEE 操作系统初始化

1.初始化 TEE 内核、线程调度、安全驱动。
2.初始化安全存储(Secure Storage)、加密服务。
3.加载并初始化安全应用(TA, Trusted Application)。

bl31中的runtime_svc_init函数会初始化OP-TEE对应的服务,通过调用该服务项的初始化函数来完成OP-TEE的启动。对于OP-TEE的服务项会通过DECLARE_RT_SVC宏在编译时被存放到rt_svc_des段中。

在这里插入图片描述
该段中的init成员会被初始化成opteed_setup函数,由此开始进入到OP-TEE OS的启动。
在这里插入图片描述
在这里插入图片描述

通过 SMC 返回到 BL31

1.TEE 初始化完成后,触发 SMC 调用。
2.CPU 从 Secure EL1 陷入(Trap)回 EL3,由 BL31 接管。

第六阶段:BL31 (Runtime - 切换世界)

BL31 再次接管 CPU,准备从 “安全世界” 切换到 “非安全世界”。
核心步骤

配置非安全世界上下文

1.配置 SCR_EL3 寄存器:设置 NS (Non-secure) 位,标记后续为非安全世界。
2.配置 SPSR_EL3 寄存器:设置目标异常等级(通常是 EL2 或 EL1)。
3.恢复非安全世界的通用寄存器。

跳转到 BL33 (Non-secure World)

1.执行 ERET 指令(Exception Return)。
2.CPU 从 EL3 退出到 Non-secure EL2/EL1。
3.PC 指针跳转到 BL33 (U-Boot/UEFI) 的入口地址。

第七阶段:BL33 (Boot Loader Stage 33) & OS 启动

BL33 是 非安全世界 Bootloader,例如 U-Boot 或 UEFI,运行在 Non-secure EL2/EL1。

核心步骤

Bootloader 初始化

1.初始化网卡、存储、显示等外设。
2.读取内核镜像(Kernel)、设备树(DTB)、Ramdisk 到内存。

启动操作系统内核

1.设置内核启动参数(Command Line)。
2.跳转到 Linux/Android/Windows 内核的入口地址。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐