如何停止init_module:linux内核

时间:2014-05-26 11:45:26

标签: linux kernel kernel-module

我有一个如下的程序。

test_module.c

#include <linux/version.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>

int init_module(void)
{
        while(1) {
                pr_info("hello 4 sec\n");
                msleep(4 * 1000);
        }
        return 0;
}

void cleanup_module(void)
{
        pr_info("module removed successful\n");
}

当我加载此模块时,我的终端会冻结/阻止。如何阻止这个程序。我试过了sudo rmmod test_module,但没有用。所以我重启了我的系统。如何打破init_module?将来,如果出现问题,如果我的init_module没有结束,该怎么办?如果我们不停止init_module会怎样?

1 个答案:

答案 0 :(得分:5)

重启机器。

这是唯一的方法。用户域进程是孤立的,可以强制终止所有这些,但在内核中没有这样的保护。

init_module函数不应该在延长的时间内执行任何操作。它应该只将模块注册到适当的数据结构。

如果您需要在内核中定期执行某些操作,则需要安排tasklet or worqueue或创建kernel thread。另见When to use kernel threads vs workqueues in the linux kernel。但是大多数内核代码应该只是在某个地方注册并在适当的事件(从硬件或通过系统调用从用户域)发生时运行。