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 才能调用模块退出处理程序。
假设我的内核模块具有下面的初始化和退出函数:
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 才能调用模块退出处理程序。