DRIVER(9)

名称
driver - デバイスドライバを記述する構造体

書式

    #include <sys/param.h>
    #include <sys/bus.h>
    static int foo_probe(device_t);
    static int foo_attach(device_t);
    static int foo_detach(device_t);
    static int foo_frob(device_t, int, int);
    static int foo_twiddle(device_t, char *);
    static struct device_method foo_methods[] = {
    	/* デバイスインタフェースからのメソッド */
    	DEVMETHOD(device_probe,		foo_probe),
    	DEVMETHOD(device_attach,	foo_attach),
    	DEVMETHOD(device_detach,	foo_detach),
    	/* bogo インタフェースからのメソッド */
    	DEVMETHOD(bogo_frob,		foo_frob),
    	DEVMETHOD(bogo_twiddle,		foo_twiddle),
    	/* メソッドリストの終端 */
    	{ 0, 0 }
    };
    static driver_t foo_driver {
    	"foo",
    	foo_methods,
    	DRIVER_TYPE_MISC,
    	sizeof(struct foo_softc),
    };
    static devclass_t foo_devclass;
    DRIVER_MODULE(foo, bogo, foo_driver, foo_devclass, 0, 0);

解説
カーネルの中の個々のドライバは driver_t 構造体によって記述されます。 この構造体はデバイスの名称、メソッドのリストへのポインタ、 ドライバが実装したデバイスの種類の表示、 およびドライバがデバイスインスタンスに関連付けるために必要な私的データの大きさ を含んでいます。 各々のドライバは 1 つ以上の (インタフェースと呼ばれる) メソッドの組を 実装します。 上記の例のドライバは標準の "driver" インタフェースと 仮想的な "bogo" インタフェースを実装しています。

ドライバが ( DRIVER_MODULE マクロによって、 DRIVER_MODULE(9) を参照) システムに登録される時に、 その親のバスタイプの devclass の中に含まれている ドライバのリストに追加されます。 例えば、全ての PCI ドライバは "pci" と名付けられた devclass に含まれ、 全ての ISA ドライバは "isa" と名付けられた devclass に含まれます。 ドライバが親のバスのデバイスオブジェクトの中に保持されない理由は、 与えられたバスのタイプの複数のインスタンスを取り扱うためです。 DRIVER_MODULE マクロはそのドライバの名前の devclass も生成します。 最後の 2 つの引数として追加のモジュールイベントハンドラとその引数を 与えることによって、 オプションでドライバの追加の初期化コードを呼び出すことができます。

関連項目
devclass(9), device(9), DRIVER_MODULE(9)

作者
このマニュアルページは Doug Rabson が書きました。