当前位置: 技术问答>linux和unix
Linux中,一个进程的栈空间到底有多大?
来源: 互联网 发布时间:2015-05-27
本文导语: #include #include int main(int argc,char **argv) { char buf[8*1024*1024]; sprintf(buf,"%sn",argv[1]); printf(buf); return 0; } 上面的程序运行时会出现Segmentation fault,原因很简单,栈内存分配得太多,我想知道...
#include
#include
int main(int argc,char **argv)
{
char buf[8*1024*1024];
sprintf(buf,"%sn",argv[1]);
printf(buf);
return 0;
}
上面的程序运行时会出现Segmentation fault,原因很简单,栈内存分配得太多,我想知道一个进程的栈空间到底有多大?
#include
int main(int argc,char **argv)
{
char buf[8*1024*1024];
sprintf(buf,"%sn",argv[1]);
printf(buf);
return 0;
}
上面的程序运行时会出现Segmentation fault,原因很简单,栈内存分配得太多,我想知道一个进程的栈空间到底有多大?
|
HostOOP(碧云黄花),你说的有问题阿。
知道为什么会出现SegmentationFault么?我用objdump得到以下代码
08048460 :
8048460: 55 push %ebp
8048461: 89 e5 mov %esp,%ebp
8048463: 81 ec c8 e0 7f 00 sub $0x7fe0c8,%esp
8048469: 83 ec 0c sub $0xc,%esp
804846c: 68 e8 84 04 08 push $0x80484e8
8048471: e8 c6 fe ff ff call 804833c
8048476: 83 c4 10 add $0x10,%esp
8048479: b8 00 00 00 00 mov $0x0,%eax
804847e: c9 leave
804847f: c3 ret
当出现Segmentation的时候,程序停留在804846c: 68 e8 84 04 08 push $0x80484e8这一行,也就是说无法PUSH,如果你这个时候看ESP,已经超出了0xbfffffff-8M的范围,所以才由你说的结果。但是如果你不用printf的话,ESP只是减小了,但是由于没有对相应的内存进行操作,就不会出现SegmentationFault。
另外一点就是,栈的大小不光有你的buf,还有各种环境变量以及argv,都需要占空间的
知道为什么会出现SegmentationFault么?我用objdump得到以下代码
08048460 :
8048460: 55 push %ebp
8048461: 89 e5 mov %esp,%ebp
8048463: 81 ec c8 e0 7f 00 sub $0x7fe0c8,%esp
8048469: 83 ec 0c sub $0xc,%esp
804846c: 68 e8 84 04 08 push $0x80484e8
8048471: e8 c6 fe ff ff call 804833c
8048476: 83 c4 10 add $0x10,%esp
8048479: b8 00 00 00 00 mov $0x0,%eax
804847e: c9 leave
804847f: c3 ret
当出现Segmentation的时候,程序停留在804846c: 68 e8 84 04 08 push $0x80484e8这一行,也就是说无法PUSH,如果你这个时候看ESP,已经超出了0xbfffffff-8M的范围,所以才由你说的结果。但是如果你不用printf的话,ESP只是减小了,但是由于没有对相应的内存进行操作,就不会出现SegmentationFault。
另外一点就是,栈的大小不光有你的buf,还有各种环境变量以及argv,都需要占空间的
|
用getrlimit(RLIMIT_STACK, ...)获取。
|
一个进程的堆栈空间只有8K?
那是内核空间,不是用户空间,不是一个概念的。
而且内核堆栈也不是8K,而是和一个进程的task_struct公用8K空间,两个的增长方式不一样而已。
用户空间的栈的实现方式,你去看看exec的内核源代码吧,具体我记不太清楚了,现在没有时间搞这些东西.至于 wildhorseych() 说的自动扩展,那个没有问题,但是也得有一些限制阿.
那是内核空间,不是用户空间,不是一个概念的。
而且内核堆栈也不是8K,而是和一个进程的task_struct公用8K空间,两个的增长方式不一样而已。
用户空间的栈的实现方式,你去看看exec的内核源代码吧,具体我记不太清楚了,现在没有时间搞这些东西.至于 wildhorseych() 说的自动扩展,那个没有问题,但是也得有一些限制阿.
|
各位高手,linux不是能够自动扩展用户模式堆栈吗?好像说如果不够的时候就产生一个缺页异常
然后自动扩展啊.好像内核模式栈以及进程描述符总共8k.请高手解释一下啊.
然后自动扩展啊.好像内核模式栈以及进程描述符总共8k.请高手解释一下啊.
|
use "ulimit -s unlimited" to set your maximum stack size
|
2M
|
是2M么?好像是8M吧?
|
xuexi
|
mark