停止卸载 Linux 内核模块

Stop unloading the Linux kernel module

我有一个Linux基于平台驱动程序的内核模块。
我在那里实现了 probe()remove() 方法。

struct platform_driver {
    int (*probe)(struct platform_device *);
    int (*remove)(struct platform_device *);
}

现在当用户执行 rmmod <myModule> then remove() 方法正在被调用。在这里我执行了一些条件检查并了解到用户不应该在这里执行 rmmod 。在这里我不想执行任何清理并使此 rmmod 失败。

我已经尝试在 remove() 中返回 -1-EBUSY 但在 rmmod <myModule> 之后它仍然被卸载并且没有显示在 lsmod 的输出中.

有什么方法可以停止在 remove() 方法中卸载我的模块?

无法取消(或停止)模块卸载,已由rmmod(或通过其他方式)启动。但是可以通过调用 try_module_get 阻止 模块卸载:

// Before your module enters into the state, when its unloading is not desirable.

// Prevent unloading of the module
if(!try_module_get(THIS_MODULE)) {
  <failed to prevent module unloading>
}

<....> // This code will be protected from the module's unloading

// Allow the module to be unloaded again
module_put(THIS_MODULE);

虽然(成功)调用 try_module_get 生效,但 rmmod 立即拒绝模块卸载而不执行任何模块代码。

我不确定从module_init函数中调用try_module_get是否会成功,从module_exit函数中调用它肯定会失败。但在所有其他地方,此调用应该会成功。

至于 module_put 调用,不需要从调用 try_module_get 的同一函数中执行它。您可以根本不调用 module_put,但应尽可能避免这种情况。