免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4306 | 回复: 9

[内核模块] 用open_by_devnum获取块设备指针的时候出现了问题 [复制链接]

论坛徽章:
0
发表于 2012-05-31 10:49 |显示全部楼层
20可用积分
本帖最后由 almeydifer 于 2012-05-31 10:56 编辑

大家好,本人最近在调试一个有关块设备的相关程序,
但是总是遇到的一个问题就是在用open_by_devnum获取块设备指针的时候,老是获取不了正确的指针。
终端出现的错误是:
insmod: error inserting 'test.ko': -1 Cannot allocate memory

现在我把相关代码抠出来,放在了一个下面这个简单的模块里(2.6.18),大家帮我看看,我用dmesg获取到的信息是:

----------------------------------------
The device num is: 8388643
Before, Point is: 0000000000000000
After, Point is: fffffffffffffffa
Unable to load the device

如果大家有空,帮我看看呀!!
  1. #include <linux/config.h>
  2. #include <linux/module.h>
  3. #include <linux/moduleparam.h>
  4. #include <linux/init.h>
  5. #include <linux/kernel.h>
  6. #include <linux/fs.h>
  7. #include <linux/genhd.h>
  8. #include <linux/interrupt.h>
  9. #include <linux/smp_lock.h>
  10. #include <linux/completion.h>
  11. #include <linux/buffer_head.h>
  12. #include <linux/bio.h>
  13. #include <linux/errno.h>
  14. #include <linux/types.h>
  15. #include <linux/blkdev.h>
  16. #include <linux/hdreg.h>
  17. #include <linux/sched.h>
  18. #include <linux/slab.h>
  19. #include <linux/stat.h>
  20. #include <linux/timer.h>
  21. #include <linux/fcntl.h>
  22. #include <asm/uaccess.h>

  23. typedef struct _sba_dev {
  24.         struct block_device *f_dev;
  25.         unsigned long size;
  26.         spinlock_t lock;
  27.         struct gendisk *gd;
  28.         int usage;
  29. }sba_dev;

  30. sba_dev sba_device;

  31. int __init sba_init(void)
  32. {
  33.         dev_t f_dev_no;
  34.         static int f_dev[] = {MKDEV(8, 35)};
  35.        
  36.         f_dev_no = f_dev[0];

  37.     printk("----------------------------------------\n");
  38.         printk("The device num is: %d\n", f_dev_no);
  39.         printk("Before, Point is: %p\n", sba_device.f_dev);
  40.         sba_device.f_dev = open_by_devnum(f_dev_no, FMODE_READ|FMODE_WRITE);
  41.         printk(" After, Point is: %p\n", sba_device.f_dev);
  42.         if (IS_ERR(sba_device.f_dev)) {
  43.                 goto out;
  44.         }

  45.         return 0;

  46. out:
  47.         printk("Unable to load the device\n");
  48.         return -ENOMEM;
  49. }


  50. static __exit void sba_cleanup(void)
  51. {
  52.         printk("I am existing.....\n");
  53. }

  54. module_init(sba_init);
  55. module_exit(sba_cleanup);

  56. MODULE_LICENSE("GPL");
复制代码

最佳答案

查看完整内容

回复 7# almeydifer 好吧,特意换回Windows回这一帖。你通过那种接口得到的block device已经初始化好了。具体来说,它已经和某个gendisk对上了。MTD那段代码的意思是,先通过文件来获得block_device;但有可能存在驱动而由于文件系统没有准备好,这个设备文件根本不存在。所以下一步通过文件名来解析设备号,具体到块设备,则是去遍历所有已注册的块设备驱动,根据名字得到匹配项,从而得到device number。最后才通过device number ...

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
发表于 2012-05-31 10:49 |显示全部楼层
回复 7# almeydifer

好吧,特意换回Windows回这一帖。你通过那种接口得到的block device已经初始化好了。具体来说,它已经和某个gendisk对上了。

MTD那段代码的意思是,先通过文件来获得block_device;但有可能存在驱动而由于文件系统没有准备好,这个设备文件根本不存在。所以下一步通过文件名来解析设备号,具体到块设备,则是去遍历所有已注册的块设备驱动,根据名字得到匹配项,从而得到device number。最后才通过device number来打开设备。

无论哪一种情况,得到的block device都已经是可以拿来用了。你遇到的错误,简而言之,是因为系统中不存在驱动声明对这个设备号负责。

这个函数的注释里已经写的很清楚了,除非别无它法,不然不要使用。高版本的内核已经把它删掉了。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
发表于 2012-05-31 11:03 |显示全部楼层
kernel version first .....

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
发表于 2012-05-31 11:04 |显示全部楼层
fffffffffffffffa   == -6  ==  ENXIO  No such device or address

论坛徽章:
0
发表于 2012-05-31 12:17 |显示全部楼层
回复 3# tempname2


   谢谢回复,我就是奇怪,为什么就会产生这个指针值。
   我后面也在谷歌上搜了一下open_by_devnum这个函数的用法。都是差不多的。
   一般都是首先给出一个指向块设备的指针,然后通过传递进去的设备号,获得一个指向块设备的合法指针值。
  接着在进行相关的块设备初始化。

  内核版本的问题我也不敢确定。但是我看到过不同内核的版本也是通过上面这个方法。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
发表于 2012-05-31 14:04 |显示全部楼层
No, that's not the case. open_by_devnum returns block_device ready to use. It will finially call __blkdev_get, which in turn calls get_gendisk to get corresponding gendisk. If this device number is not backed by any driver, ENXIO will be the result.

论坛徽章:
0
发表于 2012-05-31 14:23 |显示全部楼层
回复 5# tempname2

谢谢回复,我在仔细看看。

另:
为什么要在中文论坛里用鸟文?
没有输入法吗?


   

论坛徽章:
0
发表于 2012-05-31 14:55 |显示全部楼层
回复 6# almeydifer


    您看下这个例子:

http://www.oschina.net/code/expl ... devices/block2mtd.c

第250行左右。

它先通过设备名去获得一个块设备的handler,这个块设备当时没有初始化的。
如果不行,再尝试通过设备号去获得一个块设备handler。
也就是我精简代码的情况。

论坛徽章:
0
发表于 2012-05-31 21:23 |显示全部楼层
回复 8# tempname2

多谢特意回复!!!
我明天上午过来在仔细看看!!


   

论坛徽章:
0
发表于 2012-06-02 09:51 |显示全部楼层
tempname2 说的是对的。
可惜一些开源的代码都没有注释。折腾了半天。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP