当前位置: 技术问答>linux和unix
请教下各路高手,linux是如何检测内核崩溃的
来源: 互联网 发布时间:2016-10-25
本文导语: 最近看到《kdump基于kexec的内核崩溃重启机制》。 先讲下我自己的理解:内核崩溃后,利用kexec把预先准备好的内核拷贝到保留的内存区,然后执行它;新内核启动后,kdump把崩溃的那个内核的信息保存到文件,以供...
最近看到《kdump基于kexec的内核崩溃重启机制》。
先讲下我自己的理解:内核崩溃后,利用kexec把预先准备好的内核拷贝到保留的内存区,然后执行它;新内核启动后,kdump把崩溃的那个内核的信息保存到文件,以供分析。
那么我认为,崩溃状态的检测不是kexec实现的,是linux内核实现的,那么我的问题就是:内核是怎么检测崩溃的,它如何判断“崩溃的状态”?
再说说我的想法:1、内核能够在崩溃时打印一些堆栈信息(此时还没完全死透吧,还能打印信息呢),在死透之前赶紧去启动新内核;2、等到系统完全死透了,检测NMI watchdog(但是系统都死了,检测watchdog的功能怎么去保证呢?)
请各位指点,多谢多谢
先讲下我自己的理解:内核崩溃后,利用kexec把预先准备好的内核拷贝到保留的内存区,然后执行它;新内核启动后,kdump把崩溃的那个内核的信息保存到文件,以供分析。
那么我认为,崩溃状态的检测不是kexec实现的,是linux内核实现的,那么我的问题就是:内核是怎么检测崩溃的,它如何判断“崩溃的状态”?
再说说我的想法:1、内核能够在崩溃时打印一些堆栈信息(此时还没完全死透吧,还能打印信息呢),在死透之前赶紧去启动新内核;2、等到系统完全死透了,检测NMI watchdog(但是系统都死了,检测watchdog的功能怎么去保证呢?)
请各位指点,多谢多谢
|
我觉得只要不是硬件故障 内核重启之前的一些操作都是通过内核函数来控制的
LZ可以看看panic函数
LZ可以看看panic函数
18 NORET_TYPE void panic(const char * fmt, ...)
19 {
20 static char buf[1024];
21 va_list args;
22
23 va_start(args, fmt);
24 vsprintf(buf, fmt, args);
25 va_end(args);
26 printk(KERN_EMERG "Kernel panic: %sn",buf);
27 if (current == task[0])
28 printk(KERN_EMERG "In swapper task - not syncingn");
29 else
30 sys_sync();
31 for(;;);
32 }
|
内核异常发生后,如果异常发生在内核态,没有预定的处理策略,就调用panic处理。
panic会回溯异常现场的函数调用信息到控制台,以便用户定位
panic会回溯异常现场的函数调用信息到控制台,以便用户定位