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.这怎么可能?
对于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.
总结以上是内存溢出为你收集整理的linux – 为什么内核使用默认的块驱动程序而不是我的驱动程序代码?全部内容,希望文章能够帮你解决linux – 为什么内核使用默认的块驱动程序而不是我的驱动程序代码?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)