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 的区域基址与属性寄存器。

Cortex-A 与 Cortex-M TrustZone 硬件架构对照 Cortex-A TrustZone Non-secure World EL0 / EL1 / EL2 · NS=1 事务 Secure Monitor (EL3) SMC 指令 · 世界切换 · 上下文保存 Secure World S-EL0 / S-EL1 · NS=0 事务 MMU + 页表 NS 属性 TZASC / TZPC 内存与外设分区 AXI 总线 NS 位标记每次访问 Cortex-M TrustZone-M Non-secure State 线程模式 / 处理模式 · NS 异常 Secure State SG 指令 · 安全函数调用 · 安全异常 SAU + IDAU 区域基址 / 属性寄存器 · 静态安全属性 MPU 安全/非安全双分区 安全外设 · 安全中断向量表 AHB5 总线 HNONSEC 信号标记访问 对比

二、内存隔离:从地址属性到总线过滤

内存隔离是 TrustZone 的根基。Cortex-A 侧,每个页表项都带有 NS 位,MMU 在地址翻译时决定该访问属于哪个世界;同时 TZASC(TrustZone Address Space Controller)在内存控制器前对 DRAM 进行区域划分,防止非安全世界越权访问安全内存。Cortex-M 侧,SAU 定义最多 8 个区域,每个区域可配置为 Secure、Non-secure 或 Non-secure Callable(NSC)。NSC 区域是安全与非安全之间的唯一合法入口,非安全代码只能通过它跳转到安全函数。

关键规则:安全代码可以访问非安全内存,但非安全代码绝不能访问安全内存。NSC 区域必须按 32 字节对齐,且只允许放置 SG 指令入口,不能存放敏感数据。

实际配置中,常见做法是把安全固件、密钥、安全外设寄存器放在 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();
调试建议:配置完成后,用非安全代码尝试读取安全外设寄存器,应触发 SecureFault 或总线错误;若未触发,说明安全属性未生效,需检查 SAU/IDAU 优先级与总线过滤器配置。

五、常见误区与复盘

  • 误区一:认为 TrustZone 只靠软件就能隔离。实际上,没有 TZASC、SAU、GIC 等硬件配合,软件隔离形同虚设。
  • 误区二:把 NSC 区域当作普通安全内存使用。NSC 只应放置跳转入口,不能存放密钥或敏感数据。
  • 误区三:忽略中断路由的静态属性。中断归属在启动后通常不可动态更改,必须在系统设计阶段确定。
  • 误区四:外设安全属性配置后未做负向测试。必须验证非安全访问确实被拒绝,而不是仅验证安全访问成功。

复盘时建议绘制一张“安全属性地图”:横轴列出所有内存区域与外设,纵轴标注 Secure/Non-secure/NSC 属性、中断分组和访问权限。这张图能帮助团队在集成阶段快速发现属性冲突,避免跨域通信在后期出现难以定位的随机故障。