OP-TEE中的安全驱动是OP-TEE操作安全设备的载体。
TA通过调用某个安全驱动的接口就可实现对特定安全设备的操作。安全驱动在OP-TEE中的软件框架如图22-2所示。
(其实这里,你要搞清楚linux kernel与驱动的关系,那真的还是蛮简单好理解的。但是我不知道~嘤嘤嘤)
系统服务层并非必需的,主要是为方便管理和上层使用。例如OP-TEE提供了各种各样的密码学算法,每一种算法的实现可通过不同的硬件引擎来完成。
为统一管理,可将这些硬件引擎驱动提供的操作接口统一集成到一个系统服务中,而上层用户只需调用系统服务暴露的接口就可实现对硬件引擎的调用。(可能是通过输入的参数进行分发)
下面展开讲讲这个框架的细节。
系统服务层
系统服务层在OP-TEE启动过程中由initcall段的代码进行初始化和启动,一个系统服务的初始化函数则是通过使用service_init宏来进行定义并在编译时链接到OP-TEE的镜像文件中。
在编译OP-TEE时,该初始化函数将被保存到OP-TEE镜像文件的initcall段中。
至于系统服务的初始化函数所要执行的内容则由开发者自行决定,一般是在系统服务的初始化函数中进行该服务的配置、状态量的初始化以及系统服务提供给上层调用的操作接口变量的初始化,系统服务提供的结构体变量会包含用于实现具体功能的函数指针变量,这些函数指针变量指向的函数就是安全驱动提供给TA调用的操作接口。
驱动层
OP-TEE启动过程中会执行各安全驱动的初始化,驱动的初始化函数是在OP-TEE执行initcall段中的内容时被调用的,在OP-TEE中通过使用driver_init宏来告诉编译器,在编译时将driver_init宏传入的函数作为某个驱动的入口函数保存在镜像文件的initcall段中。
安全驱动的初始化主要用来完成安全设备的寄存器的配置以及私有数据的初始化。
如果某个安全驱动需要系统服务的配合,则还需要将驱动提供的操作接口连接到系统服务中的操作接口变量中。
若该驱动不需以系统服务的方式向上层提供操作接口,则不用将对应接口暴露给系统服务,而是由TA通过系统调用的方式直接调用安全驱动的接口来操作安全设备。
driver_init service_init
驱动文件在源代码中的位置
安全驱动需要被编译到OP-TEE镜像文件中,OP-TEE中有专门的目录来存放驱动和系统服务的源代码。
将驱动编译到OP-TEE镜像文件之前还需修改对应的sub.mk文件。
全部0条评论
快来发表一下你的评论吧 !