admin管理员组文章数量:1642351
前段时间开发了一个基于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/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/blog/static/205529005201251801115387/
以下为引用文章全文:
开发板内核的不支持卸载,得重新做一个内核下载进去,看如何。device or resourse busy
lsmod 后面标记了 permament,网上说是没有找到退出函数,所以认为是永久的。
在国外网站找到了方法:http://ns3.spinics/lists/newbies/msg43106.html
就是在源文件中要宏定义 USE_IMMEDIATE
然后就可以卸载了。
否则,就算你的内核已经允许了 enable_unloading,照样不起作用。
这里不起作用是因为:permanent。就说是你只要加载了一个模块,那么,它就是“永久的”,没法卸载的。
版权声明:本文标题:lsmod 显示是[permanent],无法remove的问题解决 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1729334560a1196810.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论