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 发出访问之前”,属于第一道闸门。
二、协同工作流程
以一次安全世界读取 DDR 中受保护数据为例,完整链路如下:
- CPU 处于安全状态,MMU 查页表,页表项标记为 Secure,允许读;
- 访问请求携带 NS=0 属性发往总线;
- 请求到达 TZASC,TZASC 查区域配置表,确认目标地址属于安全区域且当前 master 允许访问;
- TZASC 放行,DRAM 控制器执行读取;
- 若此时是非安全世界发起同一地址访问,MMU 页表标记为 Non-secure 或直接无映射,访问在 CPU 侧即被拦截;即使绕过 MMU,TZASC 也会因 NS=1 与区域安全属性不匹配而返回错误。
这种“双重校验”意味着:只配置 TZASC 而不配置 MMU,安全世界可能因页表缺失而无法访问自己的内存;只配置 MMU 而不配置 TZASC,非安全世界可能通过物理地址直接绕过虚拟映射访问安全内存。两者缺一不可。
三、关键配置参数与对照
下表列出四类机制在典型 SoC 中的配置位置与作用范围,便于工程对照:
| 机制 | 典型位置 | 控制粒度 | 判断依据 | 失效后果 |
|---|---|---|---|---|
| 安全地址空间 | 系统地址映射表 | 全局地址段 | 地址范围 + NS 位 | 安全资源被误标为非安全 |
| TZASC | DRAM 控制器前 | 区域(Region) | 地址 + master + NS | 非安全 master 读写安全 DDR |
| TZMA | 片上 SRAM/ROM 前 | 小块地址区间 | 地址区间 + NS | 安全 SRAM 被非安全代码读取 |
| MPU | CPU 内部 | 区域(Region) | 权限 + 安全属性 | 安全任务越权访问外设 |
| MMU | CPU 内部 | 页(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 设置区域基址与属性,确保安全任务只能访问被授权的安全外设。
五、常见误区与复盘
- 误区一:只配 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 的内存隔离目标。