作者书籍推荐:
⚡ 内地版本:电子工业出版社已出版,并在大陆热销。Yocto项目实战教程:高效定制嵌入式Linux系统
⚡ 海外版本:繁体中文版支持全球华人购买,让更多开发者轻松掌握嵌入式系统核心技能。 金石堂购买链接
🎥 更多学习视频请关注 B 站:嵌入式Jerry
⚙️ Jetson 安全核心揭秘:OP-TEE 驱动、内核配置与 Secure World 通信机制全解析
在 Jetson AGX Orin 或 Xavier 平台上,我们熟悉的 Linux 系统只是整个 BSP 的一部分。事实上,NVIDIA 的 SoC 内部还有一个隐秘的世界 —— Secure World(安全世界)。它运行着一个小型的安全操作系统 OP-TEE(Open Portable Trusted Execution Environment),并通过硬件 TrustZone 实现与 Linux 普通世界隔离。
本文将带你从驱动与内核的角度,深入理解 optee.ko 模块的作用、依赖的内核配置、通信流程及实际开发要点。我们以 Jetson 为例,完整讲解:
- 为什么
optee.ko必须依赖特定内核配置 - 内核如何与 Secure World 通信
- 启动到通信的完整流程
- 驱动、用户空间、OP-TEE OS 三者关系
- Jetson BSP 实际操作与验证方法
这篇文章将帮助你真正掌握 Jetson 平台上 OP-TEE 驱动与内核的安全通信机制。

🧩 一、从硬件开始:TrustZone 与 Secure World 基础
Jetson 平台使用的 ARMv8-A CPU 内置 TrustZone 技术。TrustZone 将整个系统分为两个世界:
| 世界 | 运行环境 | 权限等级 | 描述 |
|---|---|---|---|
| Secure World | OP-TEE OS | 高权限 | 执行加密、认证、密钥操作等敏感任务 |
| Normal World | Linux / Android | 受限访问 | 运行普通应用与驱动 |
硬件通过一个称为 SMC(Secure Monitor Call) 的机制在两个世界间切换:
Normal World (Linux)
↓ [SMC 指令切换]
Secure World (OP-TEE)
当 Linux 世界的应用需要执行敏感操作(如密钥签名),它会通过驱动触发一次 SMC 调用,请求 Secure World 代为完成。
这正是 optee.ko 的核心职责 —— 建立 Normal World ↔ Secure World 的通信通道。
🧠 二、optee.ko 是什么?
optee.ko 是 Linux 内核中的一个模块(位于 drivers/tee/optee/)。
它的主要功能是:
- 注册设备节点
/dev/tee0; - 处理来自用户态(tee-supplicant / 应用)的请求;
- 将请求通过 SMC 指令转发给 Secure World 的 OP-TEE OS;
- 管理共享内存区域,用于在两个世界间传输数据。
换句话说:
optee.ko是一个桥梁,连接了 Linux 普通世界与 TrustZone 安全世界。
而它要工作,离不开一整套内核配置的支持。
⚙️ 三、optee.ko 的依赖:关键内核配置项
要在 Jetson BSP 中成功启用 OP-TEE 通信,必须在内核配置文件(tegra_defconfig)中启用以下关键项。
🔧 必需配置项
| 配置项 | 功能说明 |
|---|---|
CONFIG_TEE | 启用 Linux 通用 TEE 框架,提供 /dev/tee0 设备节点 |
CONFIG_OPTEE | 启用 OP-TEE 专用驱动支持(生成 optee.ko 模块) |
CONFIG_ARM_SMCCC | 启用 ARM Secure Monitor 调用接口(SMC 通信基础) |
CONFIG_ARM_PSCI | 启用 Power State Coordination Interface(部分电源操作走 Secure 调用) |
CONFIG_HAVE_ARM_SMCCC_DISCOVERY | 支持通过 SMCCC 协议自动发现通信方法 |
CONFIG_OF_RESOLVE | 支持通过设备树解析 Secure 设备映射 |
这些配置决定了内核是否具备进入 Secure World 的能力。如果缺失,内核将无法调用 smc #0 指令,也无法访问 /dev/tee0。
🧩 推荐配置项
| 配置项 | 功能 |
|---|---|
CONFIG_OPTEE_V1 / CONFIG_OPTEE_V2 | 根据平台选择 OP-TEE 通信协议版本 |
CONFIG_CRYPTO_DEV_OPTEE | 启用通过 OP-TEE 实现的硬件加密加速 |
CONFIG_TEE_DEBUG | 调试模式(开发调试阶段推荐启用) |
CONFIG_TEE_BENCHMARK | 性能测试支持(启用 xtest benchmark) |
这些附加配置项可以帮助调试、优化 Secure World 通信性能。
🧱 四、内核配置文件位置(Jetson 实例)
在 Jetson BSP 源码中,这些选项位于:
Linux_for_Tegra/source/public/kernel/kernel-jammy-src/
└── arch/arm64/configs/tegra_defconfig
验证配置:
grep OPTEE arch/arm64/configs/tegra_defconfig
grep TEE arch/arm64/configs/tegra_defconfig
如果显示:
CONFIG_TEE=y
CONFIG_OPTEE=y
说明已启用 OP-TEE 驱动支持。
若无,可使用 make menuconfig 启用:
Device Drivers --->
[*] OP-TEE Driver support
[*] TrustZone-based Trusted Execution Environment (TEE) support
保存后重新编译内核:
make -j$(nproc) Image modules dtbs
🧩 五、从启动到通信的完整流程
理解 optee.ko 的运作,必须结合整个系统的启动链。
🚀 启动流程
1️⃣ BootROM
→ 验证并启动 MB1 / MB2
2️⃣ BL31 (Trusted Firmware-A)
→ 初始化 TrustZone
→ 加载 BL32 (tee.bin)
3️⃣ BL32 (OP-TEE OS)
→ 启动 Secure World OS
4️⃣ Linux Kernel
→ 启动并加载 optee.ko
5️⃣ tee-supplicant (User-space)
→ 与 /dev/tee0 通信
在系统运行后:
- Secure World 的 OP-TEE 运行在 EL1 Secure;
- Linux 运行在 EL1 Non-secure;
- 两者通过 SMC 调用和共享内存交互。
🔁 通信流程示意
App (user) ──libteec──> tee-supplicant ────> /dev/tee0
│
▼
optee.ko (kernel)
│
[SMC 调用]
▼
OP-TEE OS (Secure World)
在每次通信中:
- 用户态程序调用
libteec.soAPI; - tee-supplicant 与
/dev/tee0设备交互; optee.ko解析 ioctl 请求并执行 SMC;- Secure World 处理命令并返回结果。
🔍 六、验证运行状态
完成内核编译并启动系统后,可通过以下命令验证:
查看内核日志:
dmesg | grep optee
应出现:
[ 1.352] optee: probing for conduit method.
[ 1.354] optee: initialized driver
查看设备节点:
ls /dev/tee*
输出:
/dev/tee0
/dev/teepriv0
查看用户态服务:
ps | grep tee-supplicant
输出:
/usr/sbin/tee-supplicant
这意味着:
- 内核驱动已加载;
- Secure World 已启动;
- 通信桥接已生效。
🧰 七、在 Jetson 上的开发实践
Jetson 平台中,OP-TEE 相关源码包为:
Linux_for_Tegra/source/nvidia-jetson-optee-source.tbz2
解压:
cd Linux_for_Tegra/source
sudo tar -xvjf nvidia-jetson-optee-source.tbz2
结构:
optee/
├── optee_os/ ← Secure OS 核心
├── optee_client/ ← 用户态 API (libteec)
├── optee_linuxdriver/ ← 内核驱动 (optee.ko)
└── optee_test/ ← 测试示例 (xtest)
编译 Secure World:
sudo ./nv_public_src_build_tos.sh
生成:
Linux_for_Tegra/bootloader/TOS/tee.bin
🔐 八、用户空间开发:调用 OP-TEE
用户应用通过 GlobalPlatform 定义的 TEE Client API 与 OP-TEE 通信。
示例代码:
TEEC_Context ctx;
TEEC_Session sess;
TEEC_UUID uuid = TA_SECURE_APP_UUID;
TEEC_Operation op = {0};
TEEC_InitializeContext(NULL, &ctx);
TEEC_OpenSession(&ctx, &sess, &uuid, TEEC_LOGIN_PUBLIC, NULL, NULL, NULL);
op.params[0].tmpref.buffer = data;
op.params[0].tmpref.size = len;
TEEC_InvokeCommand(&sess, CMD_ENCRYPT, &op, NULL);
TEEC_CloseSession(&sess);
TEEC_FinalizeContext(&ctx);
编译后运行:
./my_secure_app
在后台,通信链路为:
libteec.so → /dev/tee0 → optee.ko → OP-TEE OS
🧩 九、常见问题与调试技巧
1️⃣ /dev/tee0 不存在
原因:CONFIG_TEE 或 CONFIG_OPTEE 未启用。
解决:检查 defconfig,重新编译内核。
2️⃣ 加载 optee.ko 报错
原因:ABI 版本不匹配。
解决:确保 optee_os 与内核驱动版本一致(v1/v2 对应)。
3️⃣ tee-supplicant 无法启动
原因:用户态库未安装。
解决:确保 /usr/sbin/tee-supplicant 和 /usr/lib/libteec.so 已部署。
4️⃣ Secure World 不响应
原因:tee.bin 未正确加载或签名。
解决:重新构建 tee.bin 并更新到 bootloader/TOS/ 目录。
🧱 十、开发者建议与最佳实践
-
保持内核与 OP-TEE 版本一致
在不同 L4T 版本(如 r35、r36)之间,SMC 接口可能不同。建议使用相同 BSP 下的nvidia-jetson-optee-source.tbz2。 -
确保启用 Secure Boot
只有在 Secure Boot 启用时,TrustZone 安全验证链才完整。 -
验证
xtest功能
运行:xtest所有测试通过说明 Normal / Secure 通信工作正常。
-
Yocto 集成建议
在local.conf中添加:DISTRO_FEATURES_append = " optee" IMAGE_INSTALL_append = " optee-client optee-test" -
安全模块签名
在内核中同时启用模块签名机制(CONFIG_MODULE_SIG),防止恶意替换。
✅ 十一、总结:安全通信的基石
在 Jetson 平台中,
optee.ko并不仅仅是一个驱动模块,而是 Linux 与 Secure World 的桥梁。它依赖于 TEE 框架、SMC 调用、内核配置与 TrustZone 硬件隔离共同工作。
通过正确的内核配置(CONFIG_TEE、CONFIG_OPTEE 等)、驱动编译和用户空间配合,开发者可以充分利用 Jetson 的硬件安全能力,实现安全存储、加密计算与可信执行环境。
一句话总结:
optee.ko是连接两个世界的关键;TrustZone 提供隔离,OP-TEE 提供安全,而内核配置则是它们之间的“通道控制阀”。
📘 延伸阅读:
✍️ 作者:Jerry Sun
嵌入式安全开发者,长期研究 Jetson 平台的 Secure Boot 与 TrustZone 技术。
作者书籍推荐:
⚡ 内地版本:电子工业出版社已出版,并在大陆热销。Yocto项目实战教程:高效定制嵌入式Linux系统
⚡ 海外版本:繁体中文版支持全球华人购买,让更多开发者轻松掌握嵌入式系统核心技能。 金石堂购买链接
🎥 更多学习视频请关注 B 站:嵌入式Jerry
Jetson OP-TEE 安全通信解析

被折叠的 条评论
为什么被折叠?



