加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 为什么内核使用默认的块驱动程序而不是我的驱动程序代

发布时间:2020-12-13 19:18:44 所属栏目:Linux 来源:网络整理
导读:我写了一个块驱动程序,它创建了一个虚拟块设备(sbd0).我为该块设备注册了所有设备操作:(请参阅2.6.32内核源代码中的include / linux / blkdev.h) static struct block_device_operations sbd_ops = { .owner = THIS_MODULE,.open = sbd_open,.release = sbd_
我写了一个块驱动程序,它创建了一个虚拟块设备(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,..)没有调用.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,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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读