Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t在BUG()调用后卸载Linux内核模块_C_Linux Kernel_Operating System_Linux Device Driver_Kernel Module - Fatal编程技术网

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__);
所以你不会在日志中看到这个打印

另请阅读:


是否有其他方法卸载模块

你不能卸载它,因为它“正在使用”,你不能让它不被使用(不能停止使用)。只要重新启动