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