我编写了一个块驱动程序来创建一个虚拟块设备(sbd0)。我为那个块设备注册了所有设备操作:(参考include/linux/blkdev.h2.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
我想知道:我没有为BLKBSZGET. 它没有调用 my sbd_ioctl,而是使用默认驱动程序并给了我结果。对于open,close调用它执行sbd_open和sbd_close(我实现)。然后我尝试了:
retval = ioctl(fd, HDIO_GETGEO, &geoinfo);
它调用sbd_getgeo了,但我认为它会调用sbd_ioctl.
以下是我的问题:
- 我实现了一个驱动程序并创建了一个设备。如果我对该设备执行任何操作,它必须调用我的驱动程序应用程序。但是它如何使用我的一些驱动程序函数和一些默认的驱动程序函数呢?
ioctl(fd, HDIO_GETGEO, ..)没有调用.ioctlcall,但它调用了.getgeo. 这怎么可能?