3. TrustZone技术概览
TrustZone 是 ARM 处理器中用于构建可信执行环境的核心安全扩展。它并不是一个独立的安全芯片,也不是简单的软件沙箱,而是从 CPU 流水线、总线、内存控制器到外设接口都参与的一套硬件隔离机制。理解 TrustZone,关键要抓住四个词:双世界、地址空间隔离、安全状态切换、中断与异常路由。只有这四者协同工作,安全启动和信任根才有可靠的运行基础。
一、核心原理:安全世界与普通世界
TrustZone 将处理器的运行环境划分为两个逻辑世界:安全世界(Secure World)和普通世界(Normal World)。安全世界运行可信操作系统、安全监控程序和信任根相关代码;普通世界运行 Linux、Android、RTOS 等通用操作系统。两个世界可以分时复用同一个物理 CPU 核心,但通过硬件信号区分当前的安全状态。
CPU 内部有一个关键状态位,通常称为 NS 位(Non-Secure bit)。当 NS=0 时,处理器处于安全状态;当 NS=1 时,处理器处于非安全状态。这个位会随总线事务一起传播,内存控制器和外设控制器据此判断是否允许访问。也就是说,隔离不是靠操作系统“自觉”,而是由硬件在总线层面强制执行。
核心结论:TrustZone 的安全边界由硬件状态位和总线过滤共同维护,软件无法绕过。安全世界可以访问普通世界资源,普通世界不能访问安全世界资源,除非通过受控入口。
二、地址空间隔离:同一物理地址,不同安全视图
TrustZone 的地址空间隔离常被误解为“安全世界和普通世界使用两套完全不同的内存”。更准确地说,物理内存被划分为安全区域和非安全区域,而 CPU 在不同安全状态下对同一地址可能看到不同的资源。例如,一段物理内存可以被配置为仅安全可访问,普通世界访问时会触发总线错误或返回错误数据。
地址空间隔离通常涉及以下层次:
- MMU 页表隔离:安全世界和普通世界各自拥有独立的页表基址,切换世界时切换 TTBR,避免地址翻译泄漏。
- 总线过滤器:如 TZASC(TrustZone Address Space Controller)对 DRAM 区域进行安全/非安全划分。
- 外设隔离:通过 TZPC 或类似控制器,将外设分配给安全世界或普通世界。
- 缓存与 TLB:安全状态切换时需清理或隔离缓存和 TLB,防止侧信道和残留数据泄漏。
下面这张图展示了 TrustZone 的整体架构关系:CPU 核心、安全状态位、总线过滤器、内存分区、外设分区以及安全监控程序之间的连接关系。
三、中断与异常路由:安全中断如何进入安全世界
在 TrustZone 中,中断和异常也需要区分安全属性。ARM 提供了 FIQ、IRQ 以及 Monitor 异常等机制来实现路由。典型做法是:安全中断被配置为 FIQ,普通中断为 IRQ。当安全中断到来时,CPU 可以直接进入安全世界的异常向量;当普通中断到来时,进入普通世界处理。若普通世界需要请求安全服务,则通过 SMC 指令触发 Monitor 异常,切换到安全世界。
中断路由的关键配置包括:
- GIC 安全扩展:GICv2/GICv3 支持中断分组,可将中断配置为 Group 0(安全)或 Group 1(非安全)。
- SCR 寄存器:Secure Configuration Register 控制 FIQ、IRQ、外部中止等异常是否路由到 Monitor。
- VBAR:安全世界和普通世界各自拥有异常向量基址,切换时同步切换。
- 中断优先级与抢占:安全中断通常具有更高优先级,确保信任根服务及时响应。
四、典型场景:安全启动中的世界切换
以安全启动为例,系统上电后首先运行 BootROM,此时 CPU 处于安全状态。BootROM 验证一级引导程序后,将其加载到安全内存并跳转执行。随后安全引导程序初始化 TrustZone 控制器,划分安全/非安全内存和外设,并启动安全 OS。当需要启动普通世界时,安全引导程序通过 SMC 指令切换到非安全状态,跳转到普通世界引导程序。
上电复位
→ BootROM(安全状态,NS=0)
→ 验证并加载 BL2 到安全 SRAM
→ BL2 初始化 TZASC / TZPC / GIC 安全分组
→ 加载安全 OS 到安全 DRAM
→ 配置 Monitor 向量与 SMC 入口
→ 通过 SMC 切换到普通世界(NS=1)
→ 普通世界引导 Linux / Android
→ 运行时通过 SMC 请求安全服务
五、常见误区与复盘
误区一:认为 TrustZone 可以保护所有内存。实际上,只有被 TZASC 等控制器明确配置为安全区域的内存才受保护,未配置区域仍可能被普通世界访问。
误区二:认为安全世界一定比普通世界“更安全”。如果安全世界代码存在漏洞,攻击者仍可通过 SMC 接口发起攻击,因此安全世界的攻击面同样需要严格审计。
误区三:忽略缓存和 TLB 的隔离。世界切换时若未正确清理,可能导致安全数据残留并被普通世界推测访问。
六、关键配置与检查清单
| 检查项 | 说明 | 典型寄存器/组件 |
|---|---|---|
| 安全状态位 | 确认 NS 位随异常和总线事务正确传播 | SCR.NS |
| 内存分区 | 安全 DRAM/SRAM 区域仅安全可访问 | TZASC |
| 外设分配 | 加密引擎、定时器等外设归属明确 | TZPC |
| 中断分组 | 安全中断走 FIQ/Group 0,普通中断走 IRQ/Group 1 | GICD_IGROUPR |
| 异常向量 | 安全/普通世界 VBAR 独立且切换正确 | VBAR_EL3 / VBAR_EL1 |
| 世界切换入口 | SMC 调用参数校验、返回值检查 | Monitor / SMC 指令 |
总结来说,TrustZone 通过安全状态位、地址空间过滤、中断分组和受控世界切换,构建了一个硬件强制的双世界隔离环境。对于安全启动与信任根工程而言,正确配置 TZASC、TZPC、GIC 和 Monitor 是基础,而持续审计 SMC 接口和安全世界代码则是长期安全的关键。