ioctl-number.rst

#文档翻译 #Linux驱动开发 #操作系统

原文版本:Linux 6.8

翻译

如果要向内核添加新的ioctl,则应该使用 <linux/ioctl.h> 中定义的 _IO

_IO an ioctl with no parameters
_IOW an ioctl with write parameters (copy_from_user)
_IOR an ioctl with read parameters (copy_to_user)
_IOWR an ioctl with both write and read parameters.

上述的 readwrite 应当像普通系统调用的命名规则一样,针对用户态视角来进行设计,而不是内核态视角。例如名为 SET_FOO 的cmd应当选用 _IOW因为其数据是从用户空间传向内核空间的(copy_from_user)、该指令以用户视角是写入,以内核视角是读取。而名为 GET_FOO 的cmd应当选用 _IOR ,因为其数据流向为内核空间到用户空间。

_IO_IOW_IOR_IOWR 的第一个参数(即 type 字段,注1)是下方表格中的识别 letternumber 。由于驱动类型众多,许多驱动与其他驱动共用一个 letter

如果您正在为一个新设备编写驱动程序,并且需要一个 letter ,请选择一个有足够扩展空间的未使用块:32到256的ioctl命令。您可以通过修补这个文件并将修补程序提交给 Linus Torvalds 来注册这个块。或者你可以发电子邮件给我([email protected]),我会为你注册一个。

_IO_IOW_IOR_IOWR 的第二个参数(即 nr 字段,注1)是用于区分ioctls的顺序数字。 _IOW_IOR_IOWR 的第三个参数(即 size 字段,注1)是进入内核或从内核出来的数据类型(例如, intstruct foo )。注意!不要使用 sizeof(arg) 作为第三个参数,因为这会导致ioctl认为它传递一个 size_t 类型的参数

有些设备使用它们的主编号作为标识符; 只要它是唯一的就没问题。有些设备是不规则的,根本不遵循任何公约。

遵守这一共约是有益的,因为:

  1. 保持ioctl的全局唯一性有助于错误检查:如果程序在错误的设备上调用ioctl,它将得到一个错误,而不是一些意外的行为。
  2. strace 构建过程自动查找用 _IO_IOW_IOR_IOWR 定义的ioctl数字。
  3. 当数字是唯一的时候, strace 可以将数字解码回有用的名字。
  4. 当使用这个约定来定义ioctl数字时,查找ioctl的人可以更容易地获取它们。
  5. 在遵循约定时,驱动程序代码可以使用通用代码在用户和内核空间之间复制参数。

下表列出了从Linux/x86的用户界面可见的ioctls。它包含Linux2.6.31版本的大多数驱动程,但我知道我漏掉了一些。没有人试图从 drivers/staging/ 中列出非X86架构或ioctl。

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/](http://infiniband.sourceforge.net/)
0x20 all drivers/cdrom/cm206.h
0x22 all scsi/sg.h
0x3E 00-0F linux/counter.h [mailto:[email protected]](mailto:[email protected])
'!' 00-1F uapi/linux/seccomp.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:[email protected]](mailto:[email protected])
'&' 00-07 drivers/firewire/nosy-user.h
'1' 00-1F linux/timepps.h PPS kit from Ulrich Windl ftp://ftp.de.kernel.org/pub/linux/daemons/ntp/PPS/
'2' 01-04 linux/i2o.h
'3' 00-0F drivers/s390/char/raw3270.h conflict!
'3' 00-1F linux/suspend_ioctls.h, kernel/power/user.c conflict!
'8' all SNP8023 advanced NIC card [mailto:[email protected]](mailto:[email protected])
';' 64-7F linux/vfio.h
';' 80-FF linux/iommufd.h
'=' 00-3f uapi/linux/ptp_clock.h [mailto:[email protected]](mailto:[email protected])
'@' 00-0F linux/radeonfb.h conflict!
'@' 00-0F drivers/video/aty/aty128fb.c conflict!
'A' 00-1F linux/apm_bios.h conflict!
'A' 00-0F linux/agpgart.h, drivers/char/agp/compat_ioctl.h conflict!
'A' 00-7F sound/asound.h conflict!
'B' 00-1F linux/cciss_ioctl.h conflict!
'B' 00-0F include/linux/pmu.h conflict!
'B' C0-FF advanced bbus [mailto:[email protected]](mailto:[email protected])
'B' 00-0F xen/xenbus_dev.h conflict!
'C' all linux/soundcard.h conflict!
'C' 01-2F linux/capi.h conflict!
'C' F0-FF drivers/net/wan/cosa.h conflict!
'D' all arch/s390/include/asm/dasd.h
'D' 40-5F drivers/scsi/dpt/dtpi_ioctl.h Dead since 2022
'D' 05 drivers/scsi/pmcraid.h
'E' all linux/input.h conflict!
'E' 00-0F xen/evtchn.h conflict!
'F' all linux/fb.h conflict!
'F' 01-02 drivers/scsi/pmcraid.h conflict!
'F' 20 drivers/video/fsl-diu-fb.h conflict!
'F' 20 linux/ivtvfb.h conflict!
'F' 20 linux/matroxfb.h conflict!
'F' 20 drivers/video/aty/atyfb_base.c conflict!
'F' 00-0F video/da8xx-fb.h conflict!
'F' 80-8F linux/arcfb.h conflict!
'F' DD video/sstfb.h conflict!
'G' 00-3F drivers/misc/sgi-gru/grulib.h conflict!
'G' 00-0F xen/gntalloc.h, xen/gntdev.h conflict!
'H' 00-7F linux/hiddev.h conflict!
'H' 00-0F linux/hidraw.h conflict!
'H' 01 linux/mei.h conflict!
'H' 02 linux/mei.h conflict!
'H' 03 linux/mei.h conflict!
'H' 00-0F sound/asound.h conflict!
'H' 20-40 sound/asound_fm.h conflict!
'H' 80-8F sound/sfnt_info.h conflict!
'H' 10-8F sound/emu10k1.h conflict!
'H' 10-1F sound/sb16_csp.h conflict!
'H' 10-1F sound/hda_hwdep.h conflict!
'H' 40-4F sound/hdspm.h conflict!
'H' 40-4F sound/hdsp.h conflict!
'H' 90 sound/usb/usx2y/usb_stream.h
'H' 00-0F uapi/misc/habanalabs.h conflict!
'H' A0 uapi/linux/usb/cdc-wdm.h
'H' C0-F0 net/bluetooth/hci.h conflict!
'H' C0-DF net/bluetooth/hidp/hidp.h conflict!
'H' C0-DF net/bluetooth/cmtp/cmtp.h conflict!
'H' C0-DF net/bluetooth/bnep/bnep.h conflict!
'H' F1 linux/hid-roccat.h [mailto:[email protected]](mailto:[email protected])
'H' F8-FA sound/firewire.h
'I' all linux/isdn.h conflict!
'I' 00-0F drivers/isdn/divert/isdn_divert.h conflict!
'I' 40-4F linux/mISDNif.h conflict!
'K' all linux/kd.h
'L' 00-1F linux/loop.h conflict!
'L' 10-1F drivers/scsi/mpt3sas/mpt3sas_ctl.h conflict!
'L' E0-FF linux/ppdd.h encrypted disk device driver [http://linux01.gwdg.de/~alatham/ppdd.html](http://linux01.gwdg.de/~alatham/ppdd.html)
'M' all linux/soundcard.h conflict!
'M' 01-16 and mtd/mtd-abi.h drivers/mtd/mtdchar.c conflict!
'M' 01-03 drivers/scsi/megaraid/megaraid_sas.h
'M' 00-0F drivers/video/fsl-diu-fb.h conflict!
'N' 00-1F drivers/usb/scanner.h
'N' 40-7F drivers/block/nvme.c
'O' 00-06 mtd/ubi-user.h UBI
'P' all linux/soundcard.h conflict!
'P' 60-6F sound/sscape_ioctl.h conflict!
'P' 00-0F drivers/usb/class/usblp.c conflict!
'P' 01-09 drivers/misc/pci_endpoint_test.c conflict!
'P' 00-0F xen/privcmd.h conflict!
'P' 00-05 linux/tps6594_pfsm.h conflict!
'Q' all linux/soundcard.h
'R' 00-1F linux/random.h conflict!
'R' 01 linux/rfkill.h conflict!
'R' C0-DF net/bluetooth/rfcomm.h
'R' E0 uapi/linux/fsl_mc.h
'S' all linux/cdrom.h conflict!
'S' 80-81 scsi/scsi_ioctl.h conflict!
'S' 82-FF scsi/scsi.h conflict!
'S' 00-7F sound/asequencer.h conflict!
'T' all linux/soundcard.h conflict!
'T' 00-AF sound/asound.h conflict!
'T' all arch/x86/include/asm/ioctls.h conflict!
'T' C0-DF linux/if_tun.h conflict!
'U' all sound/asound.h conflict!
'U' 00-CF linux/uinput.h conflict!
'U' 00-EF linux/usbdevice_fs.h
'U' C0-CF drivers/bluetooth/hci_uart.h
'V' all linux/vt.h conflict!
'V' all linux/videodev2.h conflict!
'V' C0 linux/ivtvfb.h conflict!
'V' C0 linux/ivtv.h conflict!
'V' C0 media/si4713.h conflict!
'W' 00-1F linux/watchdog.h conflict!
'W' 00-1F linux/wanrouter.h conflict! (pre 3.9)
'W' 00-3F sound/asound.h conflict!
'W' 40-5F drivers/pci/switch/switchtec.c
'W' 60-61 linux/watch_queue.h
'X' all fs/xfs/xfs_fs.h, fs/xfs/linux-2.6/xfs_ioctl32.h, include/linux/falloc.h, linux/fs.h, conflict!
'X' all fs/ocfs2/ocfs_fs.h conflict!
'X' 01 linux/pktcdvd.h conflict!
'Z' 14-15 drivers/message/fusion/mptctl.h
'[' 00-3F linux/usb/tmc.h USB Test and Measurement Devices [mailto:[email protected]](mailto:[email protected])
'a' all linux/atm*.h, linux/sonet.h ATM on linux [http://lrcwww.epfl.ch/](http://lrcwww.epfl.ch/)
'a' 00-0F drivers/crypto/qat/qat_common/adf_cfg_common.h conflict! qat driver
'b' 00-FF conflict! bit3 vme host bridge [mailto:[email protected]](mailto:[email protected])
'b' 00-0F linux/dma-buf.h conflict!
'c' 00-7F linux/comstats.h conflict!
'c' 00-7F linux/coda.h conflict!
'c' 00-1F linux/chio.h conflict!
'c' 80-9F arch/s390/include/asm/chsc.h conflict!
'c' A0-AF arch/x86/include/asm/msr.h conflict!
'd' 00-FF linux/char/drm/drm.h conflict!
'd' 02-40 pcmcia/ds.h conflict!
'd' F0-FF linux/digi1.h
'e' all linux/digi1.h conflict!
'f' 00-1F linux/ext2_fs.h conflict!
'f' 00-1F linux/ext3_fs.h conflict!
'f' 00-0F fs/jfs/jfs_dinode.h conflict!
'f' 00-0F fs/ext4/ext4.h conflict!
'f' 00-0F linux/fs.h conflict!
'f' 00-0F fs/ocfs2/ocfs2_fs.h conflict!
'f' 13-27 linux/fscrypt.h
'f' 81-8F linux/fsverity.h
'g' 00-0F linux/usb/gadgetfs.h
'g' 20-2F linux/usb/g_printer.h
'h' 00-7F conflict! Charon filesystem [mailto:[email protected]](mailto:[email protected])
'h' 00-1F linux/hpet.h conflict!
'h' 80-8F fs/hfsplus/ioctl.c
'i' 00-3F linux/i2o-dev.h conflict!
'i' 0B-1F linux/ipmi.h conflict!
'i' 80-8F linux/i8k.h
'i' 90-9F linux/iio/*.h IIO
'j' 00-3F linux/joystick.h
'k' 00-0F linux/spi/spidev.h conflict!
'k' 00-05 video/kyro.h conflict!
'k' 10-17 linux/hsi/hsi_char.h HSI character device
'l' 00-3F linux/tcfs_fs.h transparent cryptographic file system [http://web.archive.org/web/%2A/http://mikonos.dia.unisa.it/tcfs](http://web.archive.org/web/%2A/http://mikonos.dia.unisa.it/tcfs)
'l' 40-7F linux/udf_fs_i.h in development: [https://github.com/pali/udftools](https://github.com/pali/udftools)
'm' 00-09 linux/mmtimer.h conflict!
'm' all linux/mtio.h conflict!
'm' all linux/soundcard.h conflict!
'm' all linux/synclink.h conflict!
'm' 00-19 drivers/message/fusion/mptctl.h conflict!
'm' 00 drivers/scsi/megaraid/megaraid_ioctl.h conflict!
'n' 00-7F linux/ncp_fs.h and fs/ncpfs/ioctl.c
'n' 80-8F uapi/linux/nilfs2_api.h NILFS2
'n' E0-FF linux/matroxfb.h matroxfb
'o' 00-1F fs/ocfs2/ocfs2_fs.h OCFS2
'o' 00-03 mtd/ubi-user.h conflict! (OCFS2 and UBI overlaps)
'o' 40-41 mtd/ubi-user.h UBI
'o' 01-A1 linux/dvb/*.h DVB
'p' 00-0F linux/phantom.h conflict! (OpenHaptics needs this)
'p' 00-1F linux/rtc.h conflict!
'p' 40-7F linux/nvram.h
'p' 80-9F linux/ppdev.h user-space parport [mailto:[email protected]](mailto:[email protected])
'p' A1-A5 linux/pps.h LinuxPPS [mailto:[email protected]](mailto:[email protected])
'q' 00-1F linux/serio.h
'q' 80-FF linux/telephony.h linux/ixjuser.h Internet PhoneJACK, Internet LineJACK [http://web.archive.org/web/%2A/http://www.quicknet.net](http://web.archive.org/web/%2A/http://www.quicknet.net)
'r' 00-1F linux/msdos_fs.h and fs/fat/dir.c
's' all linux/cdk.h
't' 00-7F linux/ppp-ioctl.h
't' 80-8F linux/isdn_ppp.h
't' 90-91 linux/toshiba.h toshiba and toshiba_acpi SMM
'u' 00-1F linux/smb_fs.h gone
'u' 20-3F linux/uvcvideo.h USB video class host driver
'u' 40-4f linux/udmabuf.h userspace dma-buf misc device
'v' 00-1F linux/ext2_fs.h conflict!
'v' 00-1F linux/fs.h conflict!
'v' 00-0F linux/sonypi.h conflict!
'v' 00-0F media/v4l2-subdev.h conflict!
'v' 20-27 arch/powerpc/include/uapi/asm/vas-api.h VAS API
'v' C0-FF linux/meye.h conflict!
'w' all CERN SCI driver
'y' 00-1F packet based user level communications [mailto:[email protected]](mailto:[email protected])
'z' 00-3F CAN bus card conflict! [mailto:[email protected]](mailto:[email protected])
'z' 40-7F CAN bus card conflict! [mailto:[email protected]](mailto:[email protected])
'z' 10-4F drivers/s390/crypto/zcrypt_api.h conflict!
'|' 00-7F linux/media.h
0x80 00-1F linux/fb.h
0x81 00-1F linux/vduse.h
0x89 00-06 arch/x86/include/asm/sockios.h
0x89 0B-DF linux/sockios.h
0x89 E0-EF linux/sockios.h SIOCPROTOPRIVATE range
0x89 F0-FF linux/sockios.h SIOCDEVPRIVATE range
0x8B all linux/wireless.h
0x8C 00-3F WiNRADiO driver [http://www.winradio.com.au/](http://www.winradio.com.au/)
0x90 00 drivers/cdrom/sbpcd.h
0x92 00-0F drivers/usb/mon/mon_bin.c
0x93 60-7F linux/auto_fs.h
0x94 all fs/btrfs/ioctl.h and linux/fs.h Btrfs filesystem some lifted to vfs/generic
0x97 00-7F fs/ceph/ioctl.h Ceph file system
0x99 00-0F 537-Addinboard driver [mailto:[email protected]](mailto:[email protected])
0xA0 all linux/sdp/sdp.h Industrial Device Project [mailto:[email protected]](mailto:[email protected])
0xA1 0 linux/vtpm_proxy.h TPM Emulator Proxy Driver
0xA2 all uapi/linux/acrn.h ACRN hypervisor
0xA3 80-8F Port ACL in development: [mailto:[email protected]](mailto:[email protected])
0xA3 90-9F linux/dtlk.h
0xA4 00-1F uapi/linux/tee.h Generic TEE subsystem
0xA4 00-1F uapi/asm/sgx.h [mailto:[email protected]](mailto:[email protected])
0xA5 01-05 linux/surface_aggregator/cdev.h Microsoft Surface Platform System Aggregator [mailto:[email protected]](mailto:[email protected])
0xA5 20-2F linux/surface_aggregator/dtx.h Microsoft Surface DTX driver [mailto:[email protected]](mailto:[email protected])
0xAA 00-3F linux/uapi/linux/userfaultfd.h
0xAB 00-1F linux/nbd.h
0xAC 00-1F linux/raw.h
0xAD 00 Netfilter device in development: [mailto:[email protected]](mailto:[email protected])
0xAE 00-1F linux/kvm.h Kernel-based Virtual Machine [mailto:[email protected]](mailto:[email protected])
0xAE 40-FF linux/kvm.h Kernel-based Virtual Machine [mailto:[email protected]](mailto:[email protected])
0xAE 20-3F linux/nitro_enclaves.h Nitro Enclaves
0xAF 00-1F linux/fsl_hypervisor.h Freescale hypervisor
0xB0 all RATIO devices in development: [mailto:[email protected]](mailto:[email protected])
0xB1 00-1F PPPoX [mailto:[email protected]](mailto:[email protected])
0xB2 00 arch/powerpc/include/uapi/asm/papr-vpd.h powerpc/pseries VPD API <mailto:linuxppc-dev>
0xB2 01-02 arch/powerpc/include/uapi/asm/papr-sysparm.h powerpc/pseries system parameter API <mailto:linuxppc-dev>
0xB3 00 linux/mmc/ioctl.h
0xB4 00-0F linux/gpio.h [mailto:[email protected]](mailto:[email protected])
0xB5 00-0F uapi/linux/rpmsg.h [mailto:[email protected]](mailto:[email protected])
0xB6 all linux/fpga-dfl.h
0xB7 all uapi/linux/remoteproc_cdev.h [mailto:[email protected]](mailto:[email protected])
0xB7 all uapi/linux/nsfs.h <mailto:Andrei Vagin [[email protected]](mailto:[email protected])>
0xC0 00-0F linux/usb/iowarrior.h
0xCA 00-0F uapi/misc/cxl.h
0xCA 10-2F uapi/misc/ocxl.h
0xCA 80-BF uapi/scsi/cxlflash_ioctl.h
0xCB 00-1F CBM serial IEC bus in development: [mailto:[email protected]](mailto:[email protected])
0xCC 00-0F drivers/misc/ibmvmc.h pseries VMC driver
0xCD 01 linux/reiserfs_fs.h
0xCE 01-02 uapi/linux/cxl_mem.h Compute Express Link Memory Devices
0xCF 02 fs/smb/client/cifs_ioctl.h
0xDB 00-0F drivers/char/mwave/mwavepub.h
0xDD 00-3F ZFCP device driver see drivers/s390/scsi/ [mailto:[email protected]](mailto:[email protected])
0xE5 00-3F linux/fuse.h
0xEC 00-01 drivers/platform/chrome/cros_ec_dev.h ChromeOS EC driver
0xEE 00-09 uapi/linux/pfrut.h Platform Firmware Runtime Update and Telemetry
0xF3 00-3F drivers/usb/misc/sisusbvga/sisusb.h sisfb (in development) [mailto:[email protected]](mailto:[email protected])
0xF6 all LTTng Linux Trace Toolkit Next Generation [mailto:[email protected]](mailto:[email protected])
0xF8 all arch/x86/include/uapi/asm/amd_hsmp.h AMD HSMP EPYC system management interface driver [mailto:[email protected]](mailto:[email protected])
0xFD all linux/dm-ioctl.h
0xFE all linux/isst_if.h

补充

  1. <asm-generic/ioctl.h> 中,这类宏的定义为:
/*
 * Used to create numbers.
 *
 * NOTE: _IOW means userland is writing and kernel is reading. _IOR
 * means userland is reading and kernel is writing.
 */
#define _IO(type,nr)		_IOC(_IOC_NONE,(type),(nr),0)
#define _IOR(type,nr,size)	_IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOW(type,nr,size)	_IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOWR(type,nr,size)	_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOR_BAD(type,nr,size)	_IOC(_IOC_READ,(type),(nr),sizeof(size))
#define _IOW_BAD(type,nr,size)	_IOC(_IOC_WRITE,(type),(nr),sizeof(size))
#define _IOWR_BAD(type,nr,size)	_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))