4. 开发环境搭建:基于QEMU的OP-TEE模拟环境搭建

本章节聚焦于构建一套完整的OP-TEE开发与调试环境。我们将采用QEMU模拟器作为硬件平台,配置交叉编译工具链,并完成OP-TEE源码的获取与编译。这套环境是后续进行安全固件部署与驱动移植适配的基础,确保开发者能够在没有真实硬件的情况下,高效地进行功能验证与调试。

环境概览: 本教程基于 Ubuntu 22.04 LTS 64-bit 系统,使用 OP-TEE 官方提供的 repo 清单进行源码管理。QEMU 版本为 v7.2.0,交叉编译工具链采用 aarch64-linux-gnu-gcc 11.3。

4.1 环境依赖与基础软件安装

在开始搭建之前,需要确保主机系统安装了必要的依赖包。以下命令将安装编译OP-TEE及QEMU所需的全部基础工具和库。

sudo apt-get update
sudo apt-get install -y \
    android-tools-adb \
    android-tools-fastboot \
    autoconf \
    automake \
    bc \
    bison \
    build-essential \
    ccache \
    cpio \
    cscope \
    curl \
    device-tree-compiler \
    diffutils \
    e2fsprogs \
    expect \
    flex \
    g++ \
    gcc \
    git \
    gdisk \
    gnupg \
    gperf \
    libc6-dev-i386 \
    libelf-dev \
    libglib2.0-dev \
    libgmp-dev \
    libmpc-dev \
    libmpfr-dev \
    libncurses5-dev \
    libpixman-1-dev \
    libssl-dev \
    libtool \
    libusb-1.0-0-dev \
    linux-libc-dev \
    m4 \
    make \
    mtools \
    netcat-openbsd \
    ninja-build \
    openssh-client \
    pkg-config \
    python3 \
    python3-cryptography \
    python3-pip \
    python3-pyelftools \
    python3-serial \
    rsync \
    unzip \
    uuid-dev \
    wget \
    xz-utils \
    zlib1g-dev
版本兼容性提示: 请确保主机系统的 Python 版本为 3.8 或更高。OP-TEE 的构建系统依赖 Python3 的 cryptography 和 pyelftools 库,上述命令已包含安装。

4.2 交叉编译工具链配置

OP-TEE 运行在 ARM 64-bit 架构上,因此需要安装对应的交叉编译工具链。我们使用 Linaro 提供的预编译工具链,它稳定且与 OP-TEE 官方测试环境一致。

步骤 1:下载并解压工具链

cd ~
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
tar -xf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
mv gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu toolchains

步骤 2:设置环境变量

将工具链路径添加到 ~/.bashrc 文件中,以便永久生效。

echo 'export PATH=$HOME/toolchains/bin:$PATH' >> ~/.bashrc
echo 'export CROSS_COMPILE=aarch64-linux-gnu-' >> ~/.bashrc
source ~/.bashrc

步骤 3:验证安装

aarch64-linux-gnu-gcc --version

如果输出显示版本信息,则说明工具链配置成功。

关键路径检查: 确保 $HOME/toolchains/bin 路径下确实存在 aarch64-linux-gnu-gcc 等可执行文件。如果下载的版本号不同,请相应调整路径。

4.3 源码获取与目录结构

OP-TEE 项目采用 repo 工具管理多个 Git 仓库。我们使用官方提供的 manifest 仓库来一次性获取所有必要的源码。

步骤 1:安装 repo 工具

mkdir -p ~/.bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
chmod a+x ~/.bin/repo
echo 'export PATH=$HOME/.bin:$PATH' >> ~/.bashrc
source ~/.bashrc

步骤 2:初始化并同步源码

mkdir -p ~/optee-qemu
cd ~/optee-qemu
repo init -u https://github.com/OP-TEE/manifest.git -m qemu_v8.xml
repo sync -j$(nproc)

步骤 3:了解关键目录结构

同步完成后,~/optee-qemu 目录下将包含以下核心组件:

目录/仓库 描述 编译产物
optee_os OP-TEE 内核(安全世界 OS) tee-pager_v2.bin, tee.bin
optee_client REE 端(Linux)的客户端 API 库和守护进程 libteec.so, tee-supplicant
optee_test 官方测试套件,包含 xtest 和示例 TA xtest, 各种 .ta 文件
build 顶层构建脚本和 Makefile 编译入口
linux Linux 内核源码(REE 端) Image, 设备树
qemu QEMU 模拟器源码 qemu-system-aarch64
edk2 UEFI 固件(用于引导) QEMU_EFI.fd
架构关系: 下图展示了 OP-TEE 在 QEMU 模拟的 Arm 平台上的软件栈层次。安全世界与普通世界通过 SMC(安全监控调用)进行通信。
OP-TEE 在 QEMU 上的软件架构层次 OP-TEE 在 QEMU v8 平台上的软件架构 普通世界 (REE / Linux) 安全世界 (TEE / OP-TEE) REE 用户空间 CA (Client Application) / tee-supplicant REE 内核空间 OP-TEE 驱动 (optee.ko) / 安全监控层 TEE 用户空间 TA (Trusted Application) 动态加载 TEE 内核空间 OP-TEE OS 核心 / 安全中断处理 硬件抽象层 (QEMU 模拟) ARM Cortex-A72 模拟 / GICv3 / UART / 安全内存区域 SMC 调用

4.4 编译OP-TEE与QEMU镜像

OP-TEE 的构建系统基于 Makefile,位于 build 目录下。编译过程将依次构建工具链、QEMU、Linux 内核、OP-TEE OS、OP-TEE Client 以及测试套件。

步骤 1:执行一键编译

cd ~/optee-qemu/build
make -j$(nproc) toolchains
make -j$(nproc) all

步骤 2:编译过程详解

上述命令会触发以下子目标:

  • toolchains:如果本地未检测到交叉编译工具链,则自动下载并解压。
  • all:依次编译 qemu、edk2、linux、optee_os、optee_client、optee_test。

步骤 3:验证编译产物

编译完成后,关键产物位于以下路径:

组件 产物路径 (相对于 build 目录)
QEMU 二进制 ../qemu/build/qemu-system-aarch64
UEFI 固件 ../edk2/Build/ArmVirtQemu-AARCH64/RELEASE_GCC5/FV/QEMU_EFI.fd
Linux 内核镜像 ../linux/arch/arm64/boot/Image
OP-TEE OS 镜像 ../optee_os/out/arm/core/tee-pager_v2.bin
设备树 (DTB) ../linux/arch/arm64/boot/dts/arm/fvp-base-revc.dtb
根文件系统 ../out-br/images/rootfs.cpio.gz
增量编译: 如果只修改了 optee_os 中的代码,可以单独进入 build 目录执行 make optee-os 进行快速增量编译,无需重新编译整个系统。

4.5 启动QEMU模拟环境

编译成功后,可以通过 make run 命令一键启动 QEMU 模拟器。该命令会自动加载 UEFI 固件、Linux 内核、OP-TEE OS 和根文件系统。

启动命令:

cd ~/optee-qemu/build
make run

启动后的终端布局:

QEMU 会打开两个终端窗口:

  • 终端 1 (UART0):Linux 控制台,用于执行 REE 端命令。
  • 终端 2 (UART1):OP-TEE 安全世界控制台,用于查看 TA 加载和 SMC 调用日志。

验证 OP-TEE 运行状态:

在 Linux 控制台(终端 1)中登录后(默认用户 root,无密码),执行以下命令验证 OP-TEE 是否正常工作:

# 检查 tee 设备节点
ls /dev/tee*

# 运行官方测试套件
xtest

# 查看 OP-TEE 版本信息
dmesg | grep -i optee
预期输出: 如果一切正常,ls /dev/tee* 应显示 /dev/teepriv0 和 /dev/tee0 两个设备节点。xtest 将运行数百个测试用例,全部通过则表明环境搭建成功。
QEMU 启动流程与终端交互 QEMU 启动流程与双终端交互 主机开发环境 make run 启动 QEMU 模拟器 QEMU 进程 加载固件与内核 终端模拟 UART0 / UART1 映射 QEMU 模拟的 ARM v8 平台 UEFI 固件 (EDK2) 引导加载程序 OP-TEE OS 安全世界内核 Linux 内核 普通世界内核 根文件系统 Buildroot 构建 终端输出 UART0: Linux 控制台 (登录/调试) UART1: OP-TEE 安全日志

4.6 常见问题与排错指南

在环境搭建过程中,可能会遇到以下常见问题。下表总结了典型错误及其解决方案。

错误现象 可能原因 解决方案
repo sync 失败 网络连接不稳定或 Git 仓库被墙 使用代理或更换镜像源;尝试 repo sync --no-clone-bundle
make toolchains 报错 磁盘空间不足或下载中断 清理 ~/.cache 目录,确保有至少 10GB 空闲空间
编译时出现 undefined reference 交叉编译工具链版本不匹配 删除 toolchains 目录,重新执行 make toolchains
QEMU 启动后黑屏 UEFI 固件或设备树加载失败 检查 build/qemu_v8.mk 中的 QEMU_EFI.fd 和 .dtb 路径是否正确
/dev/tee0 不存在 OP-TEE 驱动未加载或 Linux 内核配置错误 执行 modprobe optee 手动加载驱动;检查内核配置中 CONFIG_OPTEE 是否启用
重要提醒: 如果修改了 optee_os 或 linux 的配置,务必执行 make clean 后再重新编译,否则可能出现缓存导致的诡异错误。

4.7 本章小结

通过本章的学习,您已经完成了以下关键步骤:

  • 安装了 OP-TEE 开发所需的所有系统依赖。
  • 配置了 aarch64-linux-gnu 交叉编译工具链。
  • 使用 repo 工具同步了完整的 OP-TEE 源码树。
  • 成功编译了 QEMU、Linux 内核、OP-TEE OS 及根文件系统。
  • 启动了 QEMU 模拟环境并验证了 OP-TEE 的基本运行。