2. TEE 与 OP-TEE 基础
在移动、车载、支付与物联网设备中,安全需求往往要求“同一颗芯片上同时运行两个互不信任的世界”。TEE(Trusted Execution Environment,可信执行环境)正是为此设计的隔离运行环境:它与普通操作系统并存,却拥有独立的执行空间、内存与外设访问策略。OP-TEE 是开源 TEE 实现中最具代表性的一员,理解它的架构与组件,是后续学习共享内存与性能优化的前提。
一、核心原理:TrustZone 如何切分两个世界
ARM TrustZone 是硬件级安全扩展,它把 CPU 的每次执行都标记为两种安全状态之一:安全世界(Secure World)与普通世界(Normal World)。两者并非两个独立 CPU,而是同一物理核心在不同安全状态下的运行模式。切换通过 SMC(Secure Monitor Call)指令进入 EL3 的 Secure Monitor 完成,由它保存和恢复上下文。
关键隔离点包括:
- 内存隔离:通过 TZASC/TZMA 等控制器,把 DRAM 与外设划分为安全区与非安全区,普通世界无法直接访问安全内存。
- 中断隔离:GIC 支持将中断分组,安全中断只能由安全世界处理,避免普通世界窃听或伪造。
- 外设隔离:如加解密引擎、密钥存储、安全时钟等可被配置为仅安全世界可访问。
- 执行状态隔离:普通世界代码无法读取安全世界的寄存器与页表。
因此,TEE 的安全边界不是“软件沙箱”,而是由硬件强制执行的隔离墙。OP-TEE 运行在安全世界,通常以 S-EL1 特权级执行;普通世界的 Linux/Android 通过 OP-TEE 驱动与其通信。
二、OP-TEE 的组件构成
OP-TEE 并非单一程序,而是一套协同工作的组件集合。理解各组件的职责,有助于定位性能瓶颈与共享内存路径。
| 组件 | 运行位置 | 主要职责 |
|---|---|---|
| OP-TEE OS | 安全世界 S-EL1 | TA 调度、内存管理、系统调用、安全存储 |
| OP-TEE Client(libteec) | 普通世界用户态 | 提供 TEE Client API,供 CA 调用 |
| OP-TEE Linux 驱动 | 普通世界内核态 | 字符设备 /dev/tee0,转发 SMC 请求 |
| OP-TEE Supplicant | 普通世界用户态 | 代理 REE 文件系统访问,支撑安全存储 |
| ARM Trusted Firmware | EL3 | Secure Monitor,完成世界切换与上下文保存 |
三、GlobalPlatform API 与调用流程
GlobalPlatform 定义了 TEE 的标准接口,使 TA 与 CA 可以跨厂商移植。核心分为两套 API:
- TEE Client API:运行在普通世界,供 CA 使用,负责连接 TA、打开会话、调用命令、关闭会话。
- TEE Internal API:运行在安全世界,供 TA 使用,提供内存分配、加解密、安全存储、时间等可信服务。
一次典型调用流程如下:
CA: TEEC_InitializeContext()
CA: TEEC_OpenSession() → 驱动 → SMC → OP-TEE OS
TA: TA_OpenSessionEntryPoint()
CA: TEEC_InvokeCommand() → 参数经共享内存传递
TA: TA_InvokeCommandEntryPoint()
CA: TEEC_CloseSession()
CA: TEEC_FinalizeContext()
其中 TEEC_InvokeCommand 的参数传递方式直接决定性能:小参数可走寄存器,大块数据必须通过共享内存(TEEC_MEMREF_TEMP_* 或 TEEC_MEMREF_WHOLE)在普通世界与安全世界之间映射。这正是后续章节要重点优化的对象。
四、典型应用场景
- 移动支付:指纹/人脸模板与支付密钥保存在 TEE,普通系统被攻破也无法直接读取。
- 数字版权保护:DRM 密钥与解密在安全世界完成,明文不进入普通世界。
- 安全启动与密钥存储:设备唯一密钥、证书链由 TEE 保管并参与验签。
- 车载与工业:安全网关、身份认证、固件防回滚等场景依赖 TEE 隔离。
五、常见误区与复盘
复盘来看,掌握 TEE 与 OP-TEE 的关键在于建立“双世界 + 标准 API + 共享内存通道”的整体图景:TrustZone 提供硬件隔离,OP-TEE 提供安全世界运行时,GlobalPlatform API 提供标准调用契约,而共享内存则是两个世界之间数据流动的物理载体。后续的性能优化,都将围绕这条数据通路展开。