0%

Linux Ioctl Number 使用不规范导致的问题

Linux Modules 编写不规范导致出现奇怪现象,部分 ioctl 不能正常调用

现象

Modules 使用的 ioctl 定义如下

typedef enum
{
    IO_STR,
    IO_NUM,
    IO_KEY,
    IO_LOCK,
    IO_QUALITY,
    IO_TIME,
}IoctlKey;

发现其他 ioctl 可以正常调用,而某一个 ioctl 不能执行成功, case 分支都不会进入

解决

需要按照标准定义 ioctl

例如 dvbapi

#define FE_DISEQC_RESET_OVERLOAD   _IO('o', 62)
#define FE_DISEQC_SEND_MASTER_CMD  _IOW('o', 63, struct dvb_diseqc_master_cmd)
#define FE_DISEQC_RECV_SLAVE_REPLY _IOR('o', 64, struct dvb_diseqc_slave_reply)
#define FE_DISEQC_SEND_BURST       _IO('o', 65)  /* fe_sec_mini_cmd_t */

上述 enum 定义导致冲突

不同 Modules 定义 ioctl number 需要查看内核文件 Documentation/ioctl/ioctl-number.txt 来保证不会冲突

截取一段如下

Code  Seq#(hex) Include File        Comments
========================================================
0x00    00-1F   linux/fs.h      conflict!
0x00    00-1F   scsi/scsi_ioctl.h   conflict!
0x00    00-1F   linux/fb.h      conflict!
0x00    00-1F   linux/wavefront.h   conflict!
0x02    all linux/fd.h
0x03    all linux/hdreg.h
0x04    D2-DC   linux/umsdos_fs.h   Dead since 2.6.11, but don't reuse these.
0x06    all linux/lp.h
0x09    all linux/raid/md_u.h
0x10    00-0F   drivers/char/s390/vmcp.h
0x10    10-1F   arch/s390/include/uapi/sclp_ctl.h
0x10    20-2F   arch/s390/include/uapi/asm/hypfs.h
0x12    all linux/fs.h
        linux/blkpg.h
0x1b    all InfiniBand Subsystem    <http://infiniband.sourceforge.net/>
0x20    all drivers/cdrom/cm206.h
0x22    all scsi/sg.h
'#' 00-3F   IEEE 1394 Subsystem Block for the entire subsystem
'$' 00-0F   linux/perf_counter.h, linux/perf_event.h
'%' 00-0F   include/uapi/linux/stm.h
                    System Trace Module subsystem
                    <mailto:alexander.shishkin@linux.intel.com>
'&' 00-07   drivers/firewire/nosy-user.h
'1' 00-1F   <linux/timepps.h>   PPS kit from Ulrich Windl