_IO(), _IOR(), _IOW(), _IOWR() 宏的用法与解析

在Linux驱动程序里, ioctl() 函数上传送的 cmd 是应用程序用于区别设备驱动程序请求处理内容的值。在Linux里面应用了很多宏来定义,我在这里只是翻译成简单易懂的,直接用数字代替宏。

这个30位的数字的位描述:
_IO(), _IOR(), _IOW(), _IOWR() 宏的用法与解析_第1张图片

生成命令的宏7个:

#define _IO(type,nr)            (0<<30 | 0<<16 | type<<8 | nr<<0)
#define _IOW(type,nr,size)      (1<<30 | sizeof(size)<<16 | type<<8 | nr<<0)
#define _IOR(type,nr,size)      (2<<30 | sizeof(size)<<16 | type<<8 | nr<<0)
#define _IOWR(type,nr,size)     (3<<30 | sizeof(size)<<16 | type<<8 | nr<<0)
#define _IOW_BAD(type,nr,size)  (1<<30 | sizeof(size)<<16 | type<<8 | nr<<0)
#define _IOR_BAD(type,nr,size)  (2<<30 | sizeof(size)<<16 | type<<8 | nr<<0)
#define _IOWR_BAD(type,nr,size) (3<<30 | sizeof(size)<<16 | type<<8 | nr<<0)

解析命令宏4个:

#define _IOC_DIR(nr)        ( (nr>>30) & 0x3)
#define _IOC_TYPE(nr)       ( (nr>>8) & 0xFF)
#define _IOC_NR(nr)         ( (nr>>0) & 0xFF)
#define _IOC_SIZE(nr)       ( (nr>>16) & 0x3FFF)

特殊宏5个:

#define IOC_IN          0x40000000
#define IOC_OUT         0x80000000
#define IOC_INOUT       0xC0000000
#define IOCSIZE_MASK    0x3FFF0000
#define IOCSIZE_SHIFT   16

生成命令例1

_IO(), _IOR(), _IOW(), _IOWR() 宏的用法与解析_第2张图片

解析过程和生成命令类似,只是一个反逻辑!这里就不多解释了。

你可能感兴趣的:(linux-内核解析)