linux - 为什么内核使用默认 block 驱动程序而不是我的驱动程序代码?

标签 linux kernel block-device

我编写了一个 block 驱动程序来创建一个虚拟 block 设备 (sbd0)。我为那个 block 设备注册了所有的设备操作:(引用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,而是使用默认驱动程序并给了我结果。对于openclose 调用它执行sbd_opensbd_close(我实现的)。然后我尝试了:

retval = ioctl(fd, HDIO_GETGEO, &geoinfo);

它调用了 sbd_getgeo 但我认为它会调用 sbd_ioctl

这是我的问题:

  1. 我实现了一个驱动程序并创建了一个设备。如果我对该设备执行任何操作,它必须调用我的驱动程序应用程序。但是它是如何使用我的一些驱动程序函数和一些默认驱动程序函数的呢?
  2. ioctl(fd, HDIO_GETGEO, ..) 没有调用 .ioctl 调用,但它调用了 .getgeo。这怎么可能?

最佳答案

ioctl 调度由 blkdev_ioctl 函数处理,它将直接处理一些 ioctl,而不调用驱动程序的特定例程。

对于HDIO_GETGEO,它直接调用驱动程序的getgeo函数(从内核3.13.6开始,自2.6.32以来似乎没有太大变化):

[...]
/*
 * We need to set the startsect first, the driver may
 * want to override it.
 */
memset(&geo, 0, sizeof(geo));
geo.start = get_start_sect(bdev);
ret = disk->fops->getgeo(bdev, &geo); /* <- here */
[...]

对于BLKBSZGET,它调用block_size(bdev)),它只返回bdev->bd_block_size

如果您需要了解其他 ioctl 会发生什么情况,您可以在 block/ioctl.c 中找到 blkdev_ioctl

关于linux - 为什么内核使用默认 block 驱动程序而不是我的驱动程序代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23283209/

相关文章:

c - CentOS 版本之间的 glibc 差异

linux - 如何更改 Influxdb 存储文件夹的位置?

python - 在 Canopy 中同时运行脚本

linux - 当我尝试编译时生成 : Nothing to be done for `all' .

c - 对使用 O_DIRECT 打开的文件执行 'write' 后的用户缓冲区

windows - 如何在Windows中创建 "Block device"

java - ArrayIndexOutOfBoundsException : 3 issue in glassfish. 如何解决?

python - 在 Linux 上使用更新版本的 Python

c - 如何在C内核中创建和显示自定义字符?

python - 将 Windows CDROM 驱动器视为 block 文件?