阅读:1588回复:13
有关加载问题!
1.我的网卡驱动程序的目标文件以动态形式加载模块,用法如下:
#insmod ****.o回车 .......... ........ //以上是显示了我的驱动程序中探测函数中printk中内容 ****.o:init_module:Device or resourse busy Hint:insmod errors can be caused by incorrect module parameters,including invalid IO or IRQ parameters 之后我用命令 #lsmod 回车 并没有看到我的模块 我再次执行 #insmod ****.o 回车 这次不显示出以上任何信息,用lsmod能看到我的模块了,说明我的模块已经加载上去了! 但为什么总是要执行两次,才能加载上去呢?一次为什么不行,问题出现在什么地方? 2.再有如果我加载上去后,如果这期间我重新编译了模块,就先把加载的卸载 #rmmod ****.o 我再次执行 #insmod ****.o 则出现网卡连接不上的信息!为什么?我必须重新启机才行,这是为什么? 谁做过网卡驱动调试的或者哪位高手能回答此问题,在此先谢了! |
|
沙发#
发布于:2002-11-13 22:50
你的驱动有分配buffer吗?
|
|
板凳#
发布于:2002-11-14 09:17
这种情况是在init_module中返回了-EBUSY之类的非0负数之类的值就会出现。你检查一下。
|
|
|
地板#
发布于:2002-11-14 20:35
怎莫检查?为何第二次就可以了?
|
|
地下室#
发布于:2002-11-15 11:44
因为你的驱动程序里可能有io或irq冲突的地方。
你的irq是动态分配还是自己分配的? 能否把你init函数给我看看。 resourse busy说明硬件有冲突。 你第一次insmod时加-s看看。 |
|
5楼#
发布于:2002-11-15 11:45
怎莫检查?为何第二次就可以了? 看看是否有if(opened) {return -ebusy} 这样的语句阿。 |
|
6楼#
发布于:2002-11-15 23:31
你说的这个语句在什么函数里出现的呢?
我的程序是这样的: static struct pci_driver ***_pci_driver = { name: ***, id_table: ***_pci_tbl, probe: ***_probe, ........ } static int __init ***_init_module (void) { printk(\"......\\n\"); return pci_register_driver(&***_pci_driver); } module_init(***_init_module); 我的irq是动态分配的,是用这个函数: request_irq() 加载后显示出的信息irq 的值是与刚启机时电脑显示出的irq是同一个值。 |
|
7楼#
发布于:2002-11-18 16:36
为了确定是不是irq的问题,你把动态分配irq的语句去掉。
我说的应该在open函数里。 |
|
8楼#
发布于:2002-11-18 16:37
你的irq不是动态分配的。是静态分配的。
是否申请内存空间或io口资源等等。 |
|
9楼#
发布于:2002-11-18 23:37
我程序中申请irq号是在open函数中的,而刚加载时,还没执行到open函数,因此,我想不是irq的问题,我在初始化函数里分配了i/o与内存空间,这个会造成冲突吗?导致上述的错误?设备或资源忙?
|
|
10楼#
发布于:2002-11-19 08:40
我程序中申请irq号是在open函数中的,而刚加载时,还没执行到open函数,因此,我想不是irq的问题,我在初始化函数里分配了i/o与内存空间,这个会造成冲突吗?导致上述的错误?设备或资源忙? 为什么要在open函数里request呢? 都是在init理申请的。 |
|
11楼#
发布于:2002-11-20 00:14
这种方法是在驱动程序书中建议的,我想知道如果是i/o的问题,我如何做,才能确定这个结果呢?
|
|
12楼#
发布于:2002-11-20 11:35
cat /proc/ioport
看看是否有冲突。 |
|
13楼#
发布于:2002-11-20 23:11
这个问题已经解决了,我用pci_module_init替换了原来的pci_register_dev,不知道为什么用后者就会出现错误,用前者就没有,我看了一下这两个函数,只不过在pci_module_init中最后有一个函数pci_unregister_dev,我很想知道为什么?两者有什么区别?
|
|