4、硬件基础环境:搭建TEE开发所需的硬件平台

做TEE开发,第一步就是搞定硬件环境。说白了,你得有个能跑TEE的地方。

我个人习惯把这条路分成两条:一条是真刀真枪的物理板子,另一条是纯软件的模拟器。两条路各有各的用处,咱们今天都聊透。

4.1 两条路线:物理板 vs 模拟器

先看个对比,心里有个底:

对比项 Raspberry Pi 4 + OP-TEE QEMU 模拟器
硬件成本 约 400-600 元(板子+配件) 0 元(纯软件)
真实感 完全真实,能体验安全启动流程 模拟环境,部分硬件特性无法复现
调试难度 需要串口线、SD卡烧录等物理操作 一键启动,GDB 调试非常方便
适用场景 产品原型验证、安全启动实战 快速学习、代码开发、CI/CD 集成
启动速度 几十秒(含烧录时间) 几秒钟

我的建议是:学习阶段先用 QEMU,跑通了再上真板子。我在项目中吃过亏,一开始就在树莓派上折腾,结果每次烧录都要等两分钟,改个配置又得重来……后来学乖了,先在模拟器上把逻辑调通,最后再部署到物理板子上,效率翻倍。

4.2 方案一:Raspberry Pi 4 + OP-TEE

4.2.1 硬件清单

你需要准备这些东西:

  • Raspberry Pi 4 Model B(建议 4GB 或 8GB 内存版本)
  • MicroSD 卡(至少 16GB,Class 10 以上)
  • USB-C 电源(5V/3A,别用手机充电头凑合)
  • 串口调试线(USB 转 TTL,3.3V 电平)
  • 网线或 WiFi(用于 SSH 连接)
注意:树莓派 4 的启动方式有点特殊。它默认从 SD 卡启动,但如果你要玩安全启动,还得准备一块 SPI Flash 芯片(比如 W25Q64)。我曾经因为没买这个,卡在安全启动验证环节整整两天。

4.2.2 烧录 OP-TEE 系统

OP-TEE 官方提供了一个构建脚本,叫 build.git。我习惯这么操作:

# 1. 安装依赖(Ubuntu 20.04/22.04)
sudo apt install -y \
  android-tools-adb \
  bc bison build-essential ccache \
  curl flex g++-multilib gcc-multimusl \
  git gnupg gperf imagemagick \
  lib32ncurses5-dev lib32readline-dev \
  lib32z1-dev libelf-dev liblz4-tool \
  libncurses5 libncurses5-dev \
  libsdl1.2-dev libssl-dev \
  libxml2 libxml2-utils lzop \
  pngcrush rsync schedtool \
  squashfs-tools xsltproc \
  zip zlib1g-dev

# 2. 下载 OP-TEE 构建环境
git clone https://github.com/OP-TEE/build.git
cd build

# 3. 选择树莓派 4 的配置文件
make -j2 toolchains
make -j4 all

# 4. 烧录到 SD 卡(假设 SD 卡是 /dev/sdb)
cd out
sudo dd if=sd.img of=/dev/sdb bs=4M status=progress
sync

嗯,这里要注意:make -j4 all 这一步会编译整个系统,包括 Linux 内核、OP-TEE 内核、Trusted Firmware-A 和测试用例。第一次编译大概要 30-60 分钟,取决于你的电脑性能。

4.2.3 连接串口与启动

串口连接是调试树莓派安全启动的关键。接线方式:

  • 树莓派的 GPIO 14 (TXD) → 串口模块的 RXD
  • 树莓派的 GPIO 15 (RXD) → 串口模块的 TXD
  • 树莓派的 GND → 串口模块的 GND

然后用 minicom 或 screen 连接:

sudo screen /dev/ttyUSB0 115200

插上 SD 卡,上电。你会看到启动日志从串口刷刷地流出来。如果看到 OP-TEE: initialized 字样,恭喜你,环境搭好了。

小技巧:我习惯在 /etc/ssh/sshd_config 里把 PermitRootLogin 改成 yes,这样可以直接用 root 登录树莓派,省去每次 sudo 的麻烦。当然,生产环境别这么干。

4.3 方案二:QEMU 模拟器

如果你手头没有树莓派,或者想快速上手,QEMU 是最佳选择。说白了,QEMU 就是一个虚拟的 ARM 开发板。

4.3.1 安装 QEMU

# Ubuntu/Debian
sudo apt install qemu-system-arm

# 验证安装
qemu-system-aarch64 --version

OP-TEE 官方已经为 QEMU 准备好了配置文件。你只需要:

cd build
make -j2 toolchains
make -j4 all QEMU_VIRTFS_ENABLE=y

这里加了个 QEMU_VIRTFS_ENABLE=y,是我个人的习惯。它允许宿主机和 QEMU 之间共享目录,调试代码时特别方便。

4.3.2 启动 QEMU 并运行 OP-TEE

# 启动 QEMU(带图形界面)
make run-only QEMU_VIRTFS_ENABLE=y

# 或者纯命令行模式(适合 SSH 远程)
make run-only QEMU_VIRTFS_ENABLE=y QEMU_CONSOLE=y

启动后,你会看到两个终端窗口:一个是 Linux 控制台,另一个是 OP-TEE 的 Secure World 控制台。在 Linux 控制台里,你可以运行测试用例:

# 在 QEMU 的 Linux 终端里
xtest

# 或者运行单个测试
xtest 1001

核心知识点:QEMU 模拟的是 virt 平台(ARM 通用虚拟平台),它和树莓派 4 的硬件不完全一样。但 OP-TEE 的架构是平台无关的——你写的 Trusted Application(TA)在 QEMU 上能跑,在树莓派上也能跑,只需要重新编译一下。

4.4 两种方案的架构对比

下面这张图是我自己画的,帮你理清两种方案在架构上的异同:

TEE 开发硬件环境架构对比 Raspberry Pi 4 物理平台 Normal World (Linux 内核 + 用户态) Secure World (OP-TEE OS + TAs) Trusted Firmware-A (ATF) 硬件安全模块 (OTP / 安全存储) 真实硬件,支持安全启动链 可体验 eFuse / OTP 烧录 调试需串口 + JTAG QEMU 模拟器平台 Normal World (Linux 内核 + 用户态) Secure World (OP-TEE OS + TAs) Trusted Firmware-A (ATF) QEMU virt 平台模拟硬件 纯软件模拟,无需物理硬件 支持 GDB 单步调试 无法模拟 OTP / 安全存储

你看,两种方案在软件栈上几乎一模一样——都是 Normal World + Secure World + ATF 三层结构。区别主要在底层:树莓派用的是真实硬件安全模块,QEMU 则用软件模拟。这意味着什么?

  • 如果你要研究 安全存储、OTP 熔丝、硬件唯一密钥,必须上真板子。
  • 如果你只是写 TA、调试 CA、学习 OP-TEE API,QEMU 完全够用。

4.5 我的选择建议

说了这么多,到底怎么选?我直接给结论:

学习路径建议:

  1. 第 1-2 周:只用 QEMU。把 OP-TEE 的编译、运行、测试流程跑通。写几个简单的 TA,理解 CA 和 TA 的通信机制。
  2. 第 3 周:入手树莓派 4。先跑 OP-TEE 官方镜像,确保硬件没问题。
  3. 第 4 周及以后:在树莓派上实现安全启动。从 BootROM → ATF → OP-TEE → Linux 的完整启动链,每一步都要验证签名。

我曾经带过一个团队,有个同事一上来就买树莓派,结果折腾了两周连 OP-TEE 都没跑起来。后来我让他先用 QEMU 把基础打牢,三天就上手了。你想想看,何必跟自己过不去呢?

4.6 常见问题与避坑

最后,分享几个我踩过的坑:

  • SD 卡烧录失败:别用 Windows 的写卡工具。用 dd 命令最稳,烧完后用 sync 确保数据落盘。
  • QEMU 启动后黑屏:检查一下是不是没装 libsdl2-dev。我遇到过三次,都是这个原因。
  • 树莓派 4 的 USB 供电不足:别用劣质充电器。官方要求 5V/3A,我用的是树莓派官方电源,从来没出过问题。
  • OP-TEE 编译报错:大概率是工具链版本不对。OP-TEE 官方推荐用 gcc-arm-9.2-2019.12,别自己瞎升级。
终极建议:如果你预算有限,或者只是学习目的,先玩 QEMU。等把 OP-TEE 的 API、TA 开发、CA 调用都搞明白了,再考虑买树莓派。毕竟,工具是拿来用的,不是拿来折腾的。