在linux中查找IOCTL编号

问题描述

我看到头文件

#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个字段构成,从上到下:

  1. dir - 方向,2 位。
    • 高位表示用户写了一个参数,
    • 低位表示用户读取参数。
  2. size - 参数的大小,14 位。
  3. type - 唯一代表驱动程序的数字,8 位。
  4. nr - 类型(驱动程序)唯一的数字,8 位。

用于解码

#define IOCTL_MAGIC 'A'
#define IOCTL_NAME _IOWR(IOCTL_MAGIC,2,ioctl_param)

您需要知道ioctl_param结构(sizeof(ioctl_param))的大小

例如,如果结构的大小为 16 字节,则 ioctl 字段为:

  1. dir - 0x3(读取和写入)。
  2. size - 0x10(结构大小,16)。
  3. type - 0x41(字符 A 的 ASCII 码)。
  4. nr - 0x2(第二个参数)。

ioctl 编号本身是 0xc0104102。