linux ioctl及ioctl command
在linux驱动中经常用到的函数为open、read、write用于对设备进行读取和写入数据,但是除了上述功能之外还有另外一个重要的功能ioctl,很多时候用户程序需要根据自己的需求配置所操纵的硬件,比如修改波特兰,获取设备信息等,可以通过ioctl方法来进行与该设备的驱动进行交互,ioctl是在用户层可以之间与内核驱动打交道最直接的方式,但是其自身也有一些缺点。
ioctl整个可以分为用户和内核两个部分。
系统调用ioctl
用户层主要是通过使用ioctl系统调用函数来直接控制设备相关配置,可以使用man 查看其函数原型:
int ioctl(int fd, unsigned long request,...)
对该函数解释如下:
The ioctl() system call manipulates the underlying device parameters of special files. In particular, many operating char acteristics of character special files(e.g., terminals) may be controlled with ioctl() requests.
函数参数:
int fd:打开的文件描述符...
unsigned long request: 在旧的版本中称之为ioctl command,之后进行了修改称置为 a device-dependent request code,主要为ioctl的命令字段,拥有固定的格式,包含系统预定义命令以及每个驱动设备特有的自定义命令字段。
...:表示为一个可选参数,并不是数目不一定的一串参数,习惯上使用char *argp来定义,而在这里只是为了在编译时防止编译器进行类型检查。其参数的具体形式依赖于要完成的控制命令,也就是第二个参数某些控制命令不需要参数,某些需要一个整数参数,而一些则需要一个指针参数。使用指针可以向ioctl调用传递任意数据,这样设备可以与用户空间交换任意的数据。
内核unlocked_ioctl
在前面《linux 内核inode VS file》提到struct file 是一种进程资源,在每个进程中每打开一个文件将会创建一个file结构,通过文件描述符将file结构在进行资源task中进行管理所有当前进程打开的文件,而针对驱动文件而言,当使用ioctl操作该设备时,实际上是调用的struct file_operations结构中的unlocked_ioctl,每个驱动设备严格意义上需要实现自己特有的ioctl命令相对应的实现,该回调函数定义如下:
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long)
实际上系统调用ioctl最终就是调用的struct file_operations中的unlocked_ioctl回调函数。
ioctl command命令字段
在编写ioctl代码之前,需要选择对应不同命令的编号。多数程序源的第一本能是从0或者1开始选择一组小的编号。然而,有许多理由要求不能这样选择命令编号。为了防止对错误的设备使用正确的命令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对FIFO和audio等这类非串行设备输入流改波特率。如果每一个ioctl 命令都是唯一的,应用程序进行这种操作时就会得到一个EINVAL错误,而不是无意间成功地完成了意想不到的caoz。
kernel经过多个版本的演进,ioctl command为一个32位无符号整型,将其划分位4个字段,其划分方式如下:
- nr: number序列号,用于表示该命令字段内的序列号
- type: 类型也有称幻数,同一个ioctl内的所有命令字段的type 都相同。
- size: 所涉及到用户数据大小,即系统调用ioctl传递的数据大小
- direction: 数据的传递方向。
nr(number)
为一个8bit大小的位宽,一般是由驱动开发人员自己定义
type
8bit 大小,该数据为全局唯一
size
用户数据的大小,这个字段的宽度与体系结构有关,通常是13位或者14位。内核并不会检查这个位字段,对该字段的正确使用可以帮助我们检测用户空间的错误,并且如果我们从不改变相关数据项大小,这个字段还可以帮助我们实现向后兼容
direction
数据传输方向,为了操作方便,内核在include\uapi\asm-generic\ioctl.h定义了几个特殊的宏:
#ifndef _IOC_NONE
# define _IOC_NONE 0U
#endif#ifndef _IOC_WRITE
# define _IOC_WRITE 1U
#endif#ifndef _IOC_READ
# define _IOC_READ 2U
#endif
数据传输是从应用程序的角度说明,比如_IOC_READ意味着是从设备中读取数据,所以驱动程序必须向用户空间写入数据。如果该命令即可读也可写则可以使用逻辑AND操作:_IOC_READ|_IOC_WRITE
ioctl command常见宏
内核在include\uapi\asm-generic\ioctl.h文件中定义了几个基本常见宏:
#define _IOC_NRBITS 8
#define _IOC_TYPEBITS 8#ifndef _IOC_SIZEBITS
# define _IOC_SIZEBITS 14
#endif#ifndef _IOC_DIRBITS
# define _IOC_DIRBITS 2
#endif#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)#define _IOC_NRSHIFT 0
#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
其中根据上述的几个宏定义了一个基本的ioctl命令宏_IOC
#define _IOC(dir,type,nr,size) \(((dir) << _IOC_DIRSHIFT) | \((type) << _IOC_TYPESHIFT) | \((nr) << _IOC_NRSHIFT) | \((size) << _IOC_SIZESHIFT))
dir为数据方向,type为命令类型,nr为命令序列号, size为数据大小,为了进一步操作方便,内核又在_IOC宏上定义了几个宏:
#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))
_IO为既不是读也不是写命令类型
_IOR为 read 命令类型
_IOW为write命令类型
上述几个宏内部又添加了size大小检查
_IOXX_BAD类型宏没有size大小检查。
ioctl command分配情况
在内核\Documentation\userspace-api\ioctl\ioctl-number.rst文件中列出了其使用情况,以下是在linux-5.10.11版本中ioctl commnand已分配情况:
Code(Type) | Seq#(hex) | Include | File |
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 |
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-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 <mailto:alexander.shishkin@linux.intel.com> |
'&' | 00-07 | drivers/firewire/nosy-user.h | |
'1' | 00-1F | linux/timepps.h | PPS <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 <mailto:mcr@solidum.com> |
';' | 64-7F | linux/vfio.h | |
'@' | 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 |
'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 | |
'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 | drivers/video/intelfb/intelfb.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! |
'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:erazor_de@users.sourceforge.net> |
'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! |
'J' | 00-1F | drivers/scsi/gdth_ioctl.h | |
'K' | all | linux/kd.h | |
'L' | 00-1F | linux/loop.h | conflict! |
'L' | 10-1F | drivers/scsi/mpt3sas/mpt3sas_ctl.h | conflict! |
'L' | 20-2F | linux/lightnvm.h | |
'L' | E0-FF | linux/ppdd.h | encrypted <http://linux01.gwdg.de/~alatham/ppdd.html> |
'M' | all | linux/soundcard.h | conflict! |
'M' | 01-16 | mtd/mtd-abi.h | conflict! |
and | drivers/mtd/mtdchar.c | ||
'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! |
'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 | |
'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/davinci/vpfe_capture.h | conflict! |
'V' | C0 | media/si4713.h | conflict! |
'W' | 00-1F | linux/watchdog.h | conflict! |
'W' | 00-1F | linux/wanrouter.h | conflict! |
'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! |
'Y' | all | linux/cyclades.h | |
'Z' | 14-15 | drivers/message/fusion/mptctl.h | |
'[' | 00-3F | linux/usb/tmc.h | USB <mailto:gregkh@linuxfoundation.org> |
'a' | all |
linux/atm*.h, linux/sonet.h |
<http://lrcwww.epfl.ch/> |
'a' | 00-0F | drivers/crypto/qat/qat_common/adf_cfg_common.h | conflict! |
'b' | 00-FF | conflict! bit3 <mailto:natalia@nikhefk.nikhef.nl> | |
'c' | all | linux/cm4000_cs.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 <mailto:zapman@interlan.net> | |
'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 | |
'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 |
'l' | 00-3F | linux/tcfs_fs.h | transparent http://web.archive.org/web/%2A/http://mikonos.dia.unisa.it/tcfs |
'l' | 40-7F | linux/udf_fs_i.h | in http://sourceforge.net/projects/linux-udf/ |
'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 |
'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! |
'o' | 40-41 | mtd/ubi-user.h | UBI |
'o' | 01-A1 | `linux/dvb/*.h` | DVB |
'p' | 00-0F | linux/phantom.h | conflict! |
'p' | 00-1F | linux/rtc.h | conflict! |
'p' | 40-7F | linux/nvram.h | |
'p' | 80-9F | linux/ppdev.h | user-space <mailto:tim@cyberelk.net> |
'p' | A1-A5 | linux/pps.h | LinuxPPS <mailto:giometti@linux.it> |
'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 |
'r' | 00-1F | linux/msdos_fs.h | and |
'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 |
'u' | 00-1F | linux/smb_fs.h | gone |
'u' | 20-3F | linux/uvcvideo.h | USB |
'u' | 40-4f | linux/udmabuf.h | userspace |
'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 |
'v' | C0-FF | linux/meye.h | conflict! |
'w' | all | CERN | SCI |
'y' | 00-1F |
packet based user level communications <mailto:zapman@interlan.net> |
|
'z' | 00-3F |
CAN bus card conflict! <mailto:hdstich@connectu.ulm.circular.de> |
|
'z' | 40-7F |
CAN bus card conflict! <mailto:oe@port.de> |
|
'z' | 10-4F | drivers/s390/crypto/zcrypt_api.h | conflict! |
'|' | 00-7F | linux/media.h | |
0x80 | 00-1F | linux/fb.h | |
0x89 | 00-06 | arch/x86/include/asm/sockios.h | |
0x89 | 0B-DF | linux/sockios.h | |
0x89 | E0-EF | linux/sockios.h | SIOCPROTOPRIVATE |
0x89 | E0-EF | linux/dn.h | PROTOPRIVATE |
0x89 | F0-FF | linux/sockios.h | SIOCDEVPRIVATE |
0x8B | all | linux/wireless.h | |
0x8C | 00-3F |
WiNRADiO driver <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 | Btrfs |
and | linux/fs.h | some | |
0x97 | 00-7F | fs/ceph/ioctl.h | Ceph |
0x99 | 00-0F |
537-Addinboard driver <mailto:buk@buks.ipn.de> |
|
0xA0 | all | linux/sdp/sdp.h |
Industrial Device Project <mailto:kenji@bitgate.com> |
0xA1 | 0 | linux/vtpm_proxy.h | TPM |
0xA3 | 80-8F |
Port ACL in development: <mailto:tlewis@mindspring.com> |
|
0xA3 | 90-9F | linux/dtlk.h | |
0xA4 | 00-1F | uapi/linux/tee.h | Generic |
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:rusty@rustcorp.com.au> |
|
0xAE | 00-1F | linux/kvm.h |
Kernel-based Virtual Machine <mailto:kvm@vger.kernel.org> |
0xAE | 40-FF | linux/kvm.h |
Kernel-based Virtual Machine <mailto:kvm@vger.kernel.org> |
0xAE | 20-3F | linux/nitro_enclaves.h | Nitro |
0xAF | 00-1F | linux/fsl_hypervisor.h | Freescale |
0xB0 | all |
RATIO devices in development: <mailto:vgo@ratio.de> |
|
0xB1 | 00-1F |
PPPoX <mailto:mostrows@styx.uwaterloo.ca> |
|
0xB3 | 00 | linux/mmc/ioctl.h | |
0xB4 | 00-0F | linux/gpio.h | <mailto:linux-gpio@vger.kernel.org> |
0xB5 | 00-0F | uapi/linux/rpmsg.h | <mailto:linux-remoteproc@vger.kernel.org> |
0xB6 | all | linux/fpga-dfl.h | |
0xB7 | all | uapi/linux/remoteproc_cdev.h | <mailto:linux-remoteproc@vger.kernel.org> |
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:michael.klein@puffin.lb.shuttle.de> |
|
0xCC | 00-0F | drivers/misc/ibmvmc.h | pseries |
0xCD | 01 | linux/reiserfs_fs.h | |
0xCF | 02 | fs/cifs/ioctl.c | |
0xDB | 00-0F | drivers/char/mwave/mwavepub.h | |
0xDD | 00-3F |
ZFCP device driver see drivers/s390/scsi/ <mailto:aherrman@de.ibm.com> |
|
0xE5 | 00-3F | linux/fuse.h | |
0xEC | 00-01 | drivers/platform/chrome/cros_ec_dev.h | ChromeOS |
0xF3 | 00-3F | drivers/usb/misc/sisusbvga/sisusb.h |
sisfb (in development) <mailto:thomas@winischhofer.net> |
0xF6 | all |
LTTng Linux Trace Toolkit Next Generation <mailto:mathieu.desnoyers@efficios.com> |
|
0xFD | all | linux/dm-ioctl.h | |
0xFE | all | linux/isst_if.h |
linux ioctl及ioctl command相关推荐
- Linux编程之ioctl
在和设备驱动程序通信时,ioctl是很常用的一个调用,常用来配置.查询或者修改设备的配置.反过来说,编写驱动程序时,ioctl也是经常要实现的一个接口,以便应用程序可以方便地控制设备驱动. 应用程序中 ...
- Linux下解决“shutdown: command not found“问题
Linux下解决"shutdown: command not found"问题 参考文章: (1)Linux下解决"shutdown: command not found ...
- Linux驱动设计ioctl函数的cmd参数不能为2
Linux驱动程序设计的时候偶然发现的ioctl()函数的cmd参数不能为2,如果为2,ioctl()函数返回-1,网上说就是这样的,正常,不知道为什么,stack overflow上有一个外国学友的 ...
- linux驱动之ioctl
大部分驱动除了需要具备读写设备的能力之外,还需要具备对硬件控制的能力. 一.在用户空间,使用ioctl系统调用来控制设备,原型如下: int ioctl(int fd,unsigned long cm ...
- (八)linux驱动之ioctl的使用
这篇文章给大家讲解一下ioctl的简单使用,关于ioctl更详细的教程后面有机会单独写出来 (一)什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数.所谓对I/O通道进行管理 ...
- Linux下通过ioctl修改IP信息
通过ioctl修改和获取ip的地址.网关.掩码 #include <stdio.h> #include <string.h> #include <unistd.h> ...
- Linux内核驱动 --ioctl函数解析
1.前言 当我们在讨论linux内核驱动开发时,就不得不提到ioctl这个及其重要的函数.它是字符类设备驱动程序中实现对设备控制的接口之一. ioctl是设备驱动程序中对设备的I/O通道进行管理的函数 ...
- linux ioctl命令,关于LINUX下的ioctl函数
驱动程序中ioctl函数的函数原型如下: int (*ioctl)(struct inode *inode, struct file *filp,unsigned int cmd, unsigned ...
- Linux字符设备---ioctl详细解析
目录 一. 什么是ioctl 二.ioctl的必要性 三. ioctl如何实现 四. cmd参数如何得出 一. 什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数.所谓对I/ ...
最新文章
- python 获取当前时间 时间差
- linux端口转发到windows,Linux及Windows基于工具的端口转发
- 20161228阅读笔记
- wxpython实现鼠标拖动事件
- new JSONArray(ListMap).tostring()问题
- 【转】Tomcat+MyEclipse
- python生成器迭代_二十、深入Python迭代器和生成器
- JDBC之数据库的连接步骤(六步)
- EasyRTMP实现对接海康、大华等IPCamera SDK进行RTMP推送直播功能
- 点菜单项在面板中打开并判断是否打开
- 用MATLAB画出双极性NRZ,[工学]通信原理MATLAB仿真教程第7章.ppt
- mysql怎么跨库查询_在MySQL中怎样进行跨库查询?
- 图解 Cisco IOS 命名规范
- 实训六 思科路由器配置静态路由
- 一文让你秒懂存储虚拟化
- Git上传本地文件到服务器,git上传文件到远程服务器
- linux嵌入式系统开发心得,嵌入式学习牛人心得
- 百度识图上线,体验以图搜图
- 视频号在微信生态里的定位如何?
- 如何使用gcore以及viewcore排查问题
热门文章
- maven 引入war
- 有传闻说,写好总结可以升职加薪?
- Linux系统:centos7下搭建ElasticSearch中间件,常用接口演示
- RedHat系列软件管理(第二版) --脚本安装
- MSsqlserver服务快速打开和停止
- 分布式开发必须了解的Zookeeper的Leader选举机制(源码解析)
- C#操作DataReader类
- Windows运行命令收集
- 《Python爬虫开发与项目实战》——1.6 小结
- SQL Server -- SQL NULL值,ISNull(),Oracal NVL(),MYSQL IFNULL(),COALESCE()