3. 硬件基础与系统架构
TrustZone 不是软件补丁,而是一组贯穿处理器核、总线、内存控制器与外设的硬件安全扩展。理解它的关键,是把“安全世界/非安全世界”看作由硬件强制隔离的两个执行域,而不是两个普通进程。Cortex-A 与 Cortex-M 对 TrustZone 的实现思路不同:A 系列以 Secure/Non-secure 双世界和 EL3 为基石,M 系列则以 TrustZone-M 的 Security Attribution Unit(SAU)与 Implementation Defined Attribution Unit(IDAU)为核心。工程上必须同时掌握这两条硬件路线,才能在跨域通信中正确划分内存、路由中断并配置外设安全属性。
一、Cortex-A 与 Cortex-M 的 TrustZone 硬件扩展差异
Cortex-A 的 TrustZone 通过 AXI 总线上的 NS 位(Non-secure bit)标记每一次事务,处理器内部维护 Secure 与 Non-secure 两套状态。异常级别 EL3 通常运行安全监控器(Secure Monitor),负责 SMC 指令触发的世界切换。Cortex-M 的 TrustZone-M 则把安全状态扩展到线程模式与处理模式,每个异常都可被静态配置为 Secure 或 Non-secure,并通过 SG 指令实现安全函数调用。两者最本质的区别是:A 系列依赖 MMU 与页表属性,M 系列依赖 SAU/IDAU 的区域基址与属性寄存器。
二、内存隔离:从地址属性到总线过滤
内存隔离是 TrustZone 的根基。Cortex-A 侧,每个页表项都带有 NS 位,MMU 在地址翻译时决定该访问属于哪个世界;同时 TZASC(TrustZone Address Space Controller)在内存控制器前对 DRAM 进行区域划分,防止非安全世界越权访问安全内存。Cortex-M 侧,SAU 定义最多 8 个区域,每个区域可配置为 Secure、Non-secure 或 Non-secure Callable(NSC)。NSC 区域是安全与非安全之间的唯一合法入口,非安全代码只能通过它跳转到安全函数。
实际配置中,常见做法是把安全固件、密钥、安全外设寄存器放在 Secure 区域,把普通应用、网络协议栈放在 Non-secure 区域,NSC 区域仅保留 veneer 跳转表。这样即使非安全侧被攻破,攻击者也无法直接读写安全资产。
三、中断路由:安全中断与非安全中断的分发
中断路由决定了异常发生时处理器进入哪个世界。Cortex-A 通过 GIC(Generic Interrupt Controller)的 Group 0/Group 1 区分安全与非安全中断,EL3 可配置中断的目标世界。Cortex-M 则通过 NVIC 的 ITNS 寄存器把每个外部中断静态分配给 Secure 或 Non-secure,同时安全中断向量表位于安全内存,非安全中断向量表位于非安全内存。
| 对比项 | Cortex-A | Cortex-M |
|---|---|---|
| 中断控制器 | GIC,Group 0/1 分组 | NVIC,ITNS 逐中断配置 |
| 安全中断入口 | EL3 或 S-EL1 向量 | 安全向量表(Secure Vector Table) |
| 非安全中断入口 | EL1/EL2 向量 | 非安全向量表 |
| 路由控制 | GICD_IGROUPR、GICD_CTLR | NVIC_ITNS、AIRCR.PRIS |
| 典型用途 | 安全定时器、安全 DMA 中断 | 安全 GPIO、安全加密引擎中断 |
中断路由配置错误是跨域通信中最常见的故障源。例如,把安全外设中断错误地分配给非安全世界,会导致非安全侧直接处理安全事件,破坏隔离边界;反之,把非安全中断强制路由到安全侧,则会造成安全世界被高频打扰,影响实时性。
四、外设安全属性配置与实操要点
外设安全属性通常由 TZPC(TrustZone Protection Controller)或芯片级安全控制器决定。每个外设可被标记为 Secure 或 Non-secure,非安全访问安全外设会被总线拒绝并触发错误响应。配置流程一般包括:确定外设归属、设置安全属性寄存器、配置中断路由、验证访问权限。
/* Cortex-M SAU 配置示例:NSC 区域 + 安全外设区域 */
SAU->RNR = 0; /* 选择区域 0 */
SAU->RBAR = 0x1000FE00; /* 基址,32 字节对齐 */
SAU->RLAR = 0x1000FE1F | SAU_RLAR_ENABLE_Msk;
SAU->RNR = 1; /* 选择区域 1:安全外设 */
SAU->RBAR = 0x50000000;
SAU->RLAR = 0x50000FFF | SAU_RLAR_ENABLE_Msk;
SAU->CTRL = SAU_CTRL_ENABLE_Msk; /* 使能 SAU */
__DSB();
__ISB();
五、常见误区与复盘
- 误区一:认为 TrustZone 只靠软件就能隔离。实际上,没有 TZASC、SAU、GIC 等硬件配合,软件隔离形同虚设。
- 误区二:把 NSC 区域当作普通安全内存使用。NSC 只应放置跳转入口,不能存放密钥或敏感数据。
- 误区三:忽略中断路由的静态属性。中断归属在启动后通常不可动态更改,必须在系统设计阶段确定。
- 误区四:外设安全属性配置后未做负向测试。必须验证非安全访问确实被拒绝,而不是仅验证安全访问成功。
复盘时建议绘制一张“安全属性地图”:横轴列出所有内存区域与外设,纵轴标注 Secure/Non-secure/NSC 属性、中断分组和访问权限。这张图能帮助团队在集成阶段快速发现属性冲突,避免跨域通信在后期出现难以定位的随机故障。