Can';t在BUG()调用后卸载Linux内核模块
这里是我的基本内核模块代码Can';t在BUG()调用后卸载Linux内核模块,c,linux-kernel,operating-system,linux-device-driver,kernel-module,C,Linux Kernel,Operating System,Linux Device Driver,Kernel Module,这里是我的基本内核模块代码 #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) { p
#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);
#包括
#包括
模块许可证(“GPL”);
静态整型测试错误初始化(无效)
{
printk(内核信息“%s:In init\n”,函数);
BUG();
返回0;
}
静态无效测试错误退出(无效)
{
printk(内核信息“%s:在退出\n”中,函数);
}
模块初始化(测试错误初始化);
模块退出(测试错误退出);
当我加载此模块时,它已成功加载,但在卸载时,会收到类似“模块正在使用”的消息
那么,为什么我们不能在调用
BUG()
后卸载模块呢?是否有其他方法卸载模块?在内核源代码中,您可以看到BUG()
code最终调用宏:
因此,您的init函数test\u bug\u init()
正在使用中,因为其中包含无限循环-它无法返回。通过添加以下内容来验证这一点
//...
BUG();
printk(KERN_INFO "%s: After BUG()\n", __func__);
所以你不会在日志中看到这个打印
另请阅读:
是否有其他方法卸载模块
你不能卸载它,因为它“正在使用”,你不能让它不被使用(不能停止使用)。只需重新启动。在内核源代码中,您可以看到
BUG()
代码最终调用宏:
因此,您的init函数test\u bug\u init()
正在使用中,因为其中包含无限循环-它无法返回。通过添加以下内容来验证这一点
//...
BUG();
printk(KERN_INFO "%s: After BUG()\n", __func__);
所以你不会在日志中看到这个打印
另请阅读:
是否有其他方法卸载模块 你不能卸载它,因为它“正在使用”,你不能让它不被使用(不能停止使用)。只要重新启动