如何在Linux内核代码中生成内核oops或panic崩溃?

6
我该如何在内核代码中生成kernel oops或崩溃?是否有相应的函数可以实现?
2个回答

9
通常导致内核崩溃的方法是使用BUG()宏。还有一个WARN()宏,会将堆栈转储到控制台,但内核仍然继续运行。

http://kernelnewbies.org/FAQ/BUG

当内核触发BUG()宏(最终导致内部陷阱)或类似错误条件(如空指针解引用)时,接下来会发生什么取决于panic_on_oops全局变量的设置。如果设置为0,则内核将尝试继续运行(带有任何可怕的后果)。如果设置为1,则内核将进入紧急状态并停止。
如果您想从用户空间崩溃内核,可以使用方便的<SysRq> + <c>组合键(或者,替代方法是 echo c > /proc/sysrq-trigger)。值得查看此操作的处理程序实现(http://code.metager.de/source/xref/linux/stable/drivers/tty/sysrq.c#134):
static void sysrq_handle_crash(int key)
{
    char *killer = NULL;

    panic_on_oops = 1;  /* force panic */
    wmb();
    *killer = 1;
}

处理程序会将全局标志设置为在陷阱时使内核恐慌,然后尝试引用一个随机的空指针。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接