O getrlimit (2) tem a seguinte definição nas páginas do manual:
RLIMIT_AS O tamanho máximo da memória virtual do processo (espaço de endereço) em bytes. Esse limite afeta as chamadas para brk (2), mmap (2) e mremap (2), que falham com o erro ENOMEM ao exceder esse limite. A expansão automática da pilha também falhará (e gerará um SIGSEGV que interrompe o processo se nenhuma pilha alternativa tiver sido disponibilizada via sigaltstack (2)). Como o valor é longo, em máquinas com comprimento de 32 bits, esse limite é de no máximo 2 GiB ou esse recurso é ilimitado.
O que se entende por "expansão automática da pilha" aqui? A pilha em um ambiente Linux / UNIX cresce conforme necessário? Se sim, qual é o mecanismo exato?
ulimit -s
).O mecanismo exato é fornecido aqui, no Linux: ao lidar com uma falha de página em mapeamentos anônimos, você verifica se é uma "alocação crescente" que você deve expandir como uma pilha. Se o registro da área da VM disser que você deveria, ajuste o endereço de início para expandir a pilha.
Quando ocorre uma falha na página, dependendo do endereço, ela pode ser reparada (e a falha anulada) via expansão da pilha. Esse comportamento "crescente em caso de falha" da memória virtual pode ser solicitado por programas arbitrários do usuário, com o
MAP_GROWSDOWN
sinalizador sendo passado para ommap
syscall.Você também pode mexer com esse mecanismo em um programa do usuário:
Quando solicitado, você encontra o pid do programa (via
ps
) e/proc/$THAT_PID/maps
veja como a área original cresceu.fonte