进程栈分配linux,Linux中,一个进程的栈空间到底有多大?

#include

#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,都需要占空间的

|

用getrlimit(RLIMIT_STACK, ...)获取。

|

一个进程的堆栈空间只有8K?

那是内核空间,不是用户空间,不是一个概念的。

而且内核堆栈也不是8K,而是和一个进程的task_struct公用8K空间,两个的增长方式不一样而已。

用户空间的栈的实现方式,你去看看exec的内核源代码吧,具体我记不太清楚了,现在没有时间搞这些东西.至于 wildhorseych() 说的自动扩展,那个没有问题,但是也得有一些限制阿.

|

各位高手,linux不是能够自动扩展用户模式堆栈吗?好像说如果不够的时候就产生一个缺页异常

然后自动扩展啊.好像内核模式栈以及进程描述符总共8k.请高手解释一下啊.

|

use "ulimit -s unlimited" to set your maximum stack size

|

2M

|

是2M么?好像是8M吧?

|

xuexi

|

mark