【问题标题】:Why is the kernel using the default block driver instead of my driver's code?为什么内核使用默认块驱动程序而不是我的驱动程序代码?
【发布时间】: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,而是使用了默认驱动程序并给了我结果。对于openclose 调用它执行sbd_opensbd_close(我实现了)。然后我尝试了:

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

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

这是我的问题:

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

【问题讨论】:

    标签: linux kernel block-device


    【解决方案1】:

    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-&gt;bd_block_size

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

    【讨论】:

    • 你的意思是,首先由ioctl 处理blkdev_ioctl。那么直接由blkdev_ioctl 处理的ioctl 操作很少,其余的将由我的驱动程序函数处理?
    • 是的,就是这样。
    • 我看到了blkdev_ioctl的定义。真的很好,很清楚。现在我想看看ioctl 是如何调用blkdev_ioctl 的。我想查看源文件。我在哪个文件中得到这个?
    • 抱歉,打错了,3.13 中也没有block/ioctl.h。从用户空间 ioctl 调用到该函数的路线有点复杂。它从系统调用接口(@98​​7654339@、SYSCALL_DEFINE3(ioctl, ...)开始,然后向下追踪 VFS 结构中的指针,从文件向下追踪到相应的驱动程序。
    猜你喜欢
    • 1970-01-01
    • 2018-03-06
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多