3. ARM TrustZone技术基础

在移植 TF-M 之前,必须先把 ARM TrustZone 的“世界划分—异常级别—内存隔离”三层模型建立起来。TF-M 并不是凭空创造安全能力,它本质上是运行在 TrustZone 提供的硬件隔离之上的一套安全固件框架。理解这三层,才能看懂 TF-M 的启动流程、分区布局和 SPM(Secure Partition Manager)为什么这样设计。

一、安全与非安全世界:TrustZone 的第一层划分

TrustZone 把处理器的执行环境划分为两个“世界”:安全世界(Secure World)和非安全世界(Non-secure World)。两者可以运行在同一颗 CPU 上,但通过硬件信号区分当前所处的安全状态。CPU 内部有一个 NS 位(Non-Secure bit),它随异常、总线访问和内存访问一起传播,决定了当前指令能访问哪些资源。

关键点在于:安全世界可以访问非安全资源,而非安全世界不能访问安全资源。这种单向可见性由硬件强制,而不是靠软件约定。因此,安全服务(如密钥管理、安全存储、加密引擎)放在安全世界,普通应用、RTOS、网络协议栈放在非安全世界,二者通过受控入口通信。

核心结论:TrustZone 提供的是“硬件强制的单向隔离”,安全世界是可信根(Root of Trust)的载体,非安全世界是业务负载的载体。

二、异常级别:A 系列与 M 系列的差异

异常级别(Exception Level, EL)是 ARM 架构中权限与特权分层的概念。在 Cortex-A 系列上,通常有 EL0~EL3,其中 EL3 是安全监控层(Secure Monitor),负责两个世界之间的切换。但在 Cortex-M 系列(TF-M 主要面向 M23/M33/M35P/M55 等)上,异常级别模型被简化:没有 EL3,取而代之的是安全状态 + 特权/非特权的组合。

在 Cortex-M 的 TrustZone 实现中,异常可以分为安全异常和非安全异常,异常向量表也分为安全向量表和非安全向量表。CPU 通过 BXNS、BLXNS 等指令在安全与非安全代码之间跳转,通过 SG(Secure Gateway)指令从非安全世界进入安全世界。TF-M 正是利用这些机制,把安全服务封装成可被非安全应用调用的入口。

对比项 Cortex-A(EL 模型) Cortex-M(TrustZone)
权限分层 EL0~EL3 安全/非安全 + 特权/非特权
世界切换 EL3 Secure Monitor SG / BXNS / BLXNS 指令
异常向量 VBAR_ELx 安全向量表 + 非安全向量表
典型用途 应用处理器、TEE MCU、IoT 安全固件

三、内存隔离机制:SAU、IDAU 与 MPU

TrustZone 的内存隔离不是靠页表,而是靠地址空间划分。Cortex-M 上主要由三个组件协同完成:

  • SAU(Security Attribution Unit):由软件配置,把地址空间划分为安全、非安全、非安全可调用(NSC)三类区域。
  • IDAU(Implementation Defined Attribution Unit):由芯片厂商在硬件上定义,给出默认的安全属性,SAU 可在此基础上覆盖。
  • MPU(Memory Protection Unit):在安全世界内部进一步划分特权/非特权访问权限,实现安全分区之间的隔离。

其中 NSC(Non-Secure Callable)区域非常关键:它是非安全代码唯一能跳入安全世界的“门”。NSC 区域内的代码必须以 SG 指令开头,否则会触发安全故障。TF-M 的每个安全服务都会在 NSC 区域暴露一个入口桩(veneer),非安全应用通过它发起 PSA Client API 调用。

/* SAU 区域配置示例(概念示意) */
SAU->RBAR = 0x10000000 | SAU_RBAR_ENABLE;
SAU->RLAR = 0x1000FFFF | SAU_RLAR_NSC;

SAU->RBAR = 0x20000000 | SAU_RBAR_ENABLE;
SAU->RLAR = 0x200FFFFF | SAU_RLAR_SECURE;

SAU->CTRL = SAU_CTRL_ENABLE | SAU_CTRL_ALLNS;

四、TF-M 与 TrustZone 的对应关系

把上面的机制映射到 TF-M,可以看到清晰的对应关系:

  • 安全世界:运行 TF-M 核心、SPM、安全分区(Secure Partition),承载可信服务。
  • 非安全世界:运行非安全应用、RTOS、PSA Client API 调用方。
  • NSC 区域:TF-M 的 veneer 表,是 PSA API 的硬件入口。
  • SAU/IDAU:决定 TF-M 镜像、安全分区、外设寄存器的安全属性。
  • MPU:在安全世界内部隔离各个安全分区,防止越权访问。

因此,TF-M 的移植工作很大一部分就是正确配置 SAU/IDAU 区域、划分安全与非安全内存、放置 NSC 入口。如果这些配置错误,典型现象是:非安全应用调用 PSA API 时触发 SecureFault,或者安全服务无法访问自己的数据区。

调试建议:先用调试器读取 SAU->RBAR/RLAR 和 SCB->NSACR,确认安全属性与链接脚本中的内存布局一致,再排查 veneer 是否落在 NSC 区域。

五、常见误区与复盘

误区一:认为 TrustZone 等于“两个 CPU”。实际上它是同一 CPU 的两种安全状态,切换有硬件开销,但远小于双核通信。

误区二:把 NSC 区域当成普通安全内存。NSC 区域必须由 SG 指令进入,且不能存放敏感数据,否则会破坏隔离边界。

误区三:忽略 IDAU 的默认属性。有些芯片默认把全部地址标为非安全,若 SAU 未正确覆盖,安全代码会被错误地当成非安全访问。

误区四:只配 SAU 不配 MPU。SAU 解决“世界之间”的隔离,MPU 解决“安全分区之间”的隔离,二者缺一不可。

复盘时可以用一句话检查:非安全代码能否在不经过 NSC 的情况下访问安全资源?如果答案是“能”,说明隔离配置存在漏洞,TF-M 的可信根就不成立。

TrustZone 三层模型与 TF-M 映射 安全世界 Secure World TF-M 核心 / SPM 安全分区 SP 安全存储 / 密钥 / 加密服务 特权 + 非特权 · MPU 分区隔离 非安全世界 Non-secure World 非安全应用 RTOS / 协议栈 PSA Client API 调用方 特权 + 非特权 · 不可访问安全资源 NSC 区域 SG 指令 · veneer 入口 硬件隔离层 SAU 软件配置安全属性 IDAU 芯片默认安全属性 MPU 安全分区内部隔离 非安全应用 → NSC veneer → SG 指令 → 安全服务(PSA API 调用路径)

总结来看,TrustZone 提供了世界划分、异常级别和内存隔离三块硬件基石,而 TF-M 是在这些基石之上构建的安全固件框架。移植 TF-M 时,SAU/IDAU 的区域划分、NSC 入口的放置、MPU 的分区配置,直接决定了安全隔离是否成立。把这三层关系理清,后续的启动流程和分区配置就会变得有据可依。