4. 内存隔离机制

TrustZone 的内存隔离并不是靠某一个硬件模块单独完成的,而是由“地址空间划分 + 总线级访问控制 + 处理器级权限检查”三层机制协同构成。理解这四类组件(安全地址空间、TZASC、TZMA、MPU/MMU)各自的职责边界与配合关系,是排查“为什么安全世界能访问、非安全世界被拒绝”这类问题的关键。

一、核心原理:三层隔离的职责分工

第一层是安全地址空间划分。系统把物理地址空间划分为安全区(Secure)与非安全区(Non-secure),由地址位或安全属性信号(如 NS 位)标记。它决定了“哪些地址属于安全资源”,是后续所有控制器的判断依据。

第二层是总线级访问控制,由 TZASC(TrustZone Address Space Controller)和 TZMA(TrustZone Memory Adapter)承担。TZASC 通常挂在 DRAM 控制器前,把外部 DDR 划分为多个区域,每个区域可配置为安全或非安全,并支持按主设备(master)做访问过滤;TZMA 则多用于片上 SRAM/ROM,把小块内存按地址区间切分为安全与非安全段。它们工作在“事务经过总线时”,不依赖 CPU 是否处于安全状态,而是看事务携带的 NS 属性。

第三层是处理器级权限检查,由 MPU(Memory Protection Unit)和 MMU(Memory Management Unit)完成。MPU 提供区域级的读/写/执行权限与安全属性检查,适合裸机或 RTOS;MMU 在 MPU 基础上增加虚拟地址到物理地址的映射,并可在页表项中标记安全属性。它们工作在“CPU 发出访问之前”,属于第一道闸门。

关键结论:MPU/MMU 决定“CPU 能不能发起这次访问”,TZASC/TZMA 决定“这次访问到达内存时是否被放行”。两者必须同时通过,访问才会成功。

二、协同工作流程

以一次安全世界读取 DDR 中受保护数据为例,完整链路如下:

  1. CPU 处于安全状态,MMU 查页表,页表项标记为 Secure,允许读;
  2. 访问请求携带 NS=0 属性发往总线;
  3. 请求到达 TZASC,TZASC 查区域配置表,确认目标地址属于安全区域且当前 master 允许访问;
  4. TZASC 放行,DRAM 控制器执行读取;
  5. 若此时是非安全世界发起同一地址访问,MMU 页表标记为 Non-secure 或直接无映射,访问在 CPU 侧即被拦截;即使绕过 MMU,TZASC 也会因 NS=1 与区域安全属性不匹配而返回错误。

这种“双重校验”意味着:只配置 TZASC 而不配置 MMU,安全世界可能因页表缺失而无法访问自己的内存;只配置 MMU 而不配置 TZASC,非安全世界可能通过物理地址直接绕过虚拟映射访问安全内存。两者缺一不可。

三、关键配置参数与对照

下表列出四类机制在典型 SoC 中的配置位置与作用范围,便于工程对照:

机制典型位置控制粒度判断依据失效后果
安全地址空间系统地址映射表全局地址段地址范围 + NS 位安全资源被误标为非安全
TZASCDRAM 控制器前区域(Region)地址 + master + NS非安全 master 读写安全 DDR
TZMA片上 SRAM/ROM 前小块地址区间地址区间 + NS安全 SRAM 被非安全代码读取
MPUCPU 内部区域(Region)权限 + 安全属性安全任务越权访问外设
MMUCPU 内部页(Page)页表项 + NS虚拟地址映射到错误物理页

四、典型场景与配置片段

在 ARM TrustZone 系统中,TZASC 通常通过安全世界启动代码配置。以下为示意性寄存器配置片段,用于把 DDR 的 0x8000_0000–0x8FFF_FFFF 设为安全区域:

/* TZASC region 0 配置示例 */
TZASC_REGION_ATTRIBUTES0 = 0x00000001;  /* 使能 region 0 */
TZASC_REGION_BASE_LOW0   = 0x80000000;  /* 基地址低 32 位 */
TZASC_REGION_BASE_HIGH0  = 0x00000000;  /* 基地址高 32 位 */
TZASC_REGION_TOP_LOW0    = 0x8FFFFFFF;  /* 结束地址低 32 位 */
TZASC_REGION_TOP_HIGH0   = 0x00000000;
TZASC_REGION_ATTRIBUTES0 |= (1 << 2);   /* 安全区域,仅安全 master 可访问 */

对应地,MMU 页表中该段应标记为 Secure。若使用 ARMv8-A 的 TTBR 与页表项,安全属性由页表项中的 NS 位和 AP 位共同决定。MPU 侧则通过 RBAR/RASR 设置区域基址与属性,确保安全任务只能访问被授权的安全外设。

调试建议:当出现“安全世界访问 DDR 失败”时,先确认 MMU 页表是否已映射该地址,再检查 TZASC 区域是否覆盖该地址且 master 允许。两个检查点顺序不能颠倒,否则容易误判。

五、常见误区与复盘

  • 误区一:只配 TZASC 就认为隔离完成。 若 MMU 未把安全内存映射给安全世界,安全任务同样无法访问;隔离与可用性要同时满足。
  • 误区二:忽略 master 维度。 TZASC 不仅看地址,还看发起访问的 master。DMA 控制器若被配置为非安全 master,即使地址在安全区也会被拒绝。
  • 误区三:TZMA 与 TZASC 混用边界不清。 TZMA 适合小容量片上内存,TZASC 适合大容量 DDR;把 DDR 交给 TZMA 会导致区域粒度不足。
  • 误区四:MPU 区域重叠未处理。 多个 MPU 区域重叠时,优先级和属性合并规则必须明确,否则会出现“预期拒绝却放行”的权限漏洞。

复盘时建议按“CPU 侧权限 → 总线侧区域 → 目标内存属性”三段式排查,并保留每次访问的 NS 属性与 master ID 日志。只有把地址空间、TZASC/TZMA、MPU/MMU 四者视为一条完整链路,才能稳定实现 TrustZone 的内存隔离目标。

TrustZone 内存隔离协同链路 CPU 核心 MPU / MMU 权限 + 安全属性检查 虚拟地址 → 物理地址 系统总线 / 互连 事务携带 NS 属性 + master ID 地址 + 安全标记 TZASC DDR 区域过滤 按 master 放行 TZMA SRAM/ROM 切分 小块安全区间 目标内存 DDR / SRAM / ROM(安全区 + 非安全区) 访问请求 放行 放行 非安全访问被拦截 隔离层次 CPU 侧:MPU / MMU 总线侧:NS 属性传递 TZASC:DDR 区域控制 TZMA:片上内存切分 目标内存:安全/非安全区