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、网络协议栈放在非安全世界,二者通过受控入口通信。
二、异常级别: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,或者安全服务无法访问自己的数据区。
五、常见误区与复盘
误区一:认为 TrustZone 等于“两个 CPU”。实际上它是同一 CPU 的两种安全状态,切换有硬件开销,但远小于双核通信。
误区二:把 NSC 区域当成普通安全内存。NSC 区域必须由 SG 指令进入,且不能存放敏感数据,否则会破坏隔离边界。
误区三:忽略 IDAU 的默认属性。有些芯片默认把全部地址标为非安全,若 SAU 未正确覆盖,安全代码会被错误地当成非安全访问。
误区四:只配 SAU 不配 MPU。SAU 解决“世界之间”的隔离,MPU 解决“安全分区之间”的隔离,二者缺一不可。
复盘时可以用一句话检查:非安全代码能否在不经过 NSC 的情况下访问安全资源?如果答案是“能”,说明隔离配置存在漏洞,TF-M 的可信根就不成立。
总结来看,TrustZone 提供了世界划分、异常级别和内存隔离三块硬件基石,而 TF-M 是在这些基石之上构建的安全固件框架。移植 TF-M 时,SAU/IDAU 的区域划分、NSC 入口的放置、MPU 的分区配置,直接决定了安全隔离是否成立。把这三层关系理清,后续的启动流程和分区配置就会变得有据可依。