快速了解[IOCTL][IO][IOR][IOW][IOWR][幻数]的概念

以下内容为个人学习笔记,不保证正确

(1)IOCTL

ioctl是一个操作函数,实现对硬件的控制,在内核驱动程序中。

(2)cmd

为了保证驱动程序操作的硬件是正确的,有一个cmd值来保证,cmd是一个32位的数,被分为4段以表示不同的含义,比如 bit31~bit30 这两位是用来区分ioctl操作是读还是写,剩下3段的含义还包括数据大小、幻数、区别序号。

区别序号:是用于区别ioctl操作执行哪一个项;

(3)IO、IOR、IOW、IOWR

前面说了cmd是一个32位数,而且被分成4段来表示不同含义,如果自己手动写会很麻烦,所以IO、IOR、IOW和IOWR就是内核里已经封装好的帮助我们快速生成cmd的方法。

从名字也能看出来4个方法的区别,它们对于cmd值的 bit29~bit0 操作是相同的,仅对第一个区有区分,IO就是无操作,IOR就是从驱动程序读取数据,IOW是写,IOWR是读写。

(4)幻数

大概就是用来表示文件的规范/类型

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ioctl 幻数一般是通过定义 ioctl 命令时使用的,可以在对应的头文件中查看。在 Linux 中,很多驱动程序都会定义自己的 ioctl 命令,这些命令的幻数一般都会在对应的头文件中定义。比如,在 Linux 内核源码的 include/uapi/linux/fs.h 头文件中,可以找到以下定义: ```c #define _IOC_NRBITS 8 #define _IOC_TYPEBITS 8 #define _IOC_SIZEBITS 14 #define _IOC_DIRBITS 2 #define _IOC_NRSHIFT 0 #define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) #define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) #define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS) #define _IOC_NONE 0U #define _IOC_WRITE 1U #define _IOC_READ 2U #define _IOC(dir,type,nr,size) \ (((dir) << _IOC_DIRSHIFT) | \ ((type) << _IOC_TYPESHIFT) | \ ((nr) << _IOC_NRSHIFT) | \ ((size) << _IOC_SIZESHIFT)) #define _IOC_TYPECHECK(t) (sizeof(t)) ``` 其中,_IOC_TYPEBITS 定义了 ioctl 命令的幻数长度,这里是 8 位,即一个字节。在定义具体的 ioctl 命令时,可以使用 _IO(type, nr)、_IOR(type, nr, size)、_IOW(type, nr, size)、_IOWR(type, nr, size) 等宏来定义,其中的 type 就是 ioctl 命令的幻数。比如,可以在驱动程序的头文件中找到类似以下的定义: ```c #define MYDRV_IOC_MAGIC 'm' #define MYDRV_IOC_GET_VERSION _IOR(MYDRV_IOC_MAGIC, 1, int) #define MYDRV_IOC_SET_PARAM _IOW(MYDRV_IOC_MAGIC, 2, mydrv_param_t) ``` 其中,MYDRV_IOC_MAGIC 定义了驱动程序的幻数为 'm',MYDRV_IOC_GET_VERSION 和 MYDRV_IOC_SET_PARAM 就是具体的 ioctl 命令。在用户空间程序中,可以通过 ioctl 函数调用这些命令,例如: ```c int fd = open("/dev/mydrv", O_RDWR); int version; if (ioctl(fd, MYDRV_IOC_GET_VERSION, &version) < 0) { perror("ioctl MYDRV_IOC_GET_VERSION failed"); return -1; } printf("My driver version: %d\n", version); close(fd); ``` 在这个例子中,MYDRV_IOC_GET_VERSION 就是一个 ioctl 命令,MYDRV_IOC_MAGIC 定义了这个命令的幻数。用户空间程序通过 ioctl 函数调用这个命令,并且将 version 作为参数传递给内核空间的驱动程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值