4. TrustZone硬件组件
TrustZone 并不是一个单独的寄存器或一条指令,而是一组分布在 SoC 各处的硬件组件协同形成的安全边界。理解这些组件各自负责哪一段地址、哪一类事务、哪一级权限,是平台移植和故障调试的基础。本节围绕 TZASC、TZPC、TZMA、GIC 安全扩展以及 MMU 与地址空间隔离展开,重点说明它们在“谁可以访问什么”这条链路上的分工。
一、核心原理:安全属性从主设备到从设备的传递
在 TrustZone 架构中,每个总线事务都携带一个安全状态位(NS 位)。CPU 通过 SCR.NS 决定当前处于安全世界还是非安全世界;GIC 通过中断分组决定中断被路由到哪个世界;而 TZASC、TZPC、TZMA 则负责在从设备侧检查这个 NS 位是否允许访问目标地址。MMU 则负责把虚拟地址翻译成物理地址,并在页表项中携带 NS 属性,使地址空间在翻译阶段就被划分。
因此,一条访问能否成功,取决于“主设备发出的 NS 位 + 中间控制器检查 + 目标区域策略”三者是否一致。任何一环配置错误,都会表现为安全世界访问被拒、非安全世界越权成功,或者中断无法送达。
二、各组件职责与配置要点
TZASC(TrustZone Address Space Controller)通常挂在 DDR 控制器前,把物理内存划分为多个区域,每个区域可独立设置安全/非安全属性、读写权限和访问范围。移植时最常见的问题是区域重叠或未覆盖全部 DDR,导致非安全世界可以访问安全 OS 的代码段。
TZPC(TrustZone Protection Controller)用于外设的安全划分。它通过一组 DECPROT 寄存器,把每个外设标记为安全或非安全。非安全世界访问被标记为安全的外设时,总线会返回错误。调试时若发现串口在非安全世界无法使用,应优先检查 TZPC 对应位。
TZMA(TrustZone Memory Adapter)用于片上 SRAM 或 ROM 的分区。它按地址边界把一块小容量存储切成安全区和共享区,通常只支持有限个区域。由于片上存储容量小,TZMA 的边界配置必须精确到 KB 级。
GIC 安全扩展把中断分为 Group0(安全)和 Group1(非安全),并通过 GICD_IGROUPR 等寄存器控制分组。安全世界可以访问全部中断,非安全世界只能看到属于自己的 Group1 中断。若中断无法送达非安全 OS,应检查该中断的 Group 配置和目标 CPU 接口。
MMU 在地址翻译阶段为每个页表项附加 NS 属性。安全世界的页表可以把某段虚拟地址映射为安全物理地址,非安全世界的页表则只能映射非安全物理地址。MMU 与 TZASC 的关系是“先翻译、后检查”,两者必须一致。
| 组件 | 作用对象 | 关键配置 | 典型故障 |
|---|---|---|---|
| TZASC | DDR 等大容量内存 | 区域基址、大小、安全属性 | 区域重叠导致越权 |
| TZPC | 外设 | DECPROT 安全位 | 外设在 NS 世界不可用 |
| TZMA | 片上 SRAM/ROM | 地址边界、区域数量 | 边界未对齐导致数据错乱 |
| GIC 安全扩展 | 中断 | Group0/Group1 分组 | 中断无法路由到目标世界 |
| MMU | 虚拟地址空间 | 页表项 NS 属性 | 翻译后属性与 TZASC 冲突 |
三、案例场景:一次非安全世界越权访问的排查
某平台在非安全 Linux 启动后,发现其可以读写一段本应属于安全 OS 的 DDR 区域。排查步骤如下:
- 确认 CPU 当前处于非安全世界,读取 SCR.NS 为 1。
- 检查 MMU 页表,确认该虚拟地址被映射为非安全物理地址。
- 读取 TZASC 区域配置寄存器,发现安全区域只覆盖了 DDR 的前半段,后半段未配置。
- 修正 TZASC 区域,使安全区域覆盖全部安全 OS 物理内存,并设置 NS 不可访问。
- 重新启动后,非安全世界访问该区域触发总线错误,问题解决。
# 读取 TZASC 区域属性示例(伪代码)
tzasc_read_region(0, &base, &size, &attr);
if (attr & TZASC_ATTR_NS) {
// 该区域允许非安全访问,需确认是否应改为安全
}
四、误区与复盘
常见误区一:只配置 MMU 而忽略 TZASC。MMU 只负责翻译和属性标记,真正在从设备侧执行检查的是 TZASC。若 TZASC 未配置,非安全世界仍可能访问到安全物理内存。
常见误区二:把 TZPC 和 TZMA 混用。TZPC 面向外设,TZMA 面向片上存储,两者寄存器模型和粒度不同,不能互相替代。
常见误区三:GIC 分组配置后未同步更新目标 CPU 接口。GIC 安全扩展需要同时配置分发器和 CPU 接口,否则中断可能被挂起但无法送达。
总体而言,TrustZone 硬件组件的调试核心是“一致性”:CPU 的 NS 位、MMU 的页表属性、TZASC/TZPC/TZMA 的区域策略、GIC 的中断分组,必须围绕同一份安全划分方案协同配置。任何一处不一致,都会在运行时表现为访问异常或中断丢失,而这些问题往往只能通过逐级读取寄存器来定位。