安全驱动移植从Linux到TrustZone环境 - 第3节
3.1 OP-TEE 项目概述
OP-TEE(Open Portable Trusted Execution Environment)是一个开源的可信执行环境框架,专为基于 ARM TrustZone 技术的系统设计。它提供了一套完整的 TEE 软件栈,包括安全世界的内核、用户态服务、以及与非安全世界通信的客户端接口。OP-TEE 是 Linaro 社区维护的核心项目,被广泛应用于移动设备、物联网终端和嵌入式系统中。
3.1.1 OP-TEE 架构总览
OP-TEE 采用分层架构设计,将安全世界与非安全世界明确分离。整个系统由三个主要层次构成:TEE 内核(运行在安全世界)、TEE Supplicant(运行在非安全世界的用户态守护进程)、以及 Client API(供非安全世界应用程序调用)。
3.2 核心组件详解
3.2.1 TEE 内核(OP-TEE OS)
TEE 内核是 OP-TEE 在安全世界中的核心操作系统,运行在 ARM TrustZone 的安全世界(Secure World)中。它负责管理安全内存、调度 TA(Trusted Application)、提供密码学服务,并处理来自非安全世界的 SMC(Secure Monitor Call)请求。
| 特性 | 说明 |
|---|---|
| 内核类型 | 轻量级实时操作系统,非 Linux 内核 |
| 调度单元 | TA 实例(每个 TA 是一个独立的安全任务) |
| 内存管理 | 安全内存隔离,非安全世界无法直接访问 |
| 密码学支持 | 硬件加速密码引擎(如 ARM CryptoCell) |
| API 标准 | GlobalPlatform TEE Internal API |
3.2.2 TEE Supplicant
TEE Supplicant 是运行在非安全世界用户态的守护进程(tee-supplicant),作为安全世界与非安全世界之间的桥梁。当 TA 需要访问非安全世界的资源(如文件系统、网络)时,TEE 内核无法直接操作,必须通过 Supplicant 代理完成。
3.2.3 Client API(libteec)
Client API 是 OP-TEE 提供给非安全世界应用程序(CA)的接口库,封装了与 TEE 内核通信的细节。CA 通过调用 libteec 提供的函数,可以打开 TEE 会话、调用 TA 中的安全函数、以及管理共享内存。
核心 API 函数包括:
- TEEC_InitializeContext:初始化 TEE 上下文,建立与 TEE 驱动的连接。
- TEEC_OpenSession:打开与指定 TA 的安全会话。
- TEEC_InvokeCommand:调用 TA 中注册的命令(安全服务)。
- TEEC_CloseSession:关闭会话。
- TEEC_FinalizeContext:释放上下文资源。
ioctl 或 read/write 与用户态交互。在 OP-TEE 环境中,CA 必须通过 Client API 发起 SMC 调用,不能直接操作设备文件。这意味着原有的 Linux 用户态驱动接口需要重构为 TA 命令调用。
3.3 开发环境搭建
搭建 OP-TEE 开发环境是进行安全驱动移植的第一步。推荐使用基于 QEMU 的模拟环境进行开发和调试,避免频繁烧录硬件。以下步骤基于 Ubuntu 22.04 LTS 系统。
3.3.1 环境依赖安装
首先安装必要的编译工具和依赖库:
sudo apt-get update
sudo apt-get install -y \
git wget curl python3 python3-pip \
build-essential cmake ccache \
libssl-dev libgmp-dev libmpc-dev \
device-tree-compiler \
qemu-system-arm qemu-efi \
expect flex bison \
gcc-arm-linux-gnueabihf \
gcc-aarch64-linux-gnu
3.3.2 获取 OP-TEE 源码
OP-TEE 官方提供了 repo 工具来管理多个子项目。使用以下命令同步最新代码:
mkdir ~/optee
cd ~/optee
repo init -u https://github.com/OP-TEE/manifest.git -m qemu_v8.xml
repo sync -j$(nproc)
同步完成后,目录结构如下:
| 目录/文件 | 说明 |
|---|---|
optee_os/ |
TEE 内核源码(OP-TEE OS) |
optee_client/ |
Client API 库(libteec)和 CA 示例 |
optee_test/ |
TA 和 CA 测试用例 |
linux/ |
Linux 内核源码(包含 OP-TEE 驱动) |
build/ |
构建脚本和 Makefile |
3.3.3 编译与运行
进入 build 目录,执行编译命令:
cd build
make -j$(nproc) toolchains
make -j$(nproc) all
编译完成后,启动 QEMU 模拟器:
make run-only
QEMU 启动后,会进入 U-Boot 引导,自动加载 Linux 内核和 OP-TEE OS。登录后(默认用户 root,无密码),可以运行测试用例验证环境:
# 在 QEMU 终端中执行
xtest
3.3.4 验证环境
运行 xtest 后,如果所有测试用例通过(显示 PASSED),说明环境搭建成功。常见的测试用例包括:
- 1001-1008:基础 TA 调用测试
- 2001-2010:密码学功能测试(AES、RSA、SHA 等)
- 4001-4005:共享内存与大数据传输测试
build 目录下执行 make run-only DEBUG=1 可以启用调试输出。TEE 内核的日志通过 dmesg 在非安全世界查看,TA 的日志通过 tee-supplicant 输出到系统日志。
3.4 本章小结
本章介绍了 OP-TEE 项目的整体架构、三大核心组件(TEE 内核、TEE Supplicant、Client API)的功能与交互关系,并详细说明了开发环境的搭建步骤。理解这些基础概念是后续进行安全驱动移植的前提——驱动开发者需要明确:在 TrustZone 环境中,硬件访问逻辑将从 Linux 内核迁移到 TEE 内核,通信方式从 ioctl 转变为 SMC 调用 + 共享内存,而 TEE Supplicant 则负责代理非安全世界的资源访问。