Ioctl 番号
1998 年 2 月 18 日
Michael Chastain
<mec@shout.net>

カーネルに新しい ioctl を追加する場合、<linux/ioctl.h> で定義されている _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 に送るか、もし
くは私 <mec@shout.net> に 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:
                    <mailto:natalia@nikhefk.nikhef.nl>
'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:
                    <http://mikonos.dia.unisa.it/tcfs>
'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:
                    <tim@cyberelk.net>
'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:
                    <mailto:hdstich@connectu.ulm.circular.de>
'z'     40-7F   CAN bas card        in development:
                    <mailto:oe@port.de>
'6'     00-10   <asm-i386/processor.h>  Intel IA32 microcode update driver
                                        <mailto:tigran@veritas.com>
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:
                    <http://www.proximity.com.au/~brian/winradio/>
0x90    00      linux/sbpcd.h
0x93    60-7F   linux/auto_fs.h
0x99    00-0F   537-Addinboard driver   in development:
                    <mailto:b.kohl@ipn-b.comlink.apc.org>
0xA0    all     Small Device Project    in development:
                    <mailto:khollis@northwest.com>
0xA3    80-8F   Port ACL        in development:
                    <mailto:tlewis@mindspring.com>
0xA3    90-9F   DoubleTalk driver   in development:
                    <mailto:jrv@vanzandt.mv.com>
0xAB    00-06   Network block device

