4. TrustZone硬件组件

TrustZone 并不是一个单独的寄存器或一条指令,而是一组分布在 SoC 各处的硬件组件协同形成的安全边界。理解这些组件各自负责哪一段地址、哪一类事务、哪一级权限,是平台移植和故障调试的基础。本节围绕 TZASC、TZPC、TZMA、GIC 安全扩展以及 MMU 与地址空间隔离展开,重点说明它们在“谁可以访问什么”这条链路上的分工。

一、核心原理:安全属性从主设备到从设备的传递

在 TrustZone 架构中,每个总线事务都携带一个安全状态位(NS 位)。CPU 通过 SCR.NS 决定当前处于安全世界还是非安全世界;GIC 通过中断分组决定中断被路由到哪个世界;而 TZASC、TZPC、TZMA 则负责在从设备侧检查这个 NS 位是否允许访问目标地址。MMU 则负责把虚拟地址翻译成物理地址,并在页表项中携带 NS 属性,使地址空间在翻译阶段就被划分。

因此,一条访问能否成功,取决于“主设备发出的 NS 位 + 中间控制器检查 + 目标区域策略”三者是否一致。任何一环配置错误,都会表现为安全世界访问被拒、非安全世界越权成功,或者中断无法送达。

TrustZone 硬件组件协同关系 CPU 核心 SCR.NS 决定世界 MMU 翻译 + NS 属性 GIC 安全扩展 Group0 / Group1 中断路由与抢占 总线 NS 位随事务 传递 TZASC 区域基址/大小/属性 DDR 等大容量内存 按区域过滤 NS 访问 TZPC 外设安全/非安全划分 DECPROT 寄存器 控制外设访问权限 TZMA 片上 SRAM/ROM 分区 按地址边界切分 安全区不可被 NS 读 目标从设备 DDR / SRAM 外设寄存器 ROM 说明:CPU 发出事务时携带 NS 位;GIC 决定中断归属;TZASC/TZPC/TZMA 在从设备侧按区域或外设检查权限;MMU 在翻译阶段附加 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 区域。排查步骤如下:

  1. 确认 CPU 当前处于非安全世界,读取 SCR.NS 为 1。
  2. 检查 MMU 页表,确认该虚拟地址被映射为非安全物理地址。
  3. 读取 TZASC 区域配置寄存器,发现安全区域只覆盖了 DDR 的前半段,后半段未配置。
  4. 修正 TZASC 区域,使安全区域覆盖全部安全 OS 物理内存,并设置 NS 不可访问。
  5. 重新启动后,非安全世界访问该区域触发总线错误,问题解决。
# 读取 TZASC 区域属性示例(伪代码)
tzasc_read_region(0, &base, &size, &attr);
if (attr & TZASC_ATTR_NS) {
    // 该区域允许非安全访问,需确认是否应改为安全
}
注意:TZASC 区域配置通常只能在安全世界修改,且修改后需要确保没有正在进行的访问,否则可能触发总线异常。移植时应先配置 TZASC,再启动非安全 OS。

四、误区与复盘

常见误区一:只配置 MMU 而忽略 TZASC。MMU 只负责翻译和属性标记,真正在从设备侧执行检查的是 TZASC。若 TZASC 未配置,非安全世界仍可能访问到安全物理内存。

常见误区二:把 TZPC 和 TZMA 混用。TZPC 面向外设,TZMA 面向片上存储,两者寄存器模型和粒度不同,不能互相替代。

常见误区三:GIC 分组配置后未同步更新目标 CPU 接口。GIC 安全扩展需要同时配置分发器和 CPU 接口,否则中断可能被挂起但无法送达。

复盘建议:在平台移植初期,先画出一张“地址空间与安全属性映射表”,把 DDR、SRAM、外设、中断分别对应到 TZASC、TZMA、TZPC、GIC 的配置项,再逐项验证。这样可以在早期发现区域重叠、边界未对齐和分组遗漏等问题。

总体而言,TrustZone 硬件组件的调试核心是“一致性”:CPU 的 NS 位、MMU 的页表属性、TZASC/TZPC/TZMA 的区域策略、GIC 的中断分组,必须围绕同一份安全划分方案协同配置。任何一处不一致,都会在运行时表现为访问异常或中断丢失,而这些问题往往只能通过逐级读取寄存器来定位。