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!

questionAnswers(3)

yourAnswerToTheQuestion