Linux kernel 如何删除失败的内核模块

Linux kernel 如何删除失败的内核模块,linux-kernel,Linux Kernel,这种情况总是困扰着我: 我写了一个内核模块,有时它有一个bug(取消对空指针的引用)。在I insmod hello.ko之后,它显示了一些内核错误。 然后我更改代码,并尝试删除该模块,然后再次安装。 问题是:我不知道如何删除内核模块 $rmmod你好 错误:模块hello正在使用中 $rmmod-f你好 错误:删除hello:设备或资源正忙 我总是重新启动机器以删除模块,这需要很长时间。有人有更好的解决方案吗?谢谢你的意见 使用虚拟机 一旦你犯了一个空的取消引用或者其他类似的错误,你就把内核置

这种情况总是困扰着我:

我写了一个内核模块,有时它有一个bug(取消对空指针的引用)。在I insmod hello.ko之后,它显示了一些内核错误。 然后我更改代码,并尝试删除该模块,然后再次安装。 问题是:我不知道如何删除内核模块

$rmmod你好

错误:模块hello正在使用中

$rmmod-f你好

错误:删除hello:设备或资源正忙

我总是重新启动机器以删除模块,这需要很长时间。有人有更好的解决方案吗?谢谢你的意见

使用虚拟机

一旦你犯了一个空的取消引用或者其他类似的错误,你就把内核置于了一个未知的状态。即使您确实成功地删除了模块(这是不可能的;内核OOPS会杀死调用线程,因此它永远不会有机会减少引用计数-模块永远不会被删除),仍然可能会留下损坏,您的新“修复”模块也很可能会遇到麻烦


使用快速重启虚拟机要好得多——可能是使用快照,以加快恢复速度。

正如bdonlan所指出的,使用虚拟机会更好

但是,如果你真的想按自己的方式做,你必须:

  • 检查内核配置是否启用了配置模块强制卸载
  • 编写另一个模块,将断开模块的refcount设置为零。在
    内核/module.c

  • 对于我的案例,Used by列(请参见
    lsmod
    )下的引用计数或值为-1。此值也可以在
    /sys/module//refcnt
    中找到

    以下是我在这里找到的对我有用的答案:

    echo-e“黑名单内核\u模块”| sudo tee-a/etc/modprobe.d/blacklist.conf

    然后你必须重新启动你的机器。重新编译一个干净稳定的模块版本。然后输入以下命令重新加载并覆盖故障模块

    insmod kernel\u module.ko

    最后

    rmmod内核模块