2. ARM TrustZone基础

ARM TrustZone 是 ARM 处理器中用于构建可信执行环境(TEE)的硬件安全扩展。它并不是一颗独立的安全芯片,而是通过 CPU 内部的安全状态位、总线扩展信号以及内存控制器配合,把同一颗 SoC 划分为两个相互隔离的世界:安全世界(Secure World)与非安全世界(Normal World)。OP-TEE 运行在安全世界中,而 Linux、Android 等富操作系统运行在非安全世界中。理解 TrustZone 的四个核心概念——安全状态、异常等级、世界切换、内存隔离——是后续移植 OP-TEE 的基础。

一、安全世界与非安全世界

TrustZone 在 CPU 中引入了一个名为 SCR.NS(Secure Configuration Register 的 Non-Secure 位)的状态位。当该位为 0 时,处理器处于安全状态;为 1 时处于非安全状态。这个位会随总线信号一起传播到整个 SoC,使外设、内存控制器、中断控制器都能识别当前访问来自哪个世界。

两个世界各自拥有独立的软件栈:安全世界通常包含安全监控器(Secure Monitor)、可信操作系统(如 OP-TEE OS)和可信应用(TA);非安全世界包含引导加载程序、Linux 内核、用户态应用和普通驱动。二者通过受控的入口进行通信,而不是随意互相访问。

关键点:安全世界与非安全世界是“同一颗 CPU 上的两种执行状态”,而不是两颗 CPU。切换靠硬件指令,隔离靠硬件信号,二者缺一不可。

二、异常等级 EL0~EL3

ARMv8-A 引入了异常等级(Exception Level,EL)概念,用于描述特权层级。EL 数字越大,特权越高:

  • EL0:用户态,运行普通应用或可信应用(TA)的用户态部分。
  • EL1:内核态,非安全侧运行 Linux 内核,安全侧运行 OP-TEE OS 内核。
  • EL2:虚拟化层,通常由 Hypervisor 使用,OP-TEE 场景中一般不用。
  • EL3:安全监控器,负责两个世界之间的切换,运行 ARM Trusted Firmware(ATF)等固件。

需要特别注意的是:异常等级与安全状态是两个正交的维度。同一个 EL1 既可能是非安全的 Linux 内核,也可能是安全的 OP-TEE 内核,区别在于当前 SCR.NS 的取值。EL3 是唯一可以自由访问两个世界的层级,因此它成为世界切换的“闸门”。

三、安全状态切换:SMC 与 Monitor

两个世界之间的切换通过 SMC(Secure Monitor Call)指令触发。非安全世界执行 SMC 后,处理器陷入 EL3,由安全监控器根据调用参数决定是转发给 OP-TEE,还是返回非安全世界。OP-TEE 处理完成后,再通过 ERET 返回。

非安全世界 (Linux, NS=1)
        │  SMC #0  (OP-TEE 调用约定)
        ▼
EL3 安全监控器 (ATF, NS 可切换)
        │  保存 NS 上下文,切换到 Secure
        ▼
安全世界 (OP-TEE OS, NS=0)
        │  处理 TA 请求
        ▼
EL3 安全监控器
        │  恢复 NS 上下文,切回 Normal
        ▼
非安全世界 (Linux 继续执行)

整个切换过程涉及寄存器保存与恢复、栈切换、缓存与 TLB 处理。OP-TEE 与 ATF 之间通过一套固定的 SMC 调用号(如 OPTEE_SMC_FUNCID_CALL_WITH_ARG)约定接口,这也是移植时需要重点核对的部分。

四、内存隔离机制

TrustZone 的内存隔离依赖多个硬件组件协同完成:

  • TZASC(TrustZone Address Space Controller):把 DRAM 划分为安全区与非安全区,控制非安全访问能否到达安全内存。
  • TZPC(TrustZone Protection Controller):控制外设的安全属性,决定某外设能否被非安全世界访问。
  • GIC 安全扩展:中断可被配置为 Group 0(安全)或 Group 1(非安全),实现中断隔离。
  • MMU 与页表:安全世界使用独立页表,非安全世界无法映射安全内存。

下表总结了两个世界在关键资源上的差异:

维度安全世界非安全世界
SCR.NS01
典型软件OP-TEE OS、TA、ATFLinux、Android、普通 App
内存访问可访问安全与非安全内存仅可访问非安全内存
中断分组Group 0(FIQ)Group 1(IRQ)
外设访问可访问安全外设受 TZPC 限制

五、典型应用场景

TrustZone 与 OP-TEE 的典型落地场景包括:

  1. 数字版权保护(DRM):解密密钥与解密流程放在安全世界,非安全侧只能拿到明文帧。
  2. 移动支付与生物识别:指纹模板、支付令牌由 TA 保管,Linux 侧无法直接读取。
  3. 安全启动与密钥存储:设备根密钥、证书链在安全世界校验与保存。
  4. 可信时间与安全计数:防止非安全系统被回滚或篡改。
在 OP-TEE 移植中,最常见的验证方式就是:在 Linux 侧执行 optee_example_hello_world,观察 SMC 是否能正确进入安全世界并返回结果。若失败,优先检查 ATF 的 SMC 处理、TZASC 配置和 OP-TEE 的入口地址。

六、常见误区与复盘

初学者容易把 TrustZone 理解为“软件隔离”或“进程隔离”,实际上它是硬件级的状态隔离。另一个常见误区是认为 EL3 一定属于安全世界——EL3 本身是“世界无关”的,它通过 SCR.NS 决定当前代表哪个世界执行。移植时若忽略 TZASC 的地址划分,可能出现安全内存被非安全侧意外访问,导致启动失败或安全漏洞。

ARM TrustZone 双世界与异常等级结构 EL3 安全监控器 (ATF / Monitor) SMC 入口 · 世界切换 · 上下文保存 安全世界 Secure World (SCR.NS=0) EL1: OP-TEE OS 内核 安全页表 · 安全驱动 · SMC 处理 EL0: 可信应用 TA 密钥运算 · DRM · 生物识别 安全内存 / 安全外设 TZASC 保护 · Group 0 中断 仅安全世界可访问 非安全世界 Normal World (SCR.NS=1) EL1: Linux 内核 非安全页表 · 普通驱动 · SMC 调用 EL0: 用户态应用 Android App · 普通服务 非安全内存 / 普通外设 TZPC 限制 · Group 1 中断 无法访问安全内存 SMC 进入安全 ERET 返回非安全 硬件隔离边界(TZASC / TZPC / GIC) EL 决定特权层级,SCR.NS 决定安全状态,二者正交组合