- 论坛徽章:
- 0
|
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
如果大家有空,帮我看看呀!!- #include <linux/config.h>
- #include <linux/module.h>
- #include <linux/moduleparam.h>
- #include <linux/init.h>
- #include <linux/kernel.h>
- #include <linux/fs.h>
- #include <linux/genhd.h>
- #include <linux/interrupt.h>
- #include <linux/smp_lock.h>
- #include <linux/completion.h>
- #include <linux/buffer_head.h>
- #include <linux/bio.h>
- #include <linux/errno.h>
- #include <linux/types.h>
- #include <linux/blkdev.h>
- #include <linux/hdreg.h>
- #include <linux/sched.h>
- #include <linux/slab.h>
- #include <linux/stat.h>
- #include <linux/timer.h>
- #include <linux/fcntl.h>
- #include <asm/uaccess.h>
- typedef struct _sba_dev {
- struct block_device *f_dev;
- unsigned long size;
- spinlock_t lock;
- struct gendisk *gd;
- int usage;
- }sba_dev;
- sba_dev sba_device;
- int __init sba_init(void)
- {
- dev_t f_dev_no;
- static int f_dev[] = {MKDEV(8, 35)};
-
- f_dev_no = f_dev[0];
- printk("----------------------------------------\n");
- printk("The device num is: %d\n", f_dev_no);
- printk("Before, Point is: %p\n", sba_device.f_dev);
- sba_device.f_dev = open_by_devnum(f_dev_no, FMODE_READ|FMODE_WRITE);
- printk(" After, Point is: %p\n", sba_device.f_dev);
- if (IS_ERR(sba_device.f_dev)) {
- goto out;
- }
- return 0;
- out:
- printk("Unable to load the device\n");
- return -ENOMEM;
- }
- static __exit void sba_cleanup(void)
- {
- printk("I am existing.....\n");
- }
- module_init(sba_init);
- module_exit(sba_cleanup);
- MODULE_LICENSE("GPL");
复制代码 |
最佳答案
查看完整内容
回复 7# almeydifer 好吧,特意换回Windows回这一帖。你通过那种接口得到的block device已经初始化好了。具体来说,它已经和某个gendisk对上了。MTD那段代码的意思是,先通过文件来获得block_device;但有可能存在驱动而由于文件系统没有准备好,这个设备文件根本不存在。所以下一步通过文件名来解析设备号,具体到块设备,则是去遍历所有已注册的块设备驱动,根据名字得到匹配项,从而得到device number。最后才通过device number ...
|