4. TEE开发环境搭建:硬件准备、QEMU模拟器、OpenSBI与RustSBI、SDK安装与配置
搭建开发环境,往往是入门时最磨人的一步。我见过不少朋友卡在这里,工具链装到一半就放弃了。其实没那么可怕,咱们一步步来。
TEE开发环境,说白了就是三样东西:能跑TEE的硬件或模拟器、底层的SBI固件、以及上层的SDK。这三者配合好了,你才能写出第一个TEE应用。
核心要点:开发环境 = 硬件/模拟器 + SBI层 + SDK。缺一不可。
4.1 硬件准备:你需要什么板子?
如果你手头有支持TEE的开发板,那最好。我个人常用的几款:
- QEMU virt 平台(最推荐入门)—— 纯软件模拟,不需要真硬件
- HiFive Unleashed / Unmatched —— RISC-V 官方板,支持S-Mode和U-Mode
- StarFive VisionFive 2 —— 国产RISC-V板,性价比不错
- ARM 平台(树莓派4、Juno r2等)—— 如果你走ARM TrustZone路线
嗯,这里要注意:入门阶段,我强烈建议先用QEMU。为什么?因为真硬件调试起来太痛苦了。我记得第一次在HiFive板上跑TEE,串口线接触不良,折腾了整整一个下午才发现是硬件问题。用QEMU,你至少能确定问题出在软件上。
| 平台 | 成本 | 调试难度 | 推荐指数 |
|---|---|---|---|
| QEMU virt | 免费 | 低 | ⭐⭐⭐⭐⭐ |
| HiFive Unmatched | 约¥2000 | 中 | ⭐⭐⭐ |
| VisionFive 2 | 约¥800 | 中 | ⭐⭐⭐⭐ |
| 树莓派4 | 约¥400 | 中高 | ⭐⭐⭐ |
4.2 QEMU模拟器:你的第一块“虚拟开发板”
QEMU模拟器,是我们入门TEE开发的最佳伙伴。它不需要你花钱买硬件,也不需要你焊电路。装好就能跑。
安装QEMU其实很简单。以Ubuntu 22.04为例:
# 安装QEMU及相关工具
sudo apt update
sudo apt install qemu-system-riscv64 qemu-user-static
# 验证安装
qemu-system-riscv64 --version
装完之后,你就能用QEMU启动一个RISC-V虚拟机了。我个人习惯在QEMU上先跑一个最小的Linux内核,确认环境没问题,再往上叠加TEE组件。
小技巧:QEMU支持GDB远程调试。启动时加上 -s -S 参数,就能在宿主机上用GDB断点调试TEE代码。这个功能在真硬件上很难实现。
4.3 OpenSBI与RustSBI:TEE的“地基”
SBI(Supervisor Binary Interface)是RISC-V体系里M模式和S模式之间的桥梁。TEE运行在S模式,所以SBI固件必须正确初始化。
目前主流的SBI实现有两个:
- OpenSBI —— C语言实现,社区成熟,文档丰富
- RustSBI —— Rust语言实现,内存安全,适合研究
我个人更推荐入门时用OpenSBI,因为它的文档更全,遇到问题容易搜到答案。RustSBI虽然更安全,但社区还比较小,遇到坑可能得自己填。
编译OpenSBI的步骤:
# 克隆OpenSBI仓库
git clone https://github.com/riscv-software-src/opensbi.git
cd opensbi
# 编译QEMU virt平台的固件
make PLATFORM=generic
# 编译产物在 build/platform/generic/firmware/ 下
ls build/platform/generic/firmware/
# 你会看到 fw_jump.bin, fw_payload.bin 等文件
这里有个坑,我曾经踩过:编译OpenSBI时,一定要指定正确的PLATFORM。如果你用的是QEMU,就用 PLATFORM=generic;如果是HiFive Unleashed,得用 PLATFORM=riscv/sifive_fu540。选错了,启动就会卡死。
警告:OpenSBI的 fw_jump.bin 和 fw_payload.bin 用途不同。fw_jump 需要配合外部内核使用,fw_payload 则把内核打包在一起。入门阶段建议用 fw_jump,方便单独调试内核。
4.4 SDK安装与配置:让TEE跑起来
SDK(软件开发工具包)是连接你写的TEE应用和底层硬件的桥梁。不同的TEE方案有不同的SDK:
- OP-TEE SDK —— 最主流的TEE SDK,支持ARM和RISC-V
- Keystone SDK —— RISC-V专属,基于PMP的TEE方案
- Penglai SDK —— 国内团队开发的RISC-V TEE方案
我建议入门先从OP-TEE开始,因为它的生态最完善。安装OP-TEE SDK的步骤:
# 安装依赖
sudo apt install python3-pip cmake gcc-arm-linux-gnueabihf
# 克隆OP-TEE构建系统
git clone https://github.com/OP-TEE/optee_os.git
cd optee_os
# 编译QEMU版本
make PLATFORM=vexpress-qemu_virt
# 编译产物在 out/ 目录下
ls out/
配置SDK时,有几点要注意:
- 交叉编译工具链必须和你的目标平台匹配。QEMU用
arm-linux-gnueabihf,真硬件可能要用riscv64-linux-gnu - 环境变量要设置好,尤其是
TA_DEV_KIT_DIR和OPTEE_OS_DIR - Python版本建议用3.8以上,有些老版本SDK对Python 3.6支持不好
避坑指南:我曾经在配置OP-TEE SDK时,因为系统默认的Python版本是3.6,导致编译脚本报错。后来用 update-alternatives 切换到Python 3.8才解决。建议你装好SDK后,先跑一个 hello world 的TA(Trusted Application)验证环境是否正常。
4.5 整体架构:一张图看懂
说了这么多,咱们用一张图把整个开发环境的结构串起来:
这张图展示了TEE开发环境的四层结构。从上到下依次是:TEE应用(你写的代码)、SDK(提供API和工具链)、SBI固件(M模式的基础服务)、以及硬件/模拟器(实际运行平台)。每一层都依赖下一层提供的服务。
4.6 验证环境:跑一个Hello World
环境搭好了,怎么知道它能不能用?写一个最简单的TA试试:
// hello_world_ta.c
#include <tee_internal_api.h>
TEE_Result TA_CreateEntryPoint(void) {
DMSG("Hello World from TEE!");
return TEE_SUCCESS;
}
TEE_Result TA_OpenSessionEntryPoint(uint32_t param_types,
TEE_Param params[4],
void **session_ctx) {
DMSG("Session opened!");
return TEE_SUCCESS;
}
void TA_CloseSessionEntryPoint(void *session_ctx) {
DMSG("Session closed!");
}
TEE_Result TA_InvokeCommandEntryPoint(void *session_ctx,
uint32_t cmd_id,
uint32_t param_types,
TEE_Param params[4]) {
DMSG("Command %u invoked!", cmd_id);
return TEE_SUCCESS;
}
编译这个TA,然后加载到QEMU里运行。如果能在串口输出中看到 Hello World from TEE!,恭喜你,环境搭建成功了!
常见问题:如果编译报错找不到 tee_internal_api.h,说明你的 TA_DEV_KIT_DIR 环境变量没设置对。检查一下SDK的安装路径,确保指向了 optee_os/out/export-ta_arm32 目录。
嗯,环境搭建这部分确实琐碎,但它是后续所有实验的基础。我建议你花点时间把每一步都跑通,别急着跳过去。后面写TEE应用的时候,你会感谢现在认真搭环境的自己。