当前位置: 技术问答>linux和unix
linux内核模块编程的遇到两个怪事关于oops(100分求助)
来源: 互联网 发布时间:2017-04-02
本文导语: 一个小例子,就是访问空指针,让内核oops,结果发现了一些怪事。 #include #include MODULE_LICENSE("GPL"); MODULE_AUTHOR("kangear"); MODULE_DESCRIPTION("Memory alloc test Modeule"); MODULE_ALIAS("proc module"); static int func_A(void); static int ...
一个小例子,就是访问空指针,让内核oops,结果发现了一些怪事。
在oops时回溯那居然到module_init()就没有,我要看的func_a, func_b, func_c, func_d没有出现:
一点点的试验,结果是static的原因,还有一个如:return func_D();这样的调用要改成普通的func_D();return 0;才可以正常,这算oops的原因,还有我的C语言没学好的原因呢?我很纠结,这叫什么事吗?static不就是一个静态函数吗?return func_D()算是回调函数吗?为什么会出现这种问题呢?它们也运行了,但是回溯里边就没有。。。。
#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("kangear");
MODULE_DESCRIPTION("Memory alloc test Modeule");
MODULE_ALIAS("proc module");
static int func_A(void);
static int func_B(void);
static int func_C(void);
static int func_D(void);
static int func_D(void)
{
int a = 5;
int *p = NULL;
printk("func_dn");
printk("xu......n");
*p = a + 5;
printk("ok......");
return 0;
}
static int func_C(void)
{
printk("func_cn");
return func_D();
}
static int func_B(void)
{
printk("func_bn");
return func_C();
}
static int func_A(void)
{
printk("func_an");
return func_B();
}
int __init oops_init(void)
{
func_A();
return 0;
}
void __exit oops_exit(void)
{
printk(" Exit.n");
}
module_init(oops_init);
module_exit(oops_exit);
在oops时回溯那居然到module_init()就没有,我要看的func_a, func_b, func_c, func_d没有出现:
一点点的试验,结果是static的原因,还有一个如:return func_D();这样的调用要改成普通的func_D();return 0;才可以正常,这算oops的原因,还有我的C语言没学好的原因呢?我很纠结,这叫什么事吗?static不就是一个静态函数吗?return func_D()算是回调函数吗?为什么会出现这种问题呢?它们也运行了,但是回溯里边就没有。。。。
|
应该是第21行的问题,你把21删了看看行不行
|
*p = a + 5;改为
p = a + 5;试下,
p = a + 5;试下,
|
貌似被优化掉了么?
|
你先把21行注释试试会会不打印出来,我觉得应该能打印出来。
printk函数是把你格式化的字符串放到一个BUF中的,通过串口或再发去来,如果你加上21行这句,这时内核程序死了,这些字符串很可能就不能输出了
|
另编译器优化时,
return fn();
是比
fn();
return 0;
节省时间。
return fn();
是比
fn();
return 0;
节省时间。