Linux kernel 是否可以在不调用清理例程的情况下卸载内核模块?

Linux kernel 是否可以在不调用清理例程的情况下卸载内核模块?,linux-kernel,kernel-module,Linux Kernel,Kernel Module,通常,如果我使用rmmod删除内核模块,则运行module\u exit指定的函数。是否有某种方法可以在不调用此函数的情况下rmmod 如果您感到好奇,原因是我编写了一个退出方法有缺陷的模块,并且insmod,我不希望在导致内核挂起时手动重新启动远程机器 我已经查看了man rmmod,但它似乎没有这样的选项。在执行rmmod时,无法避免卸载模块,因为在卸载模块时需要一些清理活动,如果不这样做,通过执行insmod,您将无法再次重新加载模块,因为它将再次调用module\u init(),您将在

通常,如果我使用
rmmod
删除内核模块,则运行
module\u exit
指定的函数。是否有某种方法可以在不调用此函数的情况下
rmmod

如果您感到好奇,原因是我编写了一个退出方法有缺陷的模块,并且
insmod
,我不希望在导致内核挂起时手动重新启动远程机器


我已经查看了
man rmmod
,但它似乎没有这样的选项。

在执行
rmmod
时,无法避免卸载模块,因为在卸载模块时需要一些清理活动,如果不这样做,通过执行
insmod
,您将无法再次重新加载模块,因为它将再次调用
module\u init()
,您将在其中注册函数(
alloc\u chrdev\u region()
register\u chrdev()
)您的驱动程序。重新注册而不取消注册将导致加载模块失败。

我不确定这是否符合您的要求,但下次重新编译内核时,您可以启用模块强制卸载选项并尝试rmmod-f


嗯,我不确定如何使它在每次rmmmod时都不调用module_exit(),但您可以对该函数中的代码进行注释。说明:问题是在不调用
module_exit()
的情况下删除现有的编译模块,而不是修改模块,从而永远不会调用
module_exit()
。理论上,您可以使用一种hack:在内核内存中查找与您的模块对应的struct module,并将“init”和“exit”字段都设置为NULL。这可以通过另一个内核模块来完成
rmmod
不应导致调用清除函数。但我不推荐这种黑客方式:在init中分配的和初始化的内容将保留在那里,这可能会导致严重的问题@brokenfoot对这一点的解释是正确和明确的。更不用说内核可以在任何时候访问这些注册的资源。如果模块不再存在,则很可能发生崩溃。