这是前一段时间遇到的一个问题,先看这段代码:
struct result{
unsigned int a;
unsigned int b;
unsigned int c;
};
int func()
{
struct result temp[512];
memset(temp,0,sizeof(struct result)*512);
/*use temp do something...*/
return 0;
}
这段代码在跑在mips平台的内核运行良好,但是到x86平台上,直接挂了,没有任何堆栈打印……
经高人指点,偶可能是遇到了传说中的栈溢出,做一个简单验证,将temp数组定义放到func前面,程序又恢复了正常。
于是乎采用kmalloc代替数组,问题解决。
分析一下内核栈大小,便可知道原因:
include/asm-i386/thread_info.h THREAD_SIZE
#ifdef CONFIG_4KSTACKS
#define THREAD_SIZE (4096)
#else
#define THREAD_SIZE (8192)
#endif
内核配置的时候,有一个4K内核栈的选项,如果选上了,内核栈为4K;如果没有选上,内核栈是8K。
上面的代码的内核堆栈大小是4K,却申请了6K的结构,然后memset了一下,结果可想而知,
栈被写坏了。
参考:
http://blog.chinaunix.net/space.php?uid=20357359&do=blog&id=1963624
http://hi.baidu.com/whs08/blog/item/84437202d89a35074bfb5196.html
阅读(705) | 评论(0) | 转发(0) |