Linux内核的Oops:
linux中当比较致命的问题出现时,Linux内核在发生kernel panic时会打印出Oops信息,把目前的寄存器状态、堆栈内容、以及完整的Call trace都show给我们看,这样就可以帮助我们定位错误。说白了就是内核在哪里出错了
例子
#include <linux/kernel.h>
#include <linux/module.h>
static int __init hello_init(void)
{
printk("hello_init\n");
#include <linux/module.h>
static int __init hello_init(void)
{
printk("hello_init\n");
int *p = 0;
*p = 1; // 这个地方会出错
return 0;
}
static void __exit hello_exit(void)
{
printk("hello exit\n");
}
module_init(hello_init);
*p = 1; // 这个地方会出错
return 0;
}
static void __exit hello_exit(void)
{
printk("hello exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_LICENSE("GPL");
这个例子错误的地方已经标出。这句代码的作用是把数值1存入0这个地址,这个操作当然是非法的。这个段代码编译的时候不会有问题,然后当你去加载模块的时候,问题就来了类似这样的:
也有可能是这样的:
但是第一种情况的时候:
卸载都是卸载不掉的:
也就是卸载的时候卸载不掉。
所以,这个例子唯一的作用就是造一个空指针引用错误。然后引发了oops错误的例子