Chinaunix首页 | 论坛 | 博客
  • 博客访问: 314433
  • 博文数量: 45
  • 博客积分: 2079
  • 博客等级: 上尉
  • 技术积分: 464
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-03 16:57
文章分类

全部博文(45)

文章存档

2015年(1)

2013年(1)

2012年(9)

2011年(2)

2010年(32)

分类: LINUX

2012-03-08 15:03:38

这是前一段时间遇到的一个问题,先看这段代码:

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


阅读(1557) | 评论(2) | 转发(1) |
给主人留下些什么吧!~~

zboom2012-03-09 19:34:30

GFree_Wind: 正常。其实就是在应用层,也不该在栈上申请这么大的临时变量.....
恩,那倒是,写的时候只考虑用着方便,能提高效率了。

GFree_Wind2012-03-09 12:40:14

正常。其实就是在应用层,也不该在栈上申请这么大的临时变量