TF-A启动流程详解

描述

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 的话)。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分