ダミーのブロック デバイスを作成するブロック ドライバー プログラムを作成しました ( sbd0
)。そのブロックデバイスのすべてのデバイス操作を登録しました: ( include/linux/blkdev.h
2.6.32 カーネルソースを参照)
static struct block_device_operations sbd_ops = {
.owner = THIS_MODULE,
.open = sbd_open,
.release = sbd_close,
.ioctl = sbd_ioctl,
.getgeo = sbd_getgeo,
.locked_ioctl = sbd_locked_ioctl,
.compat_ioctl = sbd_compat_ioctl,
.direct_access = sbd_direct_access,
.media_changed = sbd_media_changed,
.revalidate_disk = sbd_revalidate_disk
};
ドライバープログラムをコンパイルしました。モジュールを挿入して/dev/sbd0
作成しました。次に、ドライバー コードをテストします。というわけで、以下のような申請書を書きました。
fd = open("/dev/sbd0", O_RDONLY);
retval = ioctl(fd, BLKBSZGET, &blksz); //trying to get logical block size
出力は次のとおりです。4096
私は疑問に思いました: ioctl を実装していませんでしたBLKBSZGET
。my を呼び出さずsbd_ioctl
、代わりにデフォルトのドライバーを使用して結果を返しました。の場合open
、それを実行し、(私が実装した)とclose
呼びます。そして、私は試しました:sbd_open
sbd_close
retval = ioctl(fd, HDIO_GETGEO, &geoinfo);
呼び出しましsbd_getgeo
たが、呼び出すと思いましたsbd_ioctl
。
ここに私の質問があります:
- ドライバーを実装し、デバイスを作成しました。そのデバイスで何らかの操作を実行する場合、ドライバー アプリケーションを呼び出す必要があります。しかし、いくつかのドライバー関数といくつかのデフォルトのドライバー関数をどのように使用するのでしょうか?
ioctl(fd, HDIO_GETGEO, ..)
呼び出しを呼び出しませんでし.ioctl
たが、呼び出し.getgeo
ました。これはどのように可能ですか?