linux 内核模块可以在模块初始化完成之前删除吗?

Can linux kernel module be removed before module init has completed?

假设我的内核模块具有下面的初始化和退出函数:

module_init(init_module);
module_exit(cleanup_module);

在模块initcompleted/whileinit_module()被执行之前,是否可以删除内核模块,从而调用cleanup_module()

In module.c do_init_module 在调用 init_module 后执行 module_put,所以我假设它在某处引用了模块。 https://elixir.bootlin.com/linux/v5.9-rc7/source/kernel/module.c#L3658

delete_module 在调用 free_module 之前检查 try_stop_module 中的引用计数。 https://elixir.bootlin.com/linux/v5.9-rc7/source/kernel/module.c#L1025 module_mutex 防止同时更改所涉及的结构。

看起来 root 肯定可以调用 rmmod 而 init 是 运行。如果它发生在 put 之前,它将失败。如果它发生在 put 之后,它就会成功。无论哪种方式,内核中都不会发生不正确的操作(除非使用强制操作,正如 Vijay 指出的那样)。

我相信如果在构建内核时设置了选项 CONFIG_MODULE_FORCE_UNLOAD 那么可以使用 rmmod -f modprobe

强制删除模块

如果模块初始化处理程序 return 出现错误,则不会调用模块退出处理程序。这意味着模块初始化处理程序必须 return 才能调用模块退出处理程序。