1. 大致描述
ATF提供了安全世界的参考实现软件[ARMv8-A],包括执行的
[Secure Monitor] [TEE-SMC]异常级别 3(EL3)。它实现了各种 ARM 接口标准,如电源状态协调接口([PSCI]),可信板启动要求(TBBR,ARM DEN0006C-1)和[SMC 呼叫公约] [SMCCC]。尽可能代码旨在重用或移植到其他 ARMv8-A 型号和硬件平台。
2. 功能
◆初始化安全世界(例如,异常向量,控制寄存器,中断控制器和平台的中断)在转变到普通世界之前,可以通过平台指定异常等级和寄存器位数.
◆ 库支持 CPU 特定的复位和关断序列。这包括对勘误解决方案的支持。
◆ ARM 通用中断控制器规范(GICv2 和 GICv3)的版本 2.0 和 3.0 的驱动程序。后者支持 GICv3 硬件系统,不包含传统的 GICv2 支持。
◆ 启用 ARM 系统 IP 的标准初始化的驱动程序,例如缓存相干互联(CCI),
缓存相干网络(CCN),网络互连(NIC)和 TrustZone 控制器(TZC)。
◆ SMC(安全监视器调用)处理,符合使用 EL3 运行时服务框架的 SMC 调用约定。
◆Secure Monitor 库代码,如世界切换,EL1 上下文管理和中断路由。使用提供的 AArch64 EL3 运行系统软件时,必须与 Secure-EL1 有效负载分派器(SPD)组件集成,以自定义与 Secure-EL1 有效负载(SP)的交互(例如安全操作系统)。
◆ 测 试 Secure-EL1 加 载 和 调 度 程 序 , 证 明 AArch64 安 全 监 视 器 功 能 和Secure-EL1 与 PSCI 交互。
◆ AArch64 SPD 为 OP-TEE 安全操作系统和 NVidia 可信的小内核。
◆ Trusted Board Boot 实现,符合所有强制 TBBR 要求。这包括使用证书,固件更新(或恢复模式)引导流程以及将各种固件映像打包到要从非易失性存储器加载的固件映像包(FIP)中的映像认证。目前仅在 AArch64 构建中支持 TBBR 实现。
◆ 支持选择引导流。一些平台有自己的引导固件,只需要本项目提供的 AArch64EL3 运行时软件。其他平台只需要最少的初始化在启动到任意 EL3 有效负载。
3. ATF的获得与编译运行所依赖的环境
a. 使用以下命令安装所需的软件包以构建受信任的固件:
sudo apt-get install build-essential gcc make git libssl-dev
b. 下载并安装 AArch64 little-endian GCC 交叉编译器 (linaro)
aarch-linux-gnu- 系列
c. 获得源代码
git clone https://github.com/ARM-software/arm-trusted-firmware.git
d. 构建ATF
CROSS_COMPILE=<path-to-aarch64-gcc>/bin/aarch64-linux-gnu- BL33=<path-to>/<bl33_image> /
make PLAT=<platform> all fip
注意:
- 如果未指定“PLAT”,则默认假定为“fvp”;
- BL33图像对应于切换后执行的软件到不安全的世界。 UEFI可以用作BL33图像。
- 对应于BL32图像的TSP(测试安全有效载荷)不是默认编译的,需要的童鞋自己添加进去哦。
- 生成elf文件在对应平台的子目录寻找
* `build/<platform>/<build-type>/bl1.bin`
* `build/<platform>/<build-type>/bl2.bin`
* `build/<platform>/<build-type>/bl31.bin`
- 其中
<platform>
是所选平台的名称
* `build/<platform>/<build-type>/fip.bin` //生成的最终fip文件,就是编译后的最终二进制文件(后面介绍这个打包工具)
- 2.(Optional)某些平台可能需要启动SCP_BL2镜像。 这个图像可以
通过指定构建可信固件时,将被包含在FIP中
SCP_BL2
构建选项:
SCP_BL2=<path-to>/<scp_bl2_image>
(可选)某些BL级(BL2,BL31和BL32)的二进制路径可以是
通过指定BLx是BL阶段的BLx = / 提供的。
这将绕过来自源的BL组件的构建,但将包括在最终FIP镜像中。 请注意BL32将会只有在指定了“SPD”构建选项时才包含在构建中。
例如,在构建选项中指定“BL2 = <path-to>/<bl2_image>”
,
将跳过可信固件中BL2源的编译,但BL2包括在最终FIP图像中指定的二进制文件。完全删除构建树
make realclean
注意: 里面还包含很多构建选项如:ERROR_DEPRECATED``SPIN_ON_BL1_EXIT
PL011_GENERIC_UART``SCP_BL2_KEY
等等需要自行阅读和查阅,根据自己的需求,和平台特定来构建ATF。
4. 创建固件映像包
自动创建FIP,也可以独立构建FIP创建工具和FIP(如果需要)。请按照下列步骤操作:
- 构建工具
make -C tools/fip_create
- 建议在重建之前删除构建工件:
make -C tools/fip_create clean
- 创建一个包含现有BL2和BL31图像的固件包:
# fip_create --help to print usage information
# fip_create <fip_name> <images to add> [--dump to show result]
./tools/fip_create/fip_create fip.bin --dump \
--bl2 build/<platform>/debug/bl2.bin --bl31 build/<platform>/debug/bl31.bin
- 查看现有固件包的内容:
./tools/fip_create/fip_create fip.bin --dump
- 现有的包条目可以单独更新:
./tools/fip_create/fip_create fip.bin --dump \
--bl2 build/<platform>/release/bl2.bin
5. 构建测试安全加载调度
TSP与BL31固件中的配套运行时服务相结合,称为TSPD。 因此,如果您打算使用TSP,BL31图像也必须重新编译。
首先清理可信固件构建目录以摆脱以前的任何内容BL31二进制。 然后构建TSP图像并将其包含在FIP中使用:
CROSS_COMPILE=<path-to-aarch64-gcc>/bin/aarch64-linux-gnu- \
BL33=<path-to>/<bl33_image> \
make PLAT=<platform> SPD=tspd all fip
- 在
build
目录中创建生成一个额外的引导加载程序二进制文件:
`build/<platform>/<build-type>/bl32.bin`
ps: 细节再慢慢补充吧,如有错误,欢迎指出交流,每天进步一点,你们给我见证,加油!!!