JF Linux Kernel 2.6 Documentation: /usr/src/linux/Documentation/ioctl-number.txt

ioctl-number.txt

Ioctl 番号の割当て方針及び割当て済み番号のリスト [プレインテキスト版]


                              ioctl 番号

                           1999 年 10 月 19 日
                       Michael Elizabeth Chastain
                            <mec@shout.net>


カーネルに新しい ioctl を追加する場合、<linux/ioctl.h> で定義されている
_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 に提出することで、ブロックを登録できます。または、私
<mec@shout.net> にメールしてもらえれば、私が代わりに登録します。

_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   <linux/timepps.h>       Ulrich Windl の PPS キット
                                        < ftp://ftp.de.kernel.org/pub/linux/daemons/ntp/PPS/ >
'6'     00-10   <asm-i386/processor.h>  Intel IA32 マイクロコード更新ドライバ
                                        <mailto:tigran@veritas.com>
'8'     全て                            SNP8023 アドバンスト NIC カード
                                        <mailto:mcr@solidum.com>
'A'     00-1F   linux/apm_bios.h
'B'     C0-FF                           アドバンスト bbus
                                        <mailto:maassen@uni-freiburg.de>
'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 ホストブリッジ
                                        <mailto:natalia@nikhefk.nikhef.nl>
'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 ファイルシステム
                                        <mailto:zapman@interlan.net>
'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
                                        <mailto:tim@cyberelk.net>
'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                           パケットベースユーザレベル通信
                                        <mailto:zapman@interlan.net>
'z'     00-3F                           CAN バスカード
                                        <mailto:hdstich@connectu.ulm.circular.de>
'z'     40-7F                           CAN バスカード
                                        <mailto:oe@port.de>
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 ドライバ
                                        <mailto:buk@buks.ipn.de>
0xA0    全て    linux/sdp/sdp.h         Industrial Device Project
                                        <mailto:kenji@bitgate.com>
0xA3    80-8F   Port ACL                開発中:
                                        <mailto:tlewis@mindspring.com>
0xA3    90-9F   linux/dtlk.h
0xAB    00-1F   linux/nbd.h
0xAC    00-1F   linux/raw.h
0xAD    00      Netfilter デバイス      開発中:
                                        <mailto:rusty@rustcorp.com.au>
0xB0    全て    RATIO デバイス          開発中:
                                        <mailto:vgo@ratio.de>
0xB1    00-1F   PPPoX                   <mailto:mostrows@styx.uwaterloo.ca>
0xCB    00-1F   CBM シリアル IEC バス   開発中:
                                        <mailto:michael.klein@puffin.lb.shuttle.de>
0xDD    00-3F   ZFCP デバイスドライバ   drivers/s390/scsi/ 参照
                                        <mailto:aherrman@de.ibm.com>

Linux カーネル 2.6 付属文書一覧へ戻る