Parece que o limite de memória da pilha não está alocado (de qualquer maneira, não poderia com pilha ilimitada). link diz:
The C language stack growth does an implicit mremap. If you want absolute guarantees and run close to the edge you MUST mmap your stack for the largest size you think you will need. For typical stack usage this does not matter much but it's a corner case if you really really care
No entanto, o mapeamento da pilha seria o objetivo de um compilador (se tiver uma opção para isso).
EDIT: Após alguns testes em uma máquina Debian x84_64, descobri que a pilha cresce sem nenhuma chamada de sistema (de acordo com strace
). Então, isso significa que o kernel cresce automaticamente (isso é o que o "implícito" significa acima), ou seja, sem mmap
/ mremap
explícito do processo.
Foi muito difícil encontrar informações detalhadas para confirmar isso. Eu recomendo Compreendendo o gerenciador de memória virtual do Linux de Mel Gorman. Suponho que a resposta esteja na Seção 4.6.1 Manipulando uma falha de página , com a exceção "Região inválida, mas ao lado de uma região expansível como a pilha" e a ação correspondente "Expandir a região e alocar uma página". Veja também D.5.2 Expandindo o Stack .
Outras referências sobre o gerenciamento de memória do Linux (mas com quase nada sobre a pilha):
- Perguntas frequentes sobre memória
- O que todo programador deve saber sobre a memória de Ulrich Drepper
EDIT 2: Esta implementação tem uma desvantagem: nos casos de canto, uma colisão de heap de pilha pode não ser detectada, mesmo no caso em que a pilha seria maior que o limite! O motivo é que uma gravação em uma variável na pilha pode acabar na memória heap alocada, caso em que não há falha de página e o kernel não pode saber que a pilha precisou ser estendida. Veja meu exemplo na discussão Colisão silenciosa de pilha-pilha sob o GNU / Linux I iniciado na lista de ajuda do gcc. Para evitar isso, o compilador precisa adicionar algum código na chamada de função; isso pode ser feito com -fstack-check
para o GCC (veja a resposta de Ian Lance Taylor e a página do GCC para detalhes).