首页 > 解决方案 > 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()调用后卸载模块呢?还有其他卸载模块的方法吗?

标签: clinux-kerneloperating-systemlinux-device-driverkernel-module

解决方案


在内核源代码中,您可以看到BUG()代码最终会调用unreachable()宏:

# define unreachable() do { } while (1)

因此,由于其中的无限循环,您的 init 函数test_bug_init()正在使用中 - 它无法返回。通过添加类似的东西来验证这一点

//...
BUG();
printk(KERN_INFO "%s: After BUG()\n", __func__);

所以你不会在日志中看到这个打印。

另请阅读:BUG() 常见问题解答


还有其他卸载模块的方法吗?

您无法卸载它,因为它正在“使用中”并且您无法以某种方式使其不使用(无法停止使用它)。只需重新启动。


推荐阅读