O sistema operacional reserva a quantidade fixa de espaço virtual válido para a pilha ou outra coisa? Posso produzir um estouro de pilha apenas usando grandes variáveis locais?
Eu escrevi um pequeno C
programa para testar minha suposição. Está sendo executado no 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 execução do programa fornece &a[0] = f0ceabe0
e&a[n-1] = f16eabdf
Os mapas proc mostram a pilha: 7ffff0cea000-7ffff16ec000. (10248 * 1024B)
Então eu tentei aumentar n = 11240 * 1024
A execução do programa fornece &a[0] = b6b36690
e&a[n-1] = b763068f
Os mapas proc mostram a pilha: 7fffb6b35000-7fffb7633000. (11256 * 1024B)
ulimit -s
imprime 10240
no meu PC.
Como você pode ver, em ambos os casos, o tamanho da pilha é maior do que o indicado ulimit -s
. E a pilha cresce com maior variável local. O topo da pilha está de alguma forma 3-5kB a mais &a[0]
(AFAIK, a zona vermelha é 128B).
Então, como esse mapa de pilha é alocado?