当前位置: 首页 > news >正文

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共享内存进行地址映射
          };

相关文章:

  • 人工智能轨道交通行业周刊-第15期(2022.9.19-9.25)
  • python process模块的使用简介
  • 回调函数等作业
  • 不要再盯着大厂了,这16家中小厂我建议你也试试
  • Linux-常见命令(一)
  • 什么是C语言?
  • 封装——C++
  • 【Java高级】框架底层基础:Java的反射机制剖析
  • verilog移位寄存器实现序列检测
  • 前端性能优化方法与实战02 性能瓶颈点:从 URL 输入到页面加载整过程分析
  • 34.0、C语言——C语言预处理(2) - 预编译(预处理)详解(2)
  • ES优化实战 - 小操作节省百分之三十以上的磁盘空间
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • 我在windows环境下的YOLOV3环境搭建过程
  • bat goto 还是 call
  • 收藏网友的 源程序下载网
  • [LeetCode] Wiggle Sort
  • 《深入 React 技术栈》
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 2017年终总结、随想
  • 30天自制操作系统-2
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • download使用浅析
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JSONP原理
  • js中的正则表达式入门
  • leetcode讲解--894. All Possible Full Binary Trees
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • rc-form之最单纯情况
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Twitter赢在开放,三年创造奇迹
  • vue数据传递--我有特殊的实现技巧
  • win10下安装mysql5.7
  • windows下如何用phpstorm同步测试服务器
  • 从零开始学习部署
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 排序算法之--选择排序
  • 漂亮刷新控件-iOS
  • 前端面试之闭包
  • 使用 QuickBI 搭建酷炫可视化分析
  • 微信开放平台全网发布【失败】的几点排查方法
  • 一天一个设计模式之JS实现——适配器模式
  • 译米田引理
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 如何正确理解,内页权重高于首页?
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #1014 : Trie树
  • (LeetCode) T14. Longest Common Prefix
  • (补)B+树一些思想
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (学习日记)2024.01.19