问题描述
我看到头文件
#define IOCTL_MAGIC 'A'
#define IOCTL_NAME _IOWR(IOCTL_MAGIC,2,ioctl_param)
我怎么知道这是 IOCTL_NAME
的 ioctl 编号?
解决方法
标题include/uapi/asm-generic/ioctl.h顶部描述了ioctl编号的构造方式:
ioctl 命令编码:共 32 位,命令为低 16 位, 低 14 位参数结构的大小 高 16 位。
...
然而事实上,低 16 位的前 8 位 位确实用作类型字段
即一个ioctl编号由4个字段构成,从上到下:
-
dir
- 方向,2 位。- 高位表示用户写了一个参数,
- 低位表示用户读取参数。
-
size
- 参数的大小,14 位。 -
type
- 唯一代表驱动程序的数字,8 位。 -
nr
- 类型(驱动程序)唯一的数字,8 位。
用于解码
#define IOCTL_MAGIC 'A'
#define IOCTL_NAME _IOWR(IOCTL_MAGIC,2,ioctl_param)
您需要知道ioctl_param
结构(sizeof(ioctl_param)
)的大小。
例如,如果结构的大小为 16 字节,则 ioctl 字段为:
-
dir
- 0x3(读取和写入)。 -
size
- 0x10(结构大小,16)。 -
type
- 0x41(字符A
的 ASCII 码)。 -
nr
- 0x2(第二个参数)。
ioctl 编号本身是 0xc0104102。