x86 linux内核栈溢出一则

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

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
http://lenky.info/tag/kernel-stack/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值