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 驱动与其通信。

TrustZone 双世界与 OP-TEE 组件架构 普通世界 Normal World 用户态应用 / TEE Client API libteec.so · CA 调用入口 Linux 内核 OP-TEE 驱动 optee.ko · SMC 调用通道 REE 文件系统 / 共享内存 /dev/tee0 · /dev/teepriv0 非安全内存 / 非安全外设 安全世界 Secure World 可信应用 TA(Trusted Application) GlobalPlatform TEE Internal API OP-TEE OS 内核 调度 · 内存管理 · 系统调用 安全服务与驱动 加解密 · 密钥库 · 安全存储 安全内存 / 安全外设 EL3 Secure Monitor(ARM Trusted Firmware) SMC 上下文切换 · 世界切换 · 中断路由 SMC 返回结果

二、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 隔离。
提示:OP-TEE 的 TA 分为早期 TA(Early TA,随固件加载)与普通 TA(存放在 REE 文件系统,由 Supplicant 加载)。后者启动时涉及文件读取与校验,是冷启动性能的重要观测点。

五、常见误区与复盘

误区一:把 TEE 当成“更安全的 Linux”。 TEE 的定位是最小可信计算基,功能应尽量精简,不应把普通世界的复杂业务整体搬入安全世界。
误区二:认为共享内存是“零拷贝”。 普通世界与安全世界之间的内存映射仍需页表操作与缓存维护,频繁小数据交互会放大开销。
误区三:忽略 SMC 的切换成本。 每次世界切换都涉及上下文保存、缓存与 TLB 影响,批量合并命令通常优于高频小调用。

复盘来看,掌握 TEE 与 OP-TEE 的关键在于建立“双世界 + 标准 API + 共享内存通道”的整体图景:TrustZone 提供硬件隔离,OP-TEE 提供安全世界运行时,GlobalPlatform API 提供标准调用契约,而共享内存则是两个世界之间数据流动的物理载体。后续的性能优化,都将围绕这条数据通路展开。