微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决可以在模块初始化完成之前删除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

来强制删除模块。 ,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。