OP-TEE driver(三):OP-TEE驱动中的数据结构体
前面那篇其实和字符设备注册差不多,所以说某种程度上来说,optee驱动,也不是很特殊,还是个驱动。
要了解OP-TEE驱动中具体进行了哪些操作,首先需要了解在OP-TEE驱动中存在的四个重要的结构体,libteec库和tee_supplicanty以及直接存储器存储(Direct Memory Access, DMA)操作使用驱动时会使用到这四个结构体。
这四个结构体变量会在驱动挂载时被注册到系统设备模块或该设备的自由结构体中,以便被用户空间使用,而执行dma操作时则会对共享内存进行注册。
1、OP-TEE驱动的file_operation结构体变量tee_fops
OP-TEE驱动的file_operation结构体变量定义在linux/drivers/tee/tee_core.c文件中。该变量中包含了OP-TEE驱动文件的操作函数指针,其内容如下:
static const struct file_operations tee_fops = {
.owner = THIS_MODULE, //驱动属于者
.open = tee_open, //驱动文件open操作的具体实现的函数指针
.release = tee_release, //驱动文件release操作的具体实现的函数指针
.unlocked_ioctl = tee_ioctl, //驱动文件ioctl操作的具体实现的函数指针
//驱动文件ioctl操作的具体实现的函数指针,用户空间为32位,而内核为64位时使用
.compat_ioctl = tee_ioctl,
};
当在用户空间调用open、release、ioctl函数操作驱动文件时,就会调用到该结构体中的对应函数去执行具体操作。
2、tee0设备的tee_driver_ops结构体变量optee_ops
当用户空间调用libteec库中的接口时,操作的是OP-TEE驱动的/dev/tee0设备,而optee_ops变量中存放的就是针对/dev/tee0设备的具体操作函数的指针。
用户调用libteec库接口时,首先会调用到tee_fops中的成员函数,tee_fops中的成员函数再去调用optee_ops中对应的成员函数来完成对/dev/tee0设备的实际操作。
optee_ops变量定义在linux/drivers/tee/optee/core.c文件中,其内容如下:
static struct tee_driver_ops optee_ops = {
.get_version = optee_get_version, //获取OP-TEE版本信息的接口函数
//打开/dev/tee0设备的具体实现,初始化列表和互斥体,返回context
.open = optee_open,
//释放打开的/dev/tee0设备资源,并通知secure world关闭session
.release = optee_release,
.open_session = optee_open_session, //打开session,以便CA与TA进行交互
//关闭已经打开的session,断开CA与TA之间的交互
.close_session = optee_close_session,
.invoke_func = optee_invoke_func, //通过smc操作发送CA请求到对应TA
.cancel_req = optee_cancel_req, //取消CA端已经发送的smc请求
};
3、teepriv0设备的操作结构体变量optee_supp_ops
当tee_supplicant需要执行相关操作时,操作的就是OP-TEE驱动的/dev/teepriv0设备,optee_supp_ops变量中存放的就是针对/dev/teepriv0设备的具体操作函数的指针。
当tee_supplicant执行相关操作时,首先会调用到tee_fops中的成员函数,tee_fops中的成员函数会去调用optee_supp_ops中对应的成员函数来完成对/dev/teepriv0设备的实际操作。
optee_supp_ops变量定义在linux/drivers/tee/optee/core.c文件中,其内容如下:
static struct tee_driver_ops optee_supp_ops = {
.get_version = optee_get_version, //获取OP-TEE的版本信息
.open = optee_open, //打开/dev/teepriv0设备的具体实现
//释放掉打开的/dev/teepriv0设备,并通知secure world关闭session
.release = optee_release,
.supp_recv = optee_supp_recv, //接收从OP-TEE发送给tee_supplicant的请求
//执行完OP-TEE请求的操作后将结果和数据发送给OP-TEE
.supp_send = optee_supp_send,
};
4、共享驱动缓存操作变量tee_shm_dma_buf_ops
OP-TEE驱动也支持其他设备访问OP-TEE驱动的共享缓存。
该变量定义在linux/drivers/tee/tee_shm.c文件中,当需要分配dma缓存时就会调用该变量中对应的函数。其内容如下:
static struct dma_buf_ops tee_shm_dma_buf_ops = {
.map_dma_buf = tee_shm_op_map_dma_buf, //暂未实现
.unmap_dma_buf = tee_shm_op_unmap_dma_buf, //暂未实现
.release = tee_shm_op_release, //释放掉指定的共享内存
.kmap_atomic = tee_shm_op_kmap_atomic, //暂未实现
.kmap = tee_shm_op_kmap, //暂未实现
.mmap = tee_shm_op_mmap, //dma共享内存进行地址映射
};