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

问题描述

让我们说我的内核模块具有以下初始化和退出功能

module_init(init_module);
module_exit(cleanup_module);

可以在模块初始化完成之前/正在执行cleanup_module()删除内核模块,从而调用init_module()吗?

解决方法

在module.c中,do_init_module在调用module_put之后执行init_module,因此我假设它在某处具有对该模块的引用。 https://elixir.bootlin.com/linux/v5.9-rc7/source/kernel/module.c#L3658

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

看起来init运行时root肯定可以调用rmmod。如果在认沽前发生,它将失败。如果在看跌期权之后发生,它将成功。无论哪种方式,内核都不会发生错误的操作(除非使用强制操作,如Vijay所指出的那样)。

,

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

来强制删除模块。 ,

如果模块初始化处理程序返回错误,则不会调用模块出口处理程序。这意味着必须先返回模块初始化处理程序,然后才能调用模块退出处理程序。