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))
相关推荐
bosins2 小时前
WSL2 启动即崩溃?调整超时参数解决 Docker 阻塞问题
linux·docker·wsl
web守墓人2 小时前
【goed/ui】自定义组件设计思想篇
linux·windows·ui·golang
kuroomi3 小时前
Ingress-Nginx与kubernetes 网络
linux·运维·网络·kubernetes
daemon.qiang3 小时前
国内虚拟机对接 Freedesktop:Fork xserver、自建 Runner 与提交 MR 实战
linux·ubuntu·centos·gitlab·开源软件
2401_869769594 小时前
linux 权限 指令与权限(重启之后)
linux
码农客栈5 小时前
Linux CAN 驱动
linux·驱动开发
GeW6 小时前
红帽RHCE从挂科边缘到一次过,我做对了什么
linux
时空自由民.6 小时前
WSL解决USB 串口连接问题与linux串口权限问题
linux·单片机
OpenPomeloxCommunity6 小时前
Linux驱动基础(三):firmware的声明与加载
linux·操作系统
云计算练习生7 小时前
什么是系统调用?为什么程序访问硬件必须经过它
linux·windows·操作系统·系统调用·操作系统原理