安全驱动移植从Linux到TrustZone环境 - 第3节

3.1 OP-TEE 项目概述

OP-TEE(Open Portable Trusted Execution Environment)是一个开源的可信执行环境框架,专为基于 ARM TrustZone 技术的系统设计。它提供了一套完整的 TEE 软件栈,包括安全世界的内核、用户态服务、以及与非安全世界通信的客户端接口。OP-TEE 是 Linaro 社区维护的核心项目,被广泛应用于移动设备、物联网终端和嵌入式系统中。

核心定位:OP-TEE 是 ARM TrustZone 架构下最成熟的开源 TEE 实现之一,支持 ARMv7-A 和 ARMv8-A 架构,提供标准化的 GlobalPlatform TEE API 兼容接口。

3.1.1 OP-TEE 架构总览

OP-TEE 采用分层架构设计,将安全世界与非安全世界明确分离。整个系统由三个主要层次构成:TEE 内核(运行在安全世界)、TEE Supplicant(运行在非安全世界的用户态守护进程)、以及 Client API(供非安全世界应用程序调用)。

OP-TEE 整体架构图 OP-TEE 整体架构 非安全世界 (Normal World) 安全世界 (Secure World) CA (Client App) Client API (libteec) Linux 内核 (TEE 驱动 + OP-TEE 驱动) TEE Supplicant (tee-supplicant) TA (Trusted App) TEE Internal API TEE 内核 (OP-TEE OS) ARM TrustZone 硬件 (Monitor/SMC) SMC 调用 共享内存 CA 通过 Client API 发起 SMC 调用进入安全世界,TA 在 TEE 内核中执行安全逻辑, TEE Supplicant 协助处理文件系统访问等非安全世界资源请求。

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
开发要点:驱动移植到 TEE 环境时,需要将原本在 Linux 内核中执行的硬件访问逻辑,改写为在 TEE 内核中通过安全中断和共享内存机制与硬件交互。TEE 内核不提供完整的 Linux 驱动框架,因此需要手动管理 DMA、中断和寄存器映射。

3.2.2 TEE Supplicant

TEE Supplicant 是运行在非安全世界用户态的守护进程(tee-supplicant),作为安全世界与非安全世界之间的桥梁。当 TA 需要访问非安全世界的资源(如文件系统、网络)时,TEE 内核无法直接操作,必须通过 Supplicant 代理完成。

TEE Supplicant 工作流程 TEE Supplicant 请求代理流程 TA (安全世界) TEE 内核 TEE Supplicant Linux 文件系统 请求文件操作 转发请求 读取/写入 返回结果 结果返回 TA Supplicant 通过共享内存接收 TEE 内核的请求,在非安全世界执行操作后,将结果写回共享内存。

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:释放上下文资源。
驱动移植注意:在 Linux 中,驱动通常通过 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
OP-TEE 开发环境搭建流程 OP-TEE 开发环境搭建流程 安装依赖 同步源码 编译工具链 编译全系统 启动 QEMU 运行 xtest 生成镜像 加载镜像 推荐使用 QEMU v8 模拟器进行开发,支持 ARMv8-A 架构,无需真实硬件即可调试 TA 和驱动。

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 则负责代理非安全世界的资源访问。