ioctl 番号 1999 年 10 月 19 日 Michael Elizabeth Chastain カーネルに新しい ioctl を追加する場合、 で定義されている _IO マクロを使用するようにしてください。 _IO 引数無しの ioctl _IOW 書込み用引数を伴う ioctl (copy_from_user) _IOR 読出し用引数を伴う ioctl (copy_to_user) _IOWR 読出し用引数、書込み用引数の両方を伴う ioctl 「書込み」や「読出し」は、ちょうどシステムコールの write や read と同様、 ユーザからの視点です。例えば、SET_FOO ioctl は実際にはカーネルがユーザ 空間からデータを読み出すことになりますが _IOW になるでしょうし、GET_FOO ioctl は実際にはカーネルがユーザ空間にデータを書き込むことになりますが、 _IOR になるでしょう。 _IO, _IOW, _IOR, _IOWR の一番目の引数は、下記のテーブル内の文字または 数字の識別子です。大量のドライバがあるので、多くのドライバが、一部の 文字を他のドライバと共用しています。 新しいデバイス用のドライバを書いていて、文字を必要とする場合は、32 から 256 個の ioctl コマンドを用意できるような十分な拡張性のある、利用されて いない文字を選んでください。このファイルに対するパッチを作成し、そのパッ チを Linus Torvalds に提出することで、ブロックを登録できます。または、私 にメールしてもらえれば、私が代わりに登録します。 _IO, _IOW, _IOR, _IOWR の二番目の引数は、各 ioctl を区別するためのシー ケンス番号です。_IOW, _IOR, _IOWR の三番目の引数は、カーネルに渡したり、 カーネルから渡されたりするデータの型です (例えば 'int' や 'struct foo')。 ioctl が size_t 型の引数を渡されたと思ってしまうので、sizeof(arg) を 三番目の引数として渡すことがないよう、注意してください! メジャー番号を識別子として使うデバイスもありますが、それが一意である 限り、大丈夫です。変則的で、慣習にまったく従わないデバイスもあります。 この慣習に従うことは良いことです。理由は次のとおりです。 (1) ioctl を全体で一意にすることにより、エラーのチェックが楽になります。 プログラムが間違って別のデバイスに ioctl を発行しても、予想外の動作 が起こるのではなく、エラーを受け取れます。 (2) 'strace' ビルド処理が、_IO, _IOW, _IOR, _IOWR で定義された ioctl 番号を自動的に見つけます (訳注:strace を make するとき linux/ ioctlent.sh というスクリプトがこの自動処理を担当します)。 (3) 番号が一意であれば、'strace' が、番号をより有用な名前にデコード できます。 (4) ioctl 番号を定義する際にこの慣習が使われていれば、ioctl を探す人が より簡単に grep できます。 (5) 慣習に従っていれば、ユーザ空間とカーネル空間のあいだでパラメータの コピーをおこなう汎用コードを、ドライバで使用できるようになります。 このテーブルは、Linux/i386 のユーザ空間から見える ioctl の一覧です。 2.3.14 までのほとんどのドライバが含まれていますが、幾つか欠けている ことが分かっています。 Code Seq# インクルードファイル コメント ======================================================== 0x00 00-1F linux/fs.h 競合! 0x00 00-1F scsi/scsi_ioctl.h 競合! 0x00 00-1F linux/fb.h 競合! 0x00 00-1F linux/wavefront.h 競合! 0x02 全て linux/fd.h 0x03 全て linux/hdreg.h 0x04 全て linux/umsdos_fs.h 0x06 全て linux/lp.h 0x09 全て linux/md.h 0x12 全て linux/fs.h linux/blkpg.h 0x20 全て drivers/cdrom/cm206.h 0x22 全て scsi/sg.h '#' 00-3F IEEE 1394 サブシステム サブシステム全体用のブロック '1' 00-1F Ulrich Windl の PPS キット < ftp://ftp.de.kernel.org/pub/linux/daemons/ntp/PPS/ > '6' 00-10 Intel IA32 マイクロコード更新ドライバ '8' 全て SNP8023 アドバンスト NIC カード 'A' 00-1F linux/apm_bios.h 'B' C0-FF アドバンスト bbus 'C' 全て linux/soundcard.h 'D' 全て asm-s390/dasd.h 'F' 全て linux/fb.h 'I' 全て linux/isdn.h 'J' 00-1F drivers/scsi/gdth_ioctl.h 'K' 全て linux/kd.h 'L' 00-1F linux/loop.h 'L' E0-FF linux/ppdd.h 暗号化ディスクデバイスドライバ < http://linux01.gwdg.de/~alatham/ppdd.html > 'M' 全て linux/soundcard.h 競合! 'M' 00-1F linux/isicom.h 競合! 'N' 00-1F drivers/sub/scanner.h 'P' 全て linux/soundcard.h 'Q' 全て linux/soundcard.h 'R' 00-1F linux/random.h 'S' 全て linux/cdrom.h 競合! 'S' 80-81 scsi/scsi_ioctl.h 競合! 'S' 82-FF scsi/scsi.h 競合! 'T' 全て linux/soundcard.h 競合! 'T' 全て asm-i386/ioctls.h 競合! 'U' 00-EF linux/drivers/usb/usb.h 'U' F0-FF drivers/usb/auerswald.c 'V' 全て linux/vt.h 'W' 00-1F linux/watchdog.h 競合! 'W' 00-1F linux/wanrouter.h 競合! 'X' 全て linux/xfs_fs.h 競合! 'Y' 全て linux/cyclades.h 'a' 全て ATM on Linux < http://lrcwww.epfl.ch/linux-atm/magic.html > 'b' 00-FF bit3 vme ホストブリッジ 'c' 00-7F linux/comstats.h 競合! 'c' 00-7F linux/coda.h 競合! 'd' 00-1F linux/devfs_fs.h 競合! 'd' 00-DF linux/video_decoder.h 競合! 'd' F0-FF linux/digi1.h 'e' 全て linux/digi1.h 競合! 'e' 00-1F linux/video_encoder.h 競合! 'e' 00-1F net/irda/irtty.h 競合! 'f' 00-1F linux/ext2_fs.h 'h' 00-7F Charon ファイルシステム 'i' 00-3F linux/i2o.h 'j' 00-3F linux/joystick.h 'k' 全て asm-sparc/kbio.h asm-sparc64/kbio.h 'l' 00-3F linux/tcfs_fs.h 透過的暗号化ファイルシステム < http://mikonos.dia.unisa.it/tcfs > 'l' 40-7F linux/udf_fs_i.h 開発中: < http://www.trylinux.com/projects/udf/ > 'm' 全て linux/mtio.h 競合! 'm' 全て linux/soundcard.h 競合! 'm' 全て linux/synclink.h 競合! 'm' 00-1F net/irda/irmod.h 競合! 'n' 00-7F linux/ncp_fs.h 'n' E0-FF video/matrox.h matroxfb 'p' 00-3F linux/mc146818rtc.h 'p' 40-7F linux/nvram.h 'p' 80-9F ユーザ空間 parport 'q' 00-1F linux/videotext.h 競合! 'q' 80-FF Internet PhoneJACK, Internet LineJACK < http://www.quicknet.net > 'r' 00-1F linux/msdos_fs.h 's' 全て linux/cdk.h 't' 00-7F linux/if_ppp.h 't' 80-8F linux/isdn_ppp.h 'u' 00-1F linux/smb_fs.h 'v' 00-1F linux/ext2_fs.h 競合! 'v' 全て linux/videodev.h 競合! 'w' 全て CERN SCI ドライバ 'y' 00-1F パケットベースユーザレベル通信 'z' 00-3F CAN バスカード 'z' 40-7F CAN バスカード 0x80 00-1F linux/fb.h 0x89 00-06 asm-i386/sockios.h 0x89 0B-DF linux/sockios.h 0x89 E0-EF linux/sockios.h SIOCPROTOPRIVATE 範囲 0x89 F0-FF linux/sockios.h SIOCDEVPRIVATE 範囲 0x8B 全て linux/wireless.h 0x8C 00-3F WiNRADiO ドライバ < http://www.proximity.com.au/~brian/winradio/ > 0x90 00 drivers/cdrom/sbpcd.h 0x93 60-7F linux/auto_fs.h 0x99 00-0F 537-Addinboard ドライバ 0xA0 全て linux/sdp/sdp.h Industrial Device Project 0xA3 80-8F Port ACL 開発中: 0xA3 90-9F linux/dtlk.h 0xAB 00-1F linux/nbd.h 0xAC 00-1F linux/raw.h 0xAD 00 Netfilter デバイス 開発中: 0xB0 全て RATIO デバイス 開発中: 0xB1 00-1F PPPoX 0xCB 00-1F CBM シリアル IEC バス 開発中: 0xDD 00-3F ZFCP デバイスドライバ drivers/s390/scsi/ 参照