现在的位置: 首页 > 综合 > 正文

linux驱动模块加载出错insmod: error inserting ‘./usb_driver.ko’: -1 Unknown symbol in module

2013年01月15日 ⁄ 综合 ⁄ 共 1724字 ⁄ 字号 评论关闭

        今天开始调试usb驱动,第一步加载模块部分就开始报错。网上检索,有位朋友总结一些类似情况。本人遇到的恰好是第二种情况,以前不太注意,没出错也就不追究,这次遇到了就一并把一些情况在此记上一笔。转载如下:

insmod: error inserting 'cmos_driver.ko' : -1 File exists 和 insmod: error inserting './cmos_driver.ko': -1 Unknown symbol in module
        最近在入手学习linux下驱动程序设计,自己以前也看过一些,但是从来没有自己亲自动手编写过,都只是看下别人写的代码,然后能看懂就觉得可以了,并没有去安装linux环境去亲自去编译模块,并插入到内核中。这几天,因为项目原因安装了Ubuntu10.04、12.04、CentOS6.3,觉得是时候动手来实践下了,可是一动手才发现真的不是那么回事!现将具体情况记录下,以备不时之需。
1、insmod: error inserting './cmos_driver.ko' : -1 File exists
        这个问题一般情况下是因为要么你未卸载./cmos_driver.ko对应的模块,要么你是忘了在module_exit所对应的的函数里面忘了退出(此为笔者所遇见的问题),汗!,纠结了许久!解决方法很简单,在module_exit所对应的的函数里面增加一句,return即可!
2、insmod: error inserting './cmos_driver.ko': -1 Unknown symbol in module
        此问题是需要添加MODULE_LICENSE(“GPL”),因为很多函数都是在GPL的许可下才可以运行的,故一般情况下都需要加上。此时可以使用dmesg -c来查看具体是什么符号的错误,以笔者的文件为例:
[ 4357.335618] cmos_driver: Unknown symbol __class_create
[ 4357.335680] cmos_driver: Unknown symbol class_destroy
[ 4357.335767] cmos_driver: Unknown symbol device_create
[ 4357.335858] cmos_driver: Unknown symbol device_destroy
此时,如上所述,在源文件中增加如上语句即可。

3、关于刚开始的时候出现I/O port is busy 的错误
        此问题原因是这个驱动程序所使用的I/O端口已经被rtc使用了,故必须对源程序做一些修改,可以先查看自己的I/O端口使用情况,方法:cat /proc/ioports,以笔者的I/O端口为例,使用情况如下所示:

0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-0060 : keyboard
0064-0064 : keyboard
0x70-0x71: rtc
0080-008f : dma page reg
00a0-00a1 : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : 0000:00:07.1
  0170-0177 : ata_piix
01f0-01f7 : 0000:00:07.1
  01f0-01f7 : ata_piix
02f8-02ff : serial
        注意红色部分,而我们申请的端口就包含0x70和0x71,故会出现错误,这个问题可以通过使用函数check_region(start,count)来检查是否被使用,如果正在使用,可以释放掉,然后重新申请即可。具体实现如下:
status = check_region(0x70,4);
if(status == 0)
{
printk("The port are available in that range .\n");

}
else if(status == -EBUSY)
{
printk("The port are busy,and we are ready to free them!\n");
release_region(0x70,2);
}

 

抱歉!评论已关闭.