3. OP-TEE 架构概览

OP-TEE(Open Portable Trusted Execution Environment)是 Linaro 主导的开源 TEE 解决方案,完全兼容 GlobalPlatform TEE 标准。理解其架构是进行安全固件部署与驱动移植的基础。本章将深入剖析 OP-TEE 的核心组件及其通信模型。

3.1 核心组件架构

OP-TEE 由三个主要组件构成,分别运行在安全世界(Secure World)和普通世界(Normal World),并通过预定义的接口进行交互。

架构要点: OP-TEE 采用 Client-Server 模型,普通世界的应用通过 Client API 发起请求,经由 TEE Supplicant 和底层驱动,最终由安全世界的 TEE 内核处理。
OP-TEE 核心组件架构图 普通世界(Normal World / REE) Client Application (CA) Client API (libteec) TEE Supplicant 安全世界(Secure World / TEE) Trusted Application (TA) TEE Internal API TEE Kernel (OP-TEE OS) SMC 异常 / 共享内存

3.1.1 TEE 内核(OP-TEE OS)

运行在安全世界,是 OP-TEE 的核心。它是一个轻量级的安全操作系统内核,负责管理安全内存、调度 Trusted Application (TA)、提供加密服务以及处理来自普通世界的安全调用。

  • 安全内存管理: 管理受硬件保护的安全内存区域,防止普通世界访问。
  • TA 生命周期管理: 加载、执行和销毁 TA 实例。
  • 核心加密服务: 提供硬件加速或软件实现的加密算法。
  • 中断与异常处理: 处理安全世界的中断和 SMC 异常。

3.1.2 TEE Supplicant

运行在普通世界的一个用户空间守护进程(tee-supplicant)。它充当 TEE 内核在普通世界的代理,处理那些需要普通世界资源(如文件系统、网络)的请求。

  • 文件操作代理: 当 TA 需要读写普通世界文件系统时,由 Supplicant 代为执行。
  • Socket 通信代理: 处理 TA 发起的网络连接请求。
  • RPMB 操作: 协助 TA 访问 Replay Protected Memory Block。

3.1.3 Client API(libteec)

运行在普通世界用户空间的库,为 Client Application (CA) 提供与 TA 通信的标准接口。它封装了与 TEE 驱动交互的细节,遵循 GlobalPlatform TEE Client API 规范。

  • 上下文管理: TEEC_InitializeContext / TEEC_FinalizeContext。
  • 会话管理: TEEC_OpenSession / TEEC_CloseSession。
  • 命令调用: TEEC_InvokeCommand。
  • 共享内存管理: TEEC_RegisterSharedMemory / TEEC_AllocateSharedMemory。

3.2 组件功能对比

组件 运行环境 主要职责 关键接口/规范
TEE 内核 安全世界(EL1) 安全调度、内存管理、加密服务 GlobalPlatform TEE Core API
TEE Supplicant 普通世界(用户态) 文件/网络等资源代理 OP-TEE 私有协议
Client API 普通世界(用户态) CA 与 TA 通信接口 GlobalPlatform TEE Client API
TA 安全世界(用户态) 实现具体安全业务逻辑 GlobalPlatform TEE Internal API

3.3 安全世界与普通世界通信模型

两个世界之间的通信是 OP-TEE 架构的核心。通信通过 SMC(Secure Monitor Call) 指令和 共享内存 机制实现,由底层的 OP-TEE 驱动 和 ARM TrustZone 硬件协同完成。

3.3.1 通信流程

  1. CA 发起请求: CA 调用 Client API(如 TEEC_InvokeCommand)。
  2. Client API 封装: libteec 将请求参数封装成特定结构,并通过 ioctl 系统调用传递给 OP-TEE 驱动。
  3. 驱动处理与 SMC: OP-TEE 驱动(optee.ko)将请求放入共享内存,并执行 SMC 指令,陷入 EL3 的 Secure Monitor。
  4. Monitor 路由: Secure Monitor 根据 SMC 功能号,将请求路由到安全世界的 TEE 内核。
  5. TEE 内核处理: TEE 内核解析请求,找到目标 TA,并将请求转发给 TA 执行。
  6. TA 执行与返回: TA 执行具体操作,将结果写入共享内存,并通过 TEE 内核返回。
  7. 结果返回: 结果沿原路返回:TEE 内核 → SMC → OP-TEE 驱动 → Client API → CA。
安全世界与普通世界通信流程 CA Client API OP-TEE 驱动 SMC TEE 内核 TA 共享内存(Shared Memory) 读写 读写

3.3.2 关键通信机制

  • SMC 指令: 由普通世界发起,触发 CPU 从非安全状态切换到安全状态,是通信的“门铃”。
  • 共享内存: 一块物理内存区域,被两个世界映射并允许访问,用于传输大量数据。OP-TEE 驱动负责在 Linux 内核中分配和管理这片内存。
  • OP-TEE 驱动(optee.ko): 运行在普通世界内核空间的 Linux 内核模块。它负责:
    • 处理来自 Client API 的 ioctl 请求。
    • 管理共享内存的分配与注册。
    • 执行 SMC 指令,陷入 Monitor。
    • 处理来自 TEE 内核的返回结果和异步通知。
开发提示: 在移植 OP-TEE 驱动时,核心工作就是实现 optee.ko 与具体硬件平台的适配,包括 SMC 调用方式、中断处理、以及内存管理单元的配置。这是连接两个世界的桥梁。

3.3.3 通信模型对比

特性 SMC 调用 共享内存
用途 触发安全世界执行、传递控制信息 批量数据传输
数据量 小(寄存器传递参数) 大(可达数 MB)
性能开销 高(涉及世界切换) 低(仅内存拷贝)
安全性 由硬件保证路由安全 需软件保证隔离(非安全世界无法访问安全内存)

3.4 小结

OP-TEE 的架构清晰地划分了安全与非安全世界的职责。TEE 内核是安全世界的核心,Client API 和 TEE Supplicant 是普通世界的入口与代理。两个世界通过 SMC 指令和共享内存进行高效、安全的通信,而 OP-TEE 驱动则是实现这一通信模型的关键内核组件。理解这一架构,是后续进行驱动移植和固件部署的基石。