tf-a启动阶段_加载
当芯片复位以后首先运行 bl1 代码,bl1 一般是芯片内部的 ROM 代码,bl1 主要工作就是将外置 Flash 中的 bl2 固件加载到指定的 RAM 中,然后跳转到 bl2 部分。
bl2 为安全启动固件,bl 2 会将剩余的三个启动阶段 bl31、bl32 和 bl33 对应的镜像文件加载到指定的内存中。比如 bl32 中的安全操作系统(OP-TEE),bl31 中的 EL3 运行时固件(Runtime Firware),bl33 中的 uboot。bl2 将这些固件加载完成以后就会启动相应的固件,也就是进入到第三启动阶段。
TF-A 启动流程就是:bl1→ bl2→( bl31/ bl32/ bl33)。注意,bl31、bl32 和 bl33 对应的镜像不需要全部都有,但是 bl33 一般是必须的,因为 bl33 一般是 uboot,这个是很重要的!

bl1

bl 1 是 TF-A 的第一个启动阶段,芯片复位以后就会运行 bl1 镜像,TF-A 提供了 bl1 源码。但是,实际上 bl1 一般是半导体厂商自己编写的内部 Boot ROM 代码,并没有使用 TF-A 提供的bl1 镜像,比如 STM32MP1 的内部 ROM 代码就是 bl 1。因此 bl1 部分的实现就千差万别,不同的半导体厂商有不同的实现方法。
一般 bl1 要做的就是初始化 CPU,如果芯片支持不同的启动设备,那么还需要初始化不同的启动设别,比如 NAND、EMMC、SD、USB 或串口等。然后根据 BOOT 引脚的高低电平来判断当前所选择的启动设备,从对应的启动设备中加载 bl2 镜像,并放到对应的内存中,最后跳转到 bl2 镜像并运行。

bl2

bl 2 会进一步的初始化芯片,比如初始化 DDR、MMU、串口等。bl2 会将剩下三个阶段(bl31、bl32 和 bl33)对应的镜像加载到指定的内存中,最后根据实际情况来启动剩下三个阶段的镜像。

bl31

在 AArch64 中,bl31 主要是 EL3 的 Runtime 固件。

bl32

bl32 一般为安全系统(TEE OS)固件,比如 OP-TEE。TF-A 为 AArch32 提供了 EL3 的 Runtime软件,这个 Runtime 软件就是 bl32 固件,sp_min 就是这个 Runtime 软件。大家可以打开 TF-A的 bl32 源码文件夹,其下就有一个名为“sp_min”的子文件夹,这个就是 bl32 的 sp_min 源码,如图所示:
tf-a启动阶段_初始化_02

bl33

bl33 就是 Normal World 下的镜像文件,比如 uboot。

主要是给自己看的,所以肯定会出现很多错误哈哈哈哈哈