Como o compilador coloca o código na memória
Ok eu tenho um pouco de uma pergunta de estudante noob.
Portanto, estou familiarizado com o fato de que as pilhas contêm chamadas de sub-rotina e as pilhas contêm estruturas de dados de comprimento variável, e as variáveis estáticas globais são atribuídas a locais de memória permanentes.
Mas como tudo isso funciona em um nível menos teórico?
O compilador apenas assume que tem uma região de memória inteira para si mesmo do endereço 0 para endereçar o infinito? E então comece a atribuir coisas?
E onde é que o layout das instruções, pilha e heap? No topo da região da memória, fim da região da memória?
E como isso funciona com a memória virtual? A memória virtual é transparente para o programa?
Desculpem as perguntas do bajilion, mas estou usando estruturas de linguagem de programação e elas se referem a essas regiões e quero entendê-las em um nível mais prático.
Muito obrigado antecipadamente!