ATF简介
Trusted Firmware-A(ATF)是一款轻量级的开源固件,用于为ARMv8-A SoC平台提供安全启动和运行时环境。它由ARM公司和全球范围内的合作伙伴共同开发和维护,旨在提供一个安全、可靠和可定制的基础固件,以支持ARMv8-A SoC平台的安全引导和操作。它实现了不同的ARM接口标准,如下:
- 电源状态控制接口(Power State Coordination Interface, PSCI)
- 安全启动需求(Trusted Board Boot Requirements CLIENT,TBBR-CLIENT)
- 安全监控模式调用约定(SMC Calling Convention)
- 系统控制和管理接口(System Control and Management Interface,SCMI)
- 软件委托异常接口(Software Delegated Exception Interface,SDEI)
- PSA固件更新规范(PSA FW update specification)
寄存器
名称 | 寄存器 | 功能 |
---|---|---|
SP_ELx | 栈针寄存器 | ARMv8包含四个异常等级,对应有四个SP栈针寄存器SP_EL0~SP_EL3,SP_EL0可以被任何异常等级使用,其他异常等级会使用对应的SP_ELx寄存器 |
PSTATE | 处理器状态寄存器 | 表示处理器状态,包含条件标志位,执行状态控制,异常掩码标志位,访问权限 |
SPSR | 备份程序状态寄存器 | 用于保存程序在异常处理过程中的状态。在发生异常时,CPU会将PSTATE寄存器值保存到SPSR寄存器中,然后切换到异常处理程序;处理完成后恢复SPSR的值到PSTATE寄存器中 |
SCR_EL3 | 安全配置寄存器 | 设置安全相关的属性,只有EL3等级可以配置,其他等级没有 |
SCTLR_EL3 | 系统控制器 | 设置EL3等级下的状态控制信息,包括MMU,对齐检查,cache控制,内存权限,数据大小端 |
ELR_ELx | 异常链接寄存器 | 存放异常返回的地址,在异常处理完成后恢复到PC中 |
主要功能
ARM将ATF作为底层固件并且开源出来,目的在于将ARM底层的操作统一,以使代码能够重用和便于移植。ATF主要实现了以下功能:
- 安全引导功能:提供了安全启动功能,可以验证和加载下一级固件,包括UEFI、Linux Kernel等,以保护系统免受恶意软件和攻击的威胁。
- 安全运行时环境:支持TrustZone技术,提供了安全运行时环境,以实现安全保护和隔离。在TF-A中,TrustZone技术分为两个安全状态:安全状态(Secure state)和非安全状态(Non-secure state),并提供了相应的API和服务。
- 异常处理:支持异常处理,可以处理系统中的各种异常,包括中断、系统调用、指令异常、数据异常等。
- 调试支持:提供了调试支持,可以通过JTAG或者其他调试接口,对系统进行调试和分析。
- 硬件访问:提供了硬件访问接口,可以与硬件设备进行交互,以提供各种系统服务。
- 虚拟化支持:支持虚拟化,可以与EL2和EL1异常级别进行交互,以支持虚拟化和操作系统的启动和管理。
- 系统初始化:提供了系统初始化功能,可以初始化系统的各种硬件设备,并准备好系统的各种环境,以便启动下一级固件。
ATF将整个启动过程如下图所示。
加载流程
ATF的加载流程划分为多个阶段,用BLx来表示,典型的有BL1、BL2、BL31、BL32、BL33等,典型的加载流程如下。
- BL1:BL1是芯片上电后的第一阶段,一般这部分代码称为BootROM,其是固化在芯片的内部,不能修改和升级。其负责初始化设备内部的一些重要寄存器、存储器等硬件资源,并加载和跳转到下一阶段BL2。对于安全启动,是将bootrom作为启动时的信任根。
- BL2:BL2完成相关的初始化操作, 主要是内存、 MMU、 串口以及EL3软件运行环境的设置;从存储介质中加载BL3x等镜像,并验证镜像的完整性和真实性;将控制权传递给BL31,跳转到下一阶段BL31。
- BL31:包含两部分功能,在启动时作为启动流程的一部分,执行软硬件初始化以及启动BL32和BL33镜像。在系统启动完成后,将继续驻留于系统中,并处理来自其它异常等级的smc异常,以及其它需要路由到EL3处理的中断等。
- BL32:Bl32主要用于运行Trusted OS,如optee,它主要用来保护用户的敏感数据(如密码、指纹、人脸等),以及与其相关的功能模块,如加解密算法,ta的加载与执行,secure storage等。。
- BL33:BL33一般是非安全世界的BootLoader,如u-boot,其用于启动最终的操作系统内核kernel。
启动流程
由于ARMv8架构提出了不同的异常级别,每个阶段运行在不同的异常等级,其典型的启动流程如下。
-
复位后BL1运行在EL3,它执行完成后会通过异常返回ERET的方式跳转到BL2
-
BL2执行完成后需要跳转到BL31,由于BL31运行在EL3异常等级,只能通过smc异常触发进入EL3异常等级
-
BL1捕获SMC异常,根据BL2传入的参数设置BL31的入口地址和系统初始状态,通过ERET跳转到BL31的入口地址处执行
-
BL31根据其镜像加载信息设置入口地址以及其它状态,并完成跳转BL32
-
BL32加载完成后将通过SMC返回到BL31
-
BL31跳转到non secure EL1或non secure EL2以执行BL33
阶段 | 异常等级 | 功能 | 描述 |
---|---|---|---|
BL1 | EL3 | AP Boot ROM | 加载bl2 |
BL2 | Secure EL1 | Trusted Boot Firmware | 加载bl3x |
BL31 | EL3 | EL3 Runtime Firmware | 启动TEE-OS;启动REE镜像 |
BL32 | Secure EL1 | TEE-OS(如OP-TEE) | 运行Trusted-OS |
BL33 | NS-EL1/EL2 | Non-Trusted Firmware(如U-Boot) | 加载kernel |