【发布时间】:2014-04-24 10:14:42
【问题描述】:
我编写了一个块驱动程序来创建一个虚拟块设备 (sbd0)。我为那个块设备注册了所有设备操作:(参考2.6.32内核源码中的include/linux/blkdev.h)
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 实现 ioctl。它没有调用我的sbd_ioctl,而是使用了默认驱动程序并给了我结果。对于open,close 调用它执行sbd_open 和sbd_close(我实现了)。然后我尝试了:
retval = ioctl(fd, HDIO_GETGEO, &geoinfo);
它调用了sbd_getgeo,但我认为它会调用sbd_ioctl。
这是我的问题:
- 我实现了一个驱动程序并创建了一个设备。如果我对该设备执行任何操作,它必须调用我的驱动程序应用程序。但它是如何使用我的一些驱动程序函数和一些默认驱动程序函数的呢?
-
ioctl(fd, HDIO_GETGEO, ..)没有调用.ioctl调用,但它调用了.getgeo。这怎么可能?
【问题讨论】:
标签: linux kernel block-device