driver(9) FreeBSD 一般コマンドマニュアル

driver

前のページ 上に戻る 次のページ

driver


     #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 つの引数として追加のモジュールイベントハンドラとその引数を与える
     ことによって、オプションでドライバの追加の初期化コードを呼び出すことがで
     きます。

ABELNET VPSサービス