您的位置:首页 > 其它

lsmod 显示是[permanent],无法remove的问题解决

2013-09-12 09:11 1581 查看
前段时间开发了一个基于usb接口的DVB设备的内核驱动,本来是在ubuntu10.04(内核版本2.6.32)平台上进行开发的,后来由于种种原因,将所有内核空间驱动和用户空间程序都搬到乐ubuntu12.04上面,12.04用的内核版本是3.5.0.37,按照新内核版本中各接口的新变化,把内核驱动移植完之后,modprobe成功,但当我在修改内核代码后,想rmmod以更新驱动时出现了 cannot
unload 'XXX': device or resource busy的错误提示,

于是lsmod检查内核驱动的状态,发现该驱动后面多了一个[permanent]的字样,按照以往的经验,这种情况可能是驱动没有exit函数导致的,但是驱动明明是有exit函数的,而且在ubunut10.04中模块能够正常加载卸载,排除这种可能性。

遍寻网络,从下面的网页中得到启发http://stackoverflow.com/questions/7482469/why-is-this-kernel-module-marked-at-permanent-on-2-6-39

I've been
hunting the issue because it was affecting a code that I'm taking care of. First I tried to build the module using kbuild and it worked. Then I shifted more and more stuff to the external build system, until I found that it is the compilation of the modpost
generated C file. Then I took C compiler options one by one.

原来是我在把我一个基于c++写的用户空间的app在ubuntu12.04上无法编译通过时,将ubuntu12.04的gcc版本改成了gcc-4.4,后来忘记改回去了,于是我的内核驱动也用gcc-4.4版本进行编译,编译出来的内核模块与内核不是很兼容,造成永久驻留内核的结果,后来将gcc链接重新指向gcc-4.6,编译--》重启--》安装驱动--》卸载驱动,问题解决。

顺便搜集了下别人在无法卸载模块的解决方法,以备以后遇到问题时查找。

http://mazhengdong.blog.163.com/blog/static/205529005201251801115387/

以下为引用文章全文:

开发板内核的不支持卸载,得重新做一个内核下载进去,看如何。device or resourse busy

lsmod 后面标记了 permament,网上说是没有找到退出函数,所以认为是永久的。

在国外网站找到了方法:http://ns3.spinics.net/lists/newbies/msg43106.html

就是在源文件中要宏定义 USE_IMMEDIATE

然后就可以卸载了。

否则,就算你的内核已经允许了 enable_unloading,照样不起作用。

这里不起作用是因为:permanent。就说是你只要加载了一个模块,那么,它就是“永久的”,没法卸载的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: