c - 可以在模块初始化完成之前删除 linux 内核模块吗?
问题描述
假设我的内核模块具有下面的 init 和 exit 函数:
module_init(init_module);
module_exit(cleanup_module);
cleanup_module()
内核模块是否可以在模块 init 完成/init_module()
正在执行之前被删除,从而调用?
解决方案
在 module.cdo_init_module
中做了一个module_put
AFTER call init_module
,所以我假设它在某个地方引用了该模块。https://elixir.bootlin.com/linux/v5.9-rc7/source/kernel/module.c#L3658
delete_module
try_stop_module
在调用之前检查 refcount free_module
。 https://elixir.bootlin.com/linux/v5.9-rc7/source/kernel/module.c#L1025 module_mutex
防止同时更改所涉及的结构。
看起来 root 肯定可以在 init 运行时调用 rmmod。如果它发生在 put 之前,它将失败。如果它发生在 put 之后,它将成功。无论哪种方式,内核中都不会发生错误操作(除非使用强制操作,正如 Vijay 指出的那样)。
推荐阅读
- r - 如何使用forcats重新编码多个值而不在R中重复
- python - 如何修复数字海洋 django 应用程序上的“413 请求实体太大”
- python - 你如何在线程中创建一个可共享的对象?
- python - 我们如何解码表情符号,python中的特殊字符?
- firebase - 我们是否会为失败的 Firestore 交易收费
- c++ - 如何在c ++中直接将二进制数据写入文件
- google-data-studio - 有多少用户可以同时查看公共 datastudio 报告?
- javascript - VueJS + jQuery:在 Vue.js 中动态创建组件
- c++ - gcc 10 在 co_await 表达式完成之前销毁传递给返回等待器类型的函数的临时参数
- reactjs - React 元素中的 onMouseOver 选择所有元素而不仅仅是单个元素