CA与TA“对话”的桥梁 | 瑞萨OP-TEE系列(4):OP-TEE Driver
在前几篇文章中,我们已经介绍了给嵌入式设备加把锁 | 瑞萨OP-TEE系列(1):技术背景与基础知识、解锁安全OS实战 | 瑞萨OP-TEE系列(2):OP-TEE OS深入解析与编译方法,以及打通安全世界的大门 | 瑞萨OP-TEE系列(3):OP-TEE Client。在OP-TEE的整体架构中,除了安全世界的OP-TEE OS和普通世界的OP-TEE Client,还存在一个关键的桥梁——OP-TEE Driver。

OP-TEE Driver是Linux内核中的一个专用驱动,它运行在普通世界内核态,负责将来自Client Application(CA)的请求转发到安全世界的OP-TEE OS,并将处理结果返回给CA。换句话说,OP-TEE Driver就是普通世界与安全世界之间的“通信管道”。
本文将系统性地介绍OP-TEE Driver,包括:
背景、作用、实现方式。
如何在Linux内核中启用与配置该驱动。
结合RZ/G2L VLP SDK的实际情况,说明其在Yocto环境下的配置方法。
02 OP-TEE Driver的背景与作用
2.1 驱动的必要性
CA程序运行在Linux用户空间,它通过libteec.so调用GP TEE Client API。然而,用户空间程序无法直接访问硬件,也无法直接与安全世界通信。为了完成跨世界调用,必须依赖内核驱动。
OP-TEE Driver 的作用就是:
接收来自libteec的请求(通过ioctl接口)。
通过SMC(Secure Monitor Call)将请求转发给安全世界。
管理共享内存,确保数据可以在Normal World与Secure World间安全交换。
将安全世界返回的结果传回给CA。
2.2 驱动在调用链中的位置
完整的调用链条如下:
CA(用户态)→libteec.so→OP-TEE Driver(内核态)→SMC→OP-TEE OS(安全世界)→TA
可以看出,Driver是承上启下的关键环节,没有它,CA无法与TA建立会话。
03 OP-TEE Driver的实现
3.1 驱动源码位置
在5.10的Linux内核源码中,OP-TEE Driver位于:
左右滑动查看完整内容
drivers/tee/optee/
核心文件包括:
optee/core.c:驱动入口,负责注册与初始化。
optee/call.c:实现了普通世界与安全世界的通信逻辑。
optee/smc_abi.c:实现基于SMC的调用接口。
optee/shm_pool.c:共享内存管理。
3.2 内核接口
OP-TEE Driver向用户空间提供了一个/dev/tee0设备节点。libteec通过ioctl操作与该节点通信,主要命令包括:
TEE_IOC_OPEN_SESSION:打开与某个TA的会话。
TEE_IOC_INVOKE:执行命令。
TEE_IOC_CLOSE_SESSION:关闭会话。
TEE_IOC_SHM_ALLOC:申请共享内存。
3.3 与TF-A的关系
当OP-TEE Driver发起一次SMC调用时,实际上是通过TF-A(Trusted Firmware-A)的Secure Monitor Dispatcher进入安全世界。TF-A SPD(Secure Payload Dispatcher)将请求转发到OP-TEE OS。
因此,Driver、TF-A与OP-TEE OS是一个完整的链路。
04 Linux内核中启用
OP-TEE Driver
4.1 内核配置选项
在内核配置菜单中,OP-TEE Driver对应以下选项:
左右滑动查看完整内容
Device Drivers ---> [*] OP-TEE drivers ---> <*>OP-TEE Driver
对应的配置宏为:
CONFIG_OPTEE=y
或者编译为模块:
CONFIG_OPTEE=m
4.2 Yocto环境下的启用
在RZ/G2L的VLP SDK(基于Yocto)中,内核默认已经包含OP-TEE Driver。若需确认,可执行:
左右滑动查看完整内容
$bitbake linux-renesas -c menuconfig
然后进入Device Drivers→OP-TEE drivers,确保启用了该选项。
4.3 驱动加载验证
系统启动后,检查内核日志:
左右滑动查看完整内容
dmesg| grep optee
若驱动成功加载,应看到类似信息:
左右滑动查看完整内容
optee:probing for conduit method.optee:initialized driver
同时,/dev/tee0设备节点会被创建。
05 共享内存与安全调用
5.1 共享内存的必要性
CA向TA传递参数时,需要在Normal World与Secure World之间共享数据。由于两个世界的内存空间隔离,必须由OP-TEE Driver管理一块共享内存池。
5.2 内存分配方式
OP-TEE Driver提供了两种共享内存模式:
Reserved memory:在设备树中预留一段内存。
Dynamic shared memory:使用CMA动态分配。
在RZ/G2L平台,通常采用reserved memory方式,设备树会有如下定义:
左右滑动查看完整内容
optee { compatible ="linaro,optee-tz"; method= "smc"; shared-memory = <&optee_shm>;};
reserved-memory { optee_shm: optee_shm@9e800000{ reg = <0x00x9e8000000x00x200000>; no-map; };};
06 OP-TEE Driver的功能扩展
6.1 多会话支持
OP-TEE Driver允许多个CA并行使用,每个会话通过session_id区分。
6.2 多个TA管理
Driver支持动态加载多个TA,CA通过UUID区分目标TA。
6.3 与Supplicant协作
当OP-TEE OS需要访问普通世界资源时,会请求Driver发送消息到tee-supplicant。例如:
安全存储文件读写。
RPMB访问。
获取时间戳。
Driver在这一过程中承担消息转发的角色。
07 RZ/G2L平台下的实践
在 RZ/G2L VLP SDK(内核5.10)中:
内核默认启用了OP-TEE Driver。
驱动设备节点/dev/tee0可正常使用。
在 BSP Plus(内核6.12)中,驱动进一步增强,支持RPMB。
开发者可通过optee_example_hello_world或optee_example_secure_storage验证Driver是否正常工作。
08 总结
本文系统介绍了OP-TEE Driver的作用与实现:
它是连接CA与OP-TEE OS的关键桥梁。
驱动通过/dev/tee0与libteec通信,并通过SMC调用进入安全世界。
提供共享内存管理、多会话支持,并与tee-supplicant协作完成更复杂的功能。
在RZ/G2L平台中,Yocto默认启用该驱动,开发者可直接使用。
通过本文,读者应能理解OP-TEE Driver的角色,并掌握在Linux内核中启用与调试该驱动的方法。下一篇文章将介绍OP-TEE与TF-A的关系,重点分析OP-TEE OS的加载机制与安全世界调用的调度原理。





