首页 > 解决方案 > 可以在模块初始化完成之前删除 linux 内核模块吗?

问题描述

假设我的内核模块具有下面的 init 和 exit 函数:

module_init(init_module);
module_exit(cleanup_module);

cleanup_module()内核模块是否可以在模块 init 完成/init_module()正在执行之前被删除,从而调用?

标签: clinux-kernellinux-device-driverkernel-module

解决方案


在 module.cdo_init_module中做了一个module_putAFTER call init_module,所以我假设它在某个地方引用了该模块。https://elixir.bootlin.com/linux/v5.9-rc7/source/kernel/module.c#L3658

delete_moduletry_stop_module在调用之前检查 refcount free_modulehttps://elixir.bootlin.com/linux/v5.9-rc7/source/kernel/module.c#L1025 module_mutex防止同时更改所涉及的结构。

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


推荐阅读