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

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 内核的入口地址。

相关推荐
哈哈浩丶2 小时前
ATF (ARM Trusted Firmware) -3:完整启动流程(热启动)
android·linux·arm开发
哈哈浩丶2 小时前
OP-TEE-OS:综述
android·linux·驱动开发
哈哈浩丶2 小时前
ATF (ARM Trusted Firmware) -1:综述
linux·arm开发·驱动开发
小李独爱秋2 小时前
模拟面试:lvs常见的工作模式有哪些?各有什么特点?
linux·运维·面试·职场和发展·操作系统·职场发展·lvs
恋猫de小郭12 小时前
你是不是觉得 R8 很讨厌,但 Android 为什么选择 R8 ?也许你对 R8 还不够了解
android·前端·flutter
Codefengfeng12 小时前
分辨压缩包的真加密与伪加密
linux·运维·网络
暴力求解12 小时前
Linux---进程(五)进程调度
linux·运维·服务器
楼田莉子12 小时前
C++项目:日志&&线程池
linux·c++·学习·visual studio code
wsad053212 小时前
Linux 用户和组管理完整指南(中英文参数对照)
linux·运维·服务器