FreeBSD 10.0 に新しい newbuf ドライバーをインストールしています。make でコンパイルすると、driver .ko ファイルが作成され、kldload で正常にロードできます。kldload は 0 を返し、kldstat 出力でデバイスを確認できます。/dev/** ファイルを開いてドライバを使用しようとすると、ファイルが存在しません。
この /dev/** ファイルは、device_attach メンバー メソッドにある make_dev 関数で作成する必要があると思います。kldload がこのアタッチ機能に到達したかどうかをテストします。ドライバーをデバッグするために printf と uprintf を書き込むと、コンソールにも dmesg の出力にも何も表示されません。しかし、問題は、device_identify および device_probe 関数の先頭 (ローカル変数定義の後) に printf を記述した後、コンソールでも dmesg でも出力が表示されないことです。
私の質問は、物理ドライバーに問題がある (見つからないなど) 場合でも、コースの開始時に kldload によって呼び出される device_identify メンバー関数で printf の出力を確認する必要があるということです (私は思います)。
newbuf ドライバーを printf でデバッグするときに間違いがありますか (hello_world デバイスドライバーも試しましたが、このドライバーでは dmesg で printf の出力を取得できます)。
主に、このドライバーの kldload プロセスをテスト/デバッグするにはどうすればよいですか?
ドライバー コードの一部の下 (少なくとも MSG1 が表示されるはずですが、表示されません):
struct mydrv_softc
{
device_t dev;
};
static devclass_t mydrv_devclass;
static struct cdevsw mydrv_cdevsw = {
.d_version = D_VERSION,
.d_name = "mydrv",
.d_flags = D_NEEDGIANT,
.d_open = mydrv_open,
.d_close = mydrv_close,
.d_ioctl = mydrv_ioctl,
.d_write = mydrv_write,
.d_read = mydrv_read
};
static void mydrv_identify (driver_t *driver, device_t parent) {
devclass_t dc;
device_t child;
printf("MSG1: The process inside the identfy function.");
dc = devclass_find("mydrv");
if (devclass_get_device(dc, 0) == NULL) {
child = BUS_ADD_CHILD(parent, 0, "mydrv", -1);
}
}
static int mydrv_probe(device_t dev) {
printf("MSG2: The process inside the probe function.");
mydrv_init();
if (device_get_unit(dev) != 0)
return (ENXIO);
device_set_desc(dev, "FreeBSD Device Driver");
return (0);
}
static int mydrv_attach(device_t dev) {
struct mydrv_softc *sc;
device_printf(dev, "MSG3: The process will make attachment.");
sc = (struct mydrv_softc *) device_get_softc(dev);
sc->dev = (device_t)make_dev(&mydrv_cdevsw, 0, UID_ROOT, GID_WHEEL, 0644, "mydrv_drv");
return 0;
}
static int mydrv_detach(device_t dev) {
struct mydrv_softc *sc;
sc = (struct mydrv_softc *) device_get_softc(dev);
destroy_dev((struct cdev*)(sc->dev));
bus_generic_detach(dev);
return 0;
}
static device_method_t mydrv_methods[] = {
DEVMETHOD(device_identify, mydrv_identify),
DEVMETHOD(device_probe, mydrv_probe),
DEVMETHOD(device_attach, mydrv_attach),
DEVMETHOD(device_detach, mydrv_detach),
{ 0, 0 }
};
static driver_t mydrv_driver = {
"mydrv",
mydrv_methods,
sizeof(struct mydrv_softc),
};
DRIVER_MODULE(mydrv, ppbus, mydrv_driver, mydrv_devclass, 0, 0);