Ioctl 番号 1998 年 2 月 18 日 Michael Chastain カーネルに新しい ioctl を追加する場合、 で定義されている _IO マクロを使用するようにしてください。 _IO an ioctl with no parameters _IOW an ioctl with write parameters (from user's point of view) _IOR an ioctl with read parameters (from user's point of view) _IOWR an ioctl with both write and read parameters. _IO 引数無しの ioctl _IOW (ユーザーから見て) 書込み用引数付きの ioctl _IOR (ユーザーから見て) 読込み用引数付きの ioctl _IOWR 読み書き用引数付きの ioctl '書込み' や '読込み' はユーザーからの視点です。これは 'write' や 'read' シス テムコールと同様です。例えば、SET_FOO ioctl は実際にはカーネルがユーザー領域 からデータを読み込むことになるでしょうが _IOW を用いて定義されるでしょうし、 GET_FOO ioctl は実際にはカーネルがユーザー領域に書き込むことになるでしょうが、 _IOR を用いて定義されるでしょう。 _IO, _IOW, _IOR, _IOWR の一番目の引数は、下記にあるテーブルに載っている英数 字です。新しいデバイス用のドライバーを書いていて、新しい文字の割り当てが必 要な時は利用されていない文字を選んでください。新しい文字を登録するにはこの ファイルに記述を加えてパッチを作成し、それを Linus Torvalds に送るか、もし くは私 に e-mail を送ってもらえればそれを代わりに登録します。 _IO, _IOW, _IOR, _IOWR の二番目の引数は、各 ioctl を区別するための序数(連続) 番号です。三番目の引数はカーネルが読み書きする構造体のサイズです。 メジャー番号をマジックナンバーとして使用するデバイスもありますが、これは お勧めできません。もっと変則的で、慣習にまったく従わないデバイスもあります。 次の慣習に従うことをお勧めします。その理由としては - (1) ioctl を全体で一意にすることにより、エラーのチェックが楽になる - プログラムが間違って別のデバイスに ioctl を発行しても、予想外の動作の 代わりにエラーが表示される。 (2) 'strace' ビルド処理が、_IO, _IOW, _IOR, _IOWR で定義された ioctl 番号を 自動的に見つける (訳注:strace を make するとき linux/ioctlent.sh という スクリプトがこの自動処理を担当します)。 (3) 番号が一意であれば、'strace' は番号をより有用な名前にデコードできる。 (4) ioctl 番号を定義するのに慣習に従っていれば、ioctl を探す人はより簡単に grep できる。 (5) 慣習に従うと、ドライバーのコードが引数の有効性を確認するのに、verify_area を呼び出す一般的なコードを利用できる (訳注:verify_area は 2.1.8 以降、 asm/uaccess.h 内の access_ok に取って代わられました。なお、get_user 等 のユーザ領域アクセスマクロの多くは、内部で access_ok を利用しています)。 このテーブルは Linux/i386 におけるユーザー領域から見える ioctl の一覧です。 これは Linux 2.1.15 現在の状態です。 Code Seq# Include File Comments ======================================================== 0x00 01-02 linux/fs.h conflict! 0x00 01-04 scsi/scsi_ioctl.h conflict! 0x02 all linux/fd.h 0x03 all linux/hdreg.h 0x04 all linux/umsdos_fs.h 0x06 all linux/lp.h 0x09 all linux/md.h 0x12 all linux/fs.h 0x20 all linux/cm206.h 0x22 all scsi/sg.h 'A' all linux/apm_bios.h 'C' all linux/soundcard.h 'D' all asm-s390/dasd.h 'F' all linux/fb.h 'I' all linux/isdn.h 'K' all linux/kd.h 'L' all linux/loop.h 'M' all linux/soundcard.h 'P' all linux/soundcard.h 'Q' all linux/soundcard.h 'R' all linux/random.h 'S' 00-7F linux/cdrom.h 'S' 80-81 scsi/scsi_ioctl.h 'S' 82-FF scsi/scsi.h 'T' all linux/soundcard.h conflict! 'T' all asm-i386/ioctls.h conflict! 'V' all linux/vt.h 'W' 00-1F linux/router.h conflict [Please reallocate] 'W' 00-1F linux/watchdog.h 'W' 20-27 linux/octal-relay.h in development 'W' 28-2F linux/iso16-relay.h in development 'Y' all linux/cyclades.h 'Z' all linux/drivers/scsi/cpqfcTSioctl.h 'a' all various, see http://lrcwww.epfl.ch/linux-atm/magic.html 'b' 00-FF bit3 vme host bridge in development: 'c' all linux/comstats.h 'f' all linux/ext2_fs.h 'j' 00-3F linux/joystick.h 'k' all asm-sparc/kbio.h, asm-sparc64/kbio.h 'l' 00-3F linux/tcfs_fs.h in development: 'm' all linux/mtio.h conflict! 'm' all linux/soundcard.h conflict! 'n' all linux/ncp_fs.h 'p' 00-3F linux/mc146818rtc.h 'p' 40-7F linux/nvram.h 'p' 80-9F user-space parport in development: 'r' all linux/msdos_fs.h 's' all linux/cdk.h 't' 00-7F linux/if_ppp.h 't' 80-8F linux/isdn_ppp.h 'u' all linux/smb_fs.h 'v' all linux/ext2_fs.h 'w' all CERN SCI driver in development 'z' 00-3F CAN bus card in development: 'z' 40-7F CAN bas card in development: '6' 00-10 Intel IA32 microcode update driver 0x89 00-0F asm-i386/sockios.h 0x89 10-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 in development: 0x90 00 linux/sbpcd.h 0x93 60-7F linux/auto_fs.h 0x99 00-0F 537-Addinboard driver in development: 0xA0 all Small Device Project in development: 0xA3 80-8F Port ACL in development: 0xA3 90-9F DoubleTalk driver in development: 0xAB 00-06 Network block device