前面说到,内核文件系统有一个节点/proc/sys/kernel/panic_on_oops,可以控制在oops执行结束前,要不要执行panic. 代码中的逻辑如下: 当检测到设置了panic_on_oops时,执行panic 打开/proc/sys/kernel/panic_on_oops测试,触发越界访问的oops导致的panic.PC直接挂死,电脑无反应。 CONFIG_PANIC_ON_OOPS_VALUE is the...
crash是和kdump工具配套使用,用于解析kdump生成的vmcore文件。大家都知道Windows操作系统有时候会蓝屏,而Linux系统也会出现挂掉的情况,叫panic。在Linux下面可以通过配置一个叫kdump的工具,在系统出现panic的时候捕获系统的关键信息,其实就是将内存中的核心数据转储到硬盘上,叫做vmcore。 vmcore是内核的映像(实际上是整个内...
这里需要注意的是 notify_die() 会通知所有的Oops 感兴趣的模块,模块会通过函数 register_die_notifier() 将callback 注册到全局结构体变量 die_chain 中(多个模块注册进来形成一个链表),然后在通过 notify_die() 函数去解析这个 die_chain,并分别调用callback: panic_print 默认值为 0,可以通过 /proc/sys/ker...
panic_print_sys_info(); (9) if (!panic_blink) panic_blink = no_blink; if (panic_timeout > 0) { pr_emerg("Rebooting in %d seconds..\n", panic_timeout); for (i = 0; i < panic_timeout * 1000; i += PANIC_TIMER_STEP) { touch_nmi_watchdog(); if (i >= i_next) { i...
panic("trying to free free page"); } 当进程退出do_exit时,不仅要free_page,进程自己的页表、页目录项也要free,操作的代码如下:找到页目录的基址,然后挨个遍历;遍历时找到页表项,进而找到使用的物理内存,挨个释放! /** This function frees a continuos block of page tables, as needed ...
无论先替换nop还是先替换ret,均会破坏栈帧,造成返回地址错误从而panic: 除非同时原子替换二者(这在crash工具中几乎不可能)。更安全的替换方案是在crash外部去替换,比如写一个内核模块。先将crash查询到的地址记录下来: 随后编写模块,修改两个地址的值:
.../* only print hardlockups once */if(__this_cpu_read(hard_watchdog_warn) ==true)return;//show对应信息或者dump堆栈信息.if(regs) show_regs(regs);elsedump_stack(); ...if(hardlockup_panic) nmi_panic(regs,"Hard LOCKUP");//触发对应kernel panic... ...
kernel.panic = 20 #panic error中自动重启,等待timeout为20秒 kernel.sysrq=1 #激活Magic SysRq 否则,键盘鼠标没有响应 按住[ALT]+[SysRq]+[COMMAND], 这里SysRq是Print SCR键,而COMMAND按以下来解释! b– 立即重启 e– 发送SIGTERM给init之外的系统进程 ...
So that we can also runtime chose to print out the needed system info for panic, other than setting the kernel cmdline. Link: http://lkml.kernel.org/r/1543398842-19295-3-git-send-email-feng.tang@intel.com Signed-off-by: Feng Tang <feng.tang@intel.com> Suggested-by: Steven Rostedt <...
panic("BUG!");/*引发更严重的错误,不但打印错误消息,而且整个系统业会挂起*/}while(0)#endif#ifndef HAVE_ARCH_BUG_ON#defineBUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0)#endif当调用这两个宏的时候,它们会引发OOPS,导致栈的回溯和错误消息的打印。