bl 1
bl 1 是 TF-A 的第一个启动阶段,芯片复位以后就会运行 bl1 镜像,TF-A 提供了 bl1 源码。但是,实际上 bl1一般是半导体厂商自己编写的内部 Boot ROM 代码,并没有使用 TF-A 提供的 bl1 镜像。因此 bl1部分的实现就千差万别,不同的半导体厂商有不同的实现方法。
一般 bl1 要做的就是初始化 CPU,如果芯片支持不同的启动设备,那么还需要初始化不同的启动设置,比如 NAND、EMMC、SD、USB或串口等。然后根据 BOOT 引脚的高低电平来 判断当前所选择的启动设备,从对应的启动设备中加载 bl2 镜像,并放到对应的内存中,最后跳转到 bl2镜像并运行。
bl 2
bl 2 会进一步的初始化芯片,比如初始化 DDR、MMU、串口等。bl2 会将剩下三个阶段 (bl31、bl32 和bl33)对应的镜像加载到指定的内存中,最后根据实际情况来启动剩下三个阶段的镜像。
bl 31
在 AArch64 中,bl31 主要是 EL3 的 Runtime 固件。
bl 32
bl32 一般为安全系统(TEE OS)固件,比如 OP-TEE。TF-A 为 AArch32 提供了 EL3 的 Runtime 软件,这个Runtime 软件就是 bl32 固件,sp_min 就是这个 Runtime 软件。大家可以打开 TF-A 的 bl32
源码文件夹,其下就有一个名为“sp_min”的子文件夹,这个就是 bl32 的 sp_min 源码,如图所示:
bl32 提供运行时安全服务,在 TF-A 中默认使用 sp_min。sp_min 是一个最小的 AArch32 安全负载(Secure Payload),整合了 PSCI 库以及 AArch32 的 EL3 运行时软件。sp_min 可以替代可信系统(TEE OS)或者可信执行环境(TEE),比如 OP-TEE。用户可以自行选择 bl32 使用哪个软件包。
bl32 充当安全监控(secure monitor),因此它向非安全系统(non-secure os,比如 linux)提供了一些安全服务。非安全的应用软件可以通过安全监控调用(secure monitor calls)来使用这些安全服务,这些代码支持标准的服务调用,比如 PSCI。
bl 33
bl33 就是 Normal World 下的镜像文件,比如 uboot。
至此,我们对 TF-A 的基本启动流程有了一个大概的了解,我们知道了 TF-A 分为多个阶段,不同的阶段其工作内容不同。但是,在实际的开发中并不一定会用到 TF-A 中所有启动阶段。
TF-A 是用于完成安全启动的,OP-TEE 是 TEE OS,如果使用 OP-TEE 的话它会和 linux 内核同时运行,OP-TEE负责可信应用,linux 就是普通的应用程序。
TF-A 分为了不同阶段:bl1、bl2、bl31、bl32 和 bl33,这个主要是面向 AArch64 的,对于 AArch32 而言只有 4个阶段:
bl1:第 1 个阶段,一般为芯片内部 ROM 代码
bl2:第 2 个阶段,可信启动固件
bl32:EL3 运行时(Runtime)软件
bl33:非安全固件,比如 uboot
其中 bl1、bl2 和 bl32 都属于 TF-A 的一部分(如果你使用 TF-A 提供的 bl1 的话)。
全部0条评论
快来发表一下你的评论吧 !