1 ATF概览

1.1 ARM安全架构

img

  • EL0:用户特权,运行普通用户程序
  • EL1:系统特权,运行操作系统内核
  • EL2:运行虚拟机监视器
  • EL3:运行安全监控器

ARM64 体系结构提供了 3 种软件产生的异常和3种系统调用。系统调用允许软件主动地通过特殊指令请求更高一场等级的程序所提供的服务。

  • SVC 指令:允许用户态应用程序请求操作系统内核的服务
  • HVC 指令:允许客户操作系统请求虚拟机监控器(hypervisor)的服务。
  • SMC 指令:允许普通世界(normal world)中的程序请求安全监控器(secure monitor)的服务。

异常向量表。向量可以分为两大类,四种:

  • Exception from Lower EL,从低特权级来的异常
    • 低特权级的执行状态为 AArch64
    • 低特权级的执行状态为 AArch32
  • Exception from the current EL,异常就来自当前特权级
    • 当前选择了使用 SP_EL0 处理异常,就是处理异常使用 EL0 的栈空间
    • 当前选择了使用 SP_ELx 处理异常,异常处理使用当前特权级的栈空间

img

https://zhuanlan.zhihu.com/p/578252899

安全架构演变:Secure Partition Manager

img

  • Hafnium是一个开源的SPM实现

img

https://www.trustedfirmware.org/projects/hafnium/

ARM with FF-A

img

  • FFA是一个标准,用于统一从非安全域到安全域一整个通信链路的所有标准接口

img

ARMV9 RME安全架构:

  • RME是Arm Confidential Compute Architecture(Arm CCA)的硬件组成部分。RME可以动态地将资源和内存转移至一个新的受保护的地址空间,这个地址空间无法被高特权的软件或TrustZone固件所访问。借助于这个地址空间,Arm CCA能够构建被称为Realms的受保护的执行环境。

img

1.2 ATF启动流程

源码地址:

https://github.com/ARM-software/arm-trusted-firmware

谷歌开始开发基于Rust的版本(RF-A):

https://www.trustedfirmware.org/projects/rf-a/#:~:text=Rusted%20Firmware-A%20is%20a%20Rust-first%20implementation%20of%20Trusted,legacy-free%2C%20and%20built%20with%20the%20future%20in%20mind.

在 ARMv8 架构中,启动流程包含多个阶段,这些阶段被称为 BL (bootloader) 阶段:

  • BL1:第一阶段启动固件,位于 BootRom 中,负责引导 BL2 并对其进行安全验证;
  • BL2:第二阶段启动固件,位于 Flash 中(比如 eMMC),负责平台相关的初始化,比如 DRAM 的初始化,并负责加载 BL31 并执行 BL31
  • BL31:也就是 trust Runtime firmware,BL31 是持久存在的可信固件,负责系统安全服务和在安全非非安全世界之间切换,执行软硬件初始化以及启动BL32和BL33镜像
  • BL32:包含 TEE OS 和安全应用 TAs,运行在 EL1,启动 EL0 的安全应用,完成后返回 BL31;
  • BL33:非安全世界的启动固件,通常就是 U-Boot 或者直接启动 Linux 内核;

由于ARMv8架构提出了不同的异常级别,每个阶段运行在不同的异常等级,其典型的启动流程如下。

img

  1. 复位后BL1运行在EL3,它执行完成后会通过异常返回ERET的方式跳转到BL2
  2. BL2执行完成后需要跳转到BL1,由于BL1运行在EL3异常等级,只能通过smc异常触发进入EL3异常等级
  3. BL1捕获SMC异常,根据BL2传入的参数设置BL31的入口地址和系统初始状态,通过ERET跳转到BL31的入口地址处执行
  4. BL31根据其镜像加载信息设置入口地址以及其它状态,并完成跳转BL32
  5. BL32加载完成后将通过SMC返回到BL31
  6. BL31跳转到non secure EL1或non secure EL2以执行BL33

img

img

在支持 ATF 的 ARMv8 中完整的镜像跳转流程如下:

img