Нещодавно я почав вивчати складання і дізнався про сценарії лінкерів та інші деталі низького рівня апаратного програмування. Я також викладаю комп'ютерну архітектуру, і я десь узгоджувався з тим, що моя картина моделі пам'яті, можливо, помилялася весь час.
Згідно з тим, що я розумію в даний час, весь код і дані знаходяться в енергонезалежній пам'яті відразу після того, як ми 'спалимо' бінарний файл на процесор - оперативна пам'ять, що є летючою, не містить нічого після скидання. Коли програма починає «виконувати», вона робить це з адреси 0x0000, яка майже завжди (AFAIK) є найнижчою адресою Flash. Отже, інструкції прив’язані до шини, що з'єднує Flash з ядром процесора, і саме там відбувається власне виконання. Однак, коли ми говоримо про отримання процесора або зберігання даних з пам'яті, ми зазвичай говоримо про оперативну пам’ять - я знаю, що ми можемо також читати / записувати дані з пам'яті програми (я бачив, як це робилося на AVR) але хіба це не так часто? Це тому, що оперативна пам'ять швидше, ніж ROM, ми вважаємо за краще зберігати там дані?
Прийнята відповідь на це питання говорить про те, що більшість фрагментів коду виконується з оперативної пам'яті.
Чи означає це, що код запуску (який сам виконується з Flash) повинен копіювати всі програмні коди з Flash в оперативну пам'ять і якось відображає адреси у Flash, щоб вказувати на оперативну пам'ять, щоб CPU вибирав звідти коди? Це схоже на процес, коли ми при запуску переміщуємо розділи .data з ROM в ОЗУ?
Я можу уявити, що це простіше в архітектурах фон Неймана, де пам'ять програми та даних діляться шиною, але чи не в Гарвардській архітектурі це означає, що весь код і дані повинні пройти спочатку через регістри процесора?
Як ви, напевно, можете здогадатися, я трохи не збентежений цілим бізнесом. Завжди запрограмований на більш високому рівні абстракції, я легко переживаю такі деталі. Будь-яка допомога вдячна.