c - BUG() 调用后无法卸载 Linux 内核模块
问题描述
这是我的基本内核模块代码。
#include <linux/kernel.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
static int test_bug_init(void)
{
printk(KERN_INFO"%s: In init\n", __func__);
BUG();
return 0;
}
static void test_bug_exit(void)
{
printk(KERN_INFO"%s: In exit\n", __func__);
}
module_init(test_bug_init);
module_exit(test_bug_exit);
当我加载此模块时,它已成功加载,但是在卸载时会收到类似“模块正在使用”的消息。
那么,为什么我们不能在BUG()
调用后卸载模块呢?还有其他卸载模块的方法吗?
解决方案
在内核源代码中,您可以看到BUG()
代码最终会调用unreachable()
宏:
# define unreachable() do { } while (1)
因此,由于其中的无限循环,您的 init 函数test_bug_init()
正在使用中 - 它无法返回。通过添加类似的东西来验证这一点
//...
BUG();
printk(KERN_INFO "%s: After BUG()\n", __func__);
所以你不会在日志中看到这个打印。
另请阅读:BUG() 常见问题解答
还有其他卸载模块的方法吗?
您无法卸载它,因为它正在“使用中”并且您无法以某种方式使其不使用(无法停止使用它)。只需重新启动。
推荐阅读
- arrays - C:减去数组
- hibernate - 在 Hibernete 多租户环境中,persist() 后无法获取实体 ID
- python - Pandas:将一行字符串分成 4 列;问题:列由逗号、制表符和空格分隔
- ios - Flutter iOS:无法检测到连接的iOS模拟器
- java - 尝试使用 OncePerRequestFilter 时出现 java.lang.NoSuchMethodException
- verilog - 我的 verilog 代码出现此错误,“Illegal operation for constant expression”
- javascript - 如何更改javascript数组中随机值的值?
- python - 使用 Playwright for Python,如何选择(或查找)元素?
- kotlin - Kotlin Hashmap:更改键值和子元素值
- mysql - SQL:选择第二个表中没有相应用户ID的行