学习研究内核oops调试。
oops 其实就是个拟声词语,表示惊讶!即‘哎呦?真没想到,对不起,抱歉!’在操作系统上的表示为蓝屏(windows系统)或者kernel panic/kernel crash(非winwos系统)。
我今天在centos6.5和7.2下尝试模拟了kernel panic。首先我新建了一个指针乱指的c文件,接着建立了Makefile文件,再接着生成.ko模块文件,紧接着我使用了insmod 临时插入模块到内核中,执行完该动作之后操作系统马上瘫痪并打印出一堆信息:
而且现在使用终端没法连接操作系统,因为系统已经死机了,唯有重启系统让内核自动重新载入了,于是重启之后系统恢复正常了。但是问题原因在哪儿呢?
大致可以看出stack部分是打印出的堆栈信息,Call Trace部分是打印出的函数调用情况,Code 部分是错误具体位置,进一步查看Code信息发现了有一行... RIP [<ffffffffa009e01e>] oops_example_init+0x1e/0x1000 [oops]
其中的oops_example_init就是源代码里头的函数名,接下来分析该函数发现了一个错误:
static int __init oops_example_init(void)
{
int *p=0;
LKP("enter");
*p=0x1234;
return 0;
}
{
int *p=0;
LKP("enter");
*p=0x1234;
return 0;
}
我将4660,即0x1234赋值给0这个地址,这显然是个致命的错误。kernel panic产生的其中原因之一就是指针造成的错误,这里正好印证了。
总结:我这里用的是虚拟机,而且造成错误的代码是自己编写的,知道错误在哪,如果生产环境的话那就没有这么简单了,起码生产环境必须开启kdump转储内核panic后的信息至core文件才行。否则不利于故障调试分析。