龙空技术网

linux下为什么要限制栈的大小为8m?

烦人的星辰 1589

前言:

今天各位老铁们对“linux进程栈大小”都比较注重,各位老铁们都需要知道一些“linux进程栈大小”的相关文章。那么小编也在网上汇集了一些关于“linux进程栈大小””的相关文章,希望朋友们能喜欢,朋友们一起来学习一下吧!

#秋日生活打卡季#

在开始编写代码的时候总是被告诉不要使用下面这种形式的写法,为什么呢?后来知道这是局部变量,运行时在栈上动态分配的,栈的size是有限制的,一般是8M,当函数嵌套多次的时候很可能就发生栈溢出。

int fun() {	char buf[8192];	fun();}

我们通过ulimit -a看到系统对当前进程的栈size进行了限制,大部分是8M的限制。

用户可以通过ulimit -s来修改栈的大小,可以扩充到100M的大小,为什么系统默认增加这个限制呢?

用户空间地址分布

下面的图展示了32bit系统中进程的用户地址空间分布,stack这里配置的是向下增长的。 原图看这里

白色区域表示gap,为了防止无意间的访问越界,对该区域的任何读写操作都会触发MMU异常进而收到SIGSEGV信号。地址空间底部依次是text,data,bss段,程序编译链接的时候就已经确定他们的size,可能加载的时候进行了地址随机化,但是相对地址是固定的.heap段也就是堆区域,平时我们经常把堆和栈混为一谈,其实他们是分开的,在bss段上方有一个随机的gap区域,之后就是heap的基地址,随着程序的运行他动态向上增长.mapping区域在在堆和栈中间,它是用来加载依赖动态库的,最顶部的动态库地址和栈基地址有一个间隔,为栈动态增长预留的用户空间最上方是栈区域,栈的基地址是内核空间之下的地址,可能会有随机的偏移,随着函数的调用嵌套是向下增长的。

标签: #linux进程栈大小