Недавно я начал изучать ассемблер и узнал о скриптах компоновщика и других низкоуровневых деталях аппаратного программирования. Я также учу себя компьютерной архитектуре, и где-то вдоль линии я начал бояться, что моя картина модели памяти могла быть неправильной с самого начала.
В соответствии с тем, что я понимаю в настоящее время, весь код и данные находятся в энергонезависимой памяти сразу после того, как мы «запишем» двоичный файл в процессор - энергозависимая оперативная память ничего не содержит при перезагрузке. Когда программа начинает «выполняться», она делает это с адреса 0x0000, который почти всегда (AFAIK) является самым низким адресом во Flash. Таким образом, инструкции привязаны к шине, соединяющей Flash с ядром процессора, и именно здесь происходит фактическое выполнение. Тем не менее, когда мы говорим о том, что процессор извлекает или хранит данные из памяти, мы обычно говорим об оперативной памяти - я осознаю, что мы можем также читать / записывать данные из памяти программы (я видел это на AVR) но разве это не так распространено? Это потому, что оперативная память быстрее ПЗУ, что мы предпочитаем хранить там данные?
Принятый ответ на этот вопрос говорит о том, что большая часть кода выполняется из ОЗУ.
Означает ли это, что код времени запуска (который сам исполняется из Flash) должен копировать все коды операций программы из Flash в RAM и каким-то образом отображать адреса во Flash так, чтобы они указывали на RAM, чтобы процессор выбирал коды операций оттуда? Это похоже на процесс, в котором мы перемещаем разделы .data из ROM в RAM при запуске?
Я могу себе представить, что это проще в архитектурах фон Неймана, где память программ и данных совместно используют шину, но в архитектурах Гарварда это не означает, что весь код и данные должны сначала проходить через регистры ЦП?
Как вы, наверное, догадываетесь, я слишком смущен всем этим делом. Всегда программируя на более высоком уровне абстракции, я легко беспокоюсь о таких деталях. Любая помощь приветствуется.