无法删除可加载的内核模块

时间:2013-06-22 14:29:22

标签: c kernel-module insmod

我正在编写一个可加载的内核模块并尝试对其进行测试。插入之后我试图使用rmmod xxx命令删除它,但是我收到错误说module xxx is in use并且模块卡住了,我无法删除它。知道如何在不重启整个机器的情况下移除模块吗? (linux Kernel v.3.5.0)

注意:rmmod -f打印Error: device or resource busy

4 个答案:

答案 0 :(得分:10)

当我的驱动程序中存在导致模块中的代码以某种方式出现恐慌或崩溃的错误时,才会发生这种情况。根据我的经验,一旦发生这种情况,重启是唯一可行的方法

正如我所说的,内核通常会发生恐慌,所以你应该在插入或运行应用程序来运行它之后检查dmesg。我不确定,但如果驱动程序不释放互斥锁,则可能会发生此行为。

答案 1 :(得分:0)

检查你的module_exit功能是否合适。 您可能需要使用MODULE_FORCE_UNLOAD = yes编译内核以“删除模块而不重新启动整个机器”。

答案 2 :(得分:0)

我通过使用与已经编译运行中的内核来编译我的模块的GCC版本相同的GCC来修复相同的错误,两者均为8.3.1;请检查您的。

    [root@centos fishing]# dmesg | grep gcc
    [    0.000000] Linux version 4.18.0-80.7.2.el7.aarch64 (mockbuild@aarch64-01.bsys.centos.org) (gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC)) #1 SMP Thu Sep 12 16:13:20 UTC 2019
    [root@centos fishing]# gcc -v
    gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC)
    [root@centos fishing]#

否则,我有错误:

    [root@centos fishing]# rmmod fishing
    rmmod: ERROR: could not remove 'fishing': Device or resource busy
    rmmod: ERROR: could not remove module fishing: Device or resource busy
    [root@centos fishing]#

内核模块,钓鱼代码来自http://books.gigatux.nl/mirror/kerneldevelopment/0672327201/ch16lev2sec1.html

答案 3 :(得分:0)

一种可能是您忘记提供 module_exit,因此您的模块不知道如何退出。