Recentemente, comecei a aprender montagem e conheci scripts de vinculador e outros detalhes de baixo nível da programação de hardware. Também estou me ensinando arquitetura de computadores e, em algum momento, tive medo de que minha imagem do modelo de memória estivesse errada o tempo todo.
De acordo com o que eu entendo atualmente, todo o código e dados residem na memória não volátil logo após "gravar" o binário em um processador - a RAM sendo volátil não contém nada na redefinição. Quando o programa começa a ser executado, ele é feito a partir do endereço 0x0000, que é quase sempre (AFAIK), o endereço mais baixo do Flash. Portanto, as instruções são travadas no barramento que conecta o Flash ao núcleo da CPU e é aí que a execução real ocorre. No entanto, quando falamos sobre a CPU recuperar ou armazenar dados da memória, geralmente falamos sobre RAM - eu sei que também podemos ler / gravar dados da memória do programa (eu já vi isso nos AVRs) mas não é tão comum? É porque a RAM é mais rápida que a ROM que preferimos armazenar dados lá?
A resposta aceita para essa pergunta diz que a maioria dos pedaços de código é executada fora da RAM.
Isso significa que o código de tempo de execução da inicialização (que é executado no Flash) precisa copiar todos os códigos de programa do Flash para a RAM e, de alguma forma, mapeia os endereços no Flash para apontar para a RAM, para que a CPU busque os códigos de lá? É semelhante ao processo no qual movemos as seções .data da ROM para a RAM na inicialização?
Posso imaginar que isso seja mais simples nas arquiteturas de von Neumann, onde o programa e as memórias de dados compartilham um barramento, mas nas arquiteturas de Harvard, isso não significa que todo o código e dados precisam passar primeiro pelos registros da CPU?
Como você provavelmente pode adivinhar, estou um pouco confuso com esse negócio todo. Tendo sempre programado em um nível de abstração mais alto, sou facilmente incomodado com esses detalhes. Qualquer ajuda é apreciada.