无法卸载可加载内核模块

12
我正在编写一个可加载内核模块并尝试测试它。插入后,我尝试使用rmmod xxx命令将其删除,但我收到一个错误,显示module xxx is in use,模块被卡住了,我无法将其删除。有什么办法可以在不重新启动整个机器的情况下删除模块吗?(Linux Kernel版本为3.5.0) 注意:rmmod -f会输出Error: device or resource busy

rmmod -f 不起作用,它会打印出 ERROR: device or resource busy - Varda Elentári
2
那么重新启动吧。(考虑在虚拟机中玩弄内核,而不是在主机上操作。这样重新启动就不是问题了。) - Mat
2
如果您打印出dmesg并能够提供代码片段,我们可能能够提供进一步的帮助。 - Benjamin Leinweber
4个回答

17

当我的驱动程序出现bug导致模块中的代码发生崩溃时,这种情况只会发生在我身上。在我的经验中,一旦出现这种情况,重新启动是唯一可能的方法。

正如我所说,内核通常会发生panic,因此在插入它或运行应用程序以执行它后,应检查dmesg。但我不能确定,如果驱动程序没有释放互斥锁,也可能会发生这种行为。


1
也许你忘记提供module_exit,因此你的模块不知道如何退出。

0
请检查您的module_exit函数是否正确。您可能需要编译内核,使其具有"在不重新启动整个机器的情况下删除模块"的能力,该能力需将MODULE_FORCE_UNLOAD设置为yes。

我已经使用这个标志编译了我的内核,但仍然出现“设备或资源忙”的错误。这是因为我的驱动程序崩溃了。所以我观察到的是,如果驱动程序中有错误,那么无论是否设置了FORCE_UNLOAD,都将无法卸载驱动程序。 - Naveen

0

我通过使用与编译运行内核相同的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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接