CA与TA“对话”的桥梁 | 瑞萨OP-TEE系列(4):OP-TEE Driver

28372 2026-10-24

在前几篇文章中,我们已经介绍了给嵌入式设备加把锁 | 瑞萨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。

920b1bc2-cdff-11f1-9b19-92fbcf53809c.png

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的加载机制与安全世界调用的调度原理。