Ao configurar a alocação dinâmica de memória, o kernel do Linux precisa escolher um local para colocar seu heap, certo? Como ele evita sobrescrever sua própria pilha ou que a pilha cresça e sobrescreva o heap posteriormente?
Ao configurar a alocação dinâmica de memória, o kernel do Linux precisa escolher um local para colocar seu heap, certo? Como ele evita sobrescrever sua própria pilha ou que a pilha cresça e sobrescreva o heap posteriormente?
Em um sistema simplista, como um modelo de memória plana, a pilha e o heap são colocados em extremidades opostas do pool de memória livre e crescem em direção um ao outro. Se você ficar sem memória, os dois podem se encontrar.
É claro que o Linux não usa um modelo de memória plana, nem no kernel nem no espaço de processo. Ambos usam memória paginada (paginação sob demanda para processos) que é mapeada virtualmente, então a resposta simples é que o heap e a pilha recebem páginas separadas do conjunto de páginas livres conforme necessário, evitando sobreposições. Como as páginas são mapeadas virtualmente, elas podem ser virtualmente sequenciais, embora, na verdade, estejam fisicamente dispersas. Como os endereços de página são virtuais, o heap e a pilha podem receber endereços virtuais tão distantes que praticamente nunca conseguem encontrar a memória física disponível.