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

ioctl回顾

一、ioctl协议的命令组成

cmd本质为一个32位的数字,共分为四段:

[31-30]:读写方向dir,分为无数据(_IO)、读数据(_IOR)、写数据(_IOW)、读写数据(_IOWR)四种模式;

[29-16]:传递数据的大小size,一般利用其宏_IO、_IOR等直接传入数据的类型,如int;

[15-8]:命令的幻数type,表示设备的类型,可以是任意一个char型字符,如’a’、‘b’、‘c’等,其主要作用是使ioctl命令具有唯一的设备标识。不过在内核中’w’、‘y’、'z’三个字符已经被使用了。

[7-0]:命令的编号nr,有多个ioctl命令时,从0开始往上编号;


二、ioctl的宏

生成cmd的宏:

_IO(type,nr):用来定义没有数据传递的命令

_IOR(type,nr,size):用来定义从驱动中读取数据的命令

_IOW(type,nr,size):用来定义向驱动写入数据的命令

_IOWR(type,nr,size):用来定义数据交换类型的命令,先写入数据,再读取数据这类命令。

解析cmd的宏:

_IOC_DIR(cmd):解析命令的方向;

_IOC_TYPE(cmd):解析命令的幻数;

_IOC_NR(cmd):解析命令的编号;

_IOC_SIZE(cmd):解析命令的复制数据大小;


三、用于输入输出的时候需要注意的点

用于输入输出时需要使用copy_to_user或copy_from_user函数实现与用户空间的交互。其中,由于unlocked_ioctl函数中的arg参数是一个值,因此使用时需要注意:

  • 用户程序中ioctl函数虽然第三个参数是可变参数,但实际上只有一个,且传入的应为int类型数据的地址,即需要添加取地址符,如下:
    int rst = ioctl(fd, AFM_DEV_CMD_TEST, &aaa);
  • 驱动程序中需要对传入的arg参数进行强制类型转换,将其变回地址类型,如下:
    copy_to_user((void __user *)arg, &success_rst, sizeof(success_rst))
    copy_from_user(&print_verbos, (void __user *)arg, sizeof(print_verbos))
http://www.lryc.cn/news/509620.html

相关文章:

  • jquery-validate在前端数据校验中的应用以及remote异步调用实践-以若依为例
  • 如何重新设置VSCode的密钥环密码?
  • Android--java实现手机亮度控制
  • 原点安全再次入选信通院 2024 大数据“星河”案例
  • torch.nn.init 模块介绍
  • 人工智能与物联网:从智慧家居到智能城市的未来蓝图
  • 极狐GitLab 17.7正式发布,可从 GitLab 丝滑迁移至极狐GitLab【一】
  • 纯Dart Flutter库适配HarmonyOS
  • 【R语言遥感技术】“R+遥感”的水环境综合评价方法
  • 软件工程三 需求获取与结构化分析方法(需求分析、功能建模、数据建模、行为建模、数据字典等)
  • Python 抽象基类 ABC :从实践到优雅
  • Elasticsearch检索方案之一:使用from+size实现分页
  • 知识图谱+大模型:打造全新智慧城市底层架构
  • Flutter开发HarmonyOS 鸿蒙App的好处、能力以及把Flutter项目打包成鸿蒙应用
  • vscode安装fortran插件配置
  • 容器化平台Docker初识
  • 【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】
  • 简单两步使用ssh配置内网穿透
  • M系列芯片切换镜像源并安装 openJDK17
  • 图像处理-Ch6-彩色图像处理
  • Redis可视化工具 RDM mac安装使用
  • 单元测试/系统测试/集成测试知识总结
  • 多目标应用(一):多目标麋鹿优化算法(MOEHO)求解10个工程应用,提供完整MATLAB代码
  • 机器学习和深度学习中的种子设置
  • [手机Linux] 七,NextCloud优化设置
  • Ruby+Selenium教程
  • 【论文阅读笔记】Learning to sample
  • 边缘计算收益稳定
  • 域名和服务器是什么?域名和服务器是什么关系?
  • IBatis和MyBatis在细节上的不同有哪些