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 核心、安全状态位、总线过滤器、内存分区、外设分区以及安全监控程序之间的连接关系。

ARM CPU 核心 流水线 / 寄存器 / MMU / 缓存 NS 安全状态位 安全世界 Secure World 可信 OS / TEE 安全监控程序 Monitor 信任根 / 密钥服务 NS=0 普通世界 Normal World Linux / Android / RTOS 用户应用 / 驱动 非安全服务 NS=1 安全监控程序 Monitor SMC 指令 / 世界切换 系统总线 + TrustZone 过滤器 NS 位随事务传播 · TZASC / TZPC 执行访问控制 安全内存区域 SRAM / DRAM 安全段 仅 NS=0 可访问 非安全内存区域 通用 DRAM / 共享内存 NS=0 与 NS=1 均可访问 安全外设 加密引擎 / 定时器 / GPIO 按安全属性分配 SMC 受控切换

三、中断与异常路由:安全中断如何进入安全世界

在 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 接口和安全世界代码则是长期安全的关键。