操作系统是否为堆栈或其他内容保留了固定数量的有效虚拟空间?仅使用大局部变量就能产生堆栈溢出吗?
我写了一个小C
程序来测试我的假设。它在X86-64 CentOS 6.5上运行。
#include <string.h>
#include <stdio.h>
int main()
{
int n = 10240 * 1024;
char a[n];
memset(a, 'x', n);
printf("%x\n%x\n", &a[0], &a[n-1]);
getchar();
return 0;
}
运行程序可以得到&a[0] = f0ceabe0
和&a[n-1] = f16eabdf
proc映射显示了堆栈: 7ffff0cea000-7ffff16ec000. (10248 * 1024B)
然后我试图增加 n = 11240 * 1024
运行程序可以得到&a[0] = b6b36690
和&a[n-1] = b763068f
proc映射显示了堆栈: 7fffb6b35000-7fffb7633000. (11256 * 1024B)
ulimit -s
10240
在我的电脑上打印。
如您所见,在两种情况下,堆栈大小都大于堆栈大小ulimit -s
。并且堆栈随着更大的局部变量而增长。堆栈的顶部以某种方式会降低3-5kB &a[0]
(AFAIK,红色区域是128B)。
那么如何分配此堆栈映射?