書式
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/bus.h>
#include <sys/module.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 device_method_t 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),
/* メソッドリストの終了 */
DEVMETHOD_END
};
static driver_t foo_driver = {
"foo",
foo_methods,
sizeof(struct foo_softc)
};
static devclass_t foo_devclass;
DRIVER_MODULE(foo, bogo, foo_driver, foo_devclass, NULL, NULL);
解説
カーネル中の各ドライバは、
driver_t 構造体によって記述されます。構造体は、デバイスの名前、メソッドのリストへのポインタ、ドライバが実装したデバイスの種類の表示、およびドライバがドライバのインスタンスと関連付けるために必要なプライベートデータのサイズ、を含んでいます。各ドライバは、1 つ以上の (インタフェースと呼ばれる) メソッドの一式を実装します。例のドライバは、標準の "driver"インタフェースと架空の "bogo"インタフェースを実装しています。
ドライバが ( DRIVER_MODULE マクロによって、 DRIVER_MODULE(9) を参照) システムに登録されるとき、その親バスタイプのデバイスクラス (devclass) に含まれているドライバのリストに追加されます。例えば、すべての PCI ドライバは、"pci"と名前が付けられたデバイスクラス (devclass) に含まれ、すべての ISA ドライバは、"isa"と名前が付けられたデバイスクラス (devclass) に含まれます。ドライバが親のバスのデバイスオブジェクトの中に保持されない理由は、与えられたバスのタイプの複数のインスタンスを扱うためです。また、 DRIVER_MODULE マクロは、ドライバの名前でデバイスクラス (devclass) を作成し、オプションで最後の 2 つの引数として特別なモジュールのイベントハンドラと引数を指定することによって、ドライバの特別な初期化コードを呼び出すことができます。