3. OP-TEE 架构概览
OP-TEE(Open Portable Trusted Execution Environment)是 Linaro 主导的开源 TEE 解决方案,完全兼容 GlobalPlatform TEE 标准。理解其架构是进行安全固件部署与驱动移植的基础。本章将深入剖析 OP-TEE 的核心组件及其通信模型。
3.1 核心组件架构
OP-TEE 由三个主要组件构成,分别运行在安全世界(Secure World)和普通世界(Normal World),并通过预定义的接口进行交互。
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 通信流程
- CA 发起请求: CA 调用 Client API(如
TEEC_InvokeCommand)。 - Client API 封装: libteec 将请求参数封装成特定结构,并通过
ioctl系统调用传递给 OP-TEE 驱动。 - 驱动处理与 SMC: OP-TEE 驱动(
optee.ko)将请求放入共享内存,并执行 SMC 指令,陷入 EL3 的 Secure Monitor。 - Monitor 路由: Secure Monitor 根据 SMC 功能号,将请求路由到安全世界的 TEE 内核。
- TEE 内核处理: TEE 内核解析请求,找到目标 TA,并将请求转发给 TA 执行。
- TA 执行与返回: TA 执行具体操作,将结果写入共享内存,并通过 TEE 内核返回。
- 结果返回: 结果沿原路返回:TEE 内核 → SMC → OP-TEE 驱动 → Client API → CA。
3.3.2 关键通信机制
- SMC 指令: 由普通世界发起,触发 CPU 从非安全状态切换到安全状态,是通信的“门铃”。
- 共享内存: 一块物理内存区域,被两个世界映射并允许访问,用于传输大量数据。OP-TEE 驱动负责在 Linux 内核中分配和管理这片内存。
- OP-TEE 驱动(optee.ko): 运行在普通世界内核空间的 Linux 内核模块。它负责:
- 处理来自 Client API 的
ioctl请求。 - 管理共享内存的分配与注册。
- 执行 SMC 指令,陷入 Monitor。
- 处理来自 TEE 内核的返回结果和异步通知。
- 处理来自 Client API 的
optee.ko 与具体硬件平台的适配,包括 SMC 调用方式、中断处理、以及内存管理单元的配置。这是连接两个世界的桥梁。
3.3.3 通信模型对比
| 特性 | SMC 调用 | 共享内存 |
|---|---|---|
| 用途 | 触发安全世界执行、传递控制信息 | 批量数据传输 |
| 数据量 | 小(寄存器传递参数) | 大(可达数 MB) |
| 性能开销 | 高(涉及世界切换) | 低(仅内存拷贝) |
| 安全性 | 由硬件保证路由安全 | 需软件保证隔离(非安全世界无法访问安全内存) |
3.4 小结
OP-TEE 的架构清晰地划分了安全与非安全世界的职责。TEE 内核是安全世界的核心,Client API 和 TEE Supplicant 是普通世界的入口与代理。两个世界通过 SMC 指令和共享内存进行高效、安全的通信,而 OP-TEE 驱动则是实现这一通信模型的关键内核组件。理解这一架构,是后续进行驱动移植和固件部署的基石。