BUG() 调用后无法卸载 Linux 内核模块
Can't unload the Linux kernel module after BUG() call
这是我的基本内核模块代码。
#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);
当我加载此模块时,它已成功加载,但在卸载时收到类似 "Module in use" 的消息。
那么,为什么我们无法在 BUG()
调用后卸载模块?还有其他卸载模块的方法吗?
在内核源代码中,您可以看到 BUG()
代码最终调用 unreachable()
宏:
# define unreachable() do { } while (1)
因此,您的初始化函数 test_bug_init()
正在使用,因为其中存在无限循环 - 它不能 return。通过添加类似
的内容来验证这一点
//...
BUG();
printk(KERN_INFO "%s: After BUG()\n", __func__);
因此您不会在日志中看到此打印。
另请阅读:BUG() FAQ
Is there another way to unload the module?
你不能卸载它,因为它是'in use'而且你不能以某种方式让它不被使用(不能停止使用它)。重启就好了。
这是我的基本内核模块代码。
#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);
当我加载此模块时,它已成功加载,但在卸载时收到类似 "Module in use" 的消息。
那么,为什么我们无法在 BUG()
调用后卸载模块?还有其他卸载模块的方法吗?
在内核源代码中,您可以看到 BUG()
代码最终调用 unreachable()
宏:
# define unreachable() do { } while (1)
因此,您的初始化函数 test_bug_init()
正在使用,因为其中存在无限循环 - 它不能 return。通过添加类似
//...
BUG();
printk(KERN_INFO "%s: After BUG()\n", __func__);
因此您不会在日志中看到此打印。
另请阅读:BUG() FAQ
Is there another way to unload the module?
你不能卸载它,因为它是'in use'而且你不能以某种方式让它不被使用(不能停止使用它)。重启就好了。