Модифікована Гарвардська архітектура

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Модифікована Гарвардська архітектура — варіант Гарвардської архітектури ЕОМ, що дозволяє доступ до пам'яті інструкцій як до даних. Більшість сучасних комп'ютерів, у назві яких фігурує «Гарвардська архітектура», насправді реалізують таку модифікацію.

Архітектура фон Неймана

[ред. | ред. код]

Комп'ютер з архітектурою фон Неймана має перевагу над «чистим» гарвардським через легкість роботи з кодом програми як даними (як і навпаки — роботи з даними як кодом). Наприклад, читання програми з носія інформації до пам'яті в принципі нічим не відрізняється від читання даних. Також легко здійснені такі прийомии, як JIT-компіляція чи код, що модифікує сам себе. З недоліків можна відзначити проблеми з захистом ділянок пам'яті для програми (недозволений запис у пам'ять програм може використовуватися шкідливими програмами) і складності з відлагоджуванням програми, код якої динамічно змінюється.

Гарвардська архітектура

[ред. | ред. код]

Найперша обчислювальна машина, від якої пішла назва архітектури — Harvard Mark I — мала повністю розділені системи пам'яті для збереження програм і даних. Процесор здійснював вибірку інструкції і завантаження даних одночасно і незалежно одне від одного. Такий механізм є фундаментальною відмінністю в порівнянні з архітектурою фон Неймана, де інструкції і дані зберігаються в одній і тій самій пам'яті, і (за відсутності кеш-пам'яті) можуть бути завантажені лише послідовно.

Блок-схема гарвардської архітектури комп'ютера.

У «чисто» гарвардській ЕОМ адресні простори програм і даних мають бути повністю розділені: адреса інструкції і адреса даних — це різні сутності, що ідентифікують, відповідно, команду процесора і байт чи слово даних у двох різних просторах пам'яті. Через таку розділеність гарвардська архітектура уможливлює різну розрядність (і взагалі, різні характеристики) пам'яті програм і даних. Наприклад, спеціалізований процесор може мати 10-розрядну шину адреси (тобто, адресувати не більше ніж 1024 машинних слів), при цьому оперувати 128-розрядними даними.

Модифікована Гарвардська архітектура

[ред. | ред. код]

Більшість сучасних комп'ютерами є машинами модифікованої гарвардської архітектури, де модифікації полягають у ослабленні розділення коду і даних, водночас зберігаючи переваги зі швидкодії і паралельності, які дає Гарвардська архітектура.

Розділений кеш («майже фон Нейманівська архітектура»)

[ред. | ред. код]

Найблішь розповсюдженою модифікацією є організація ієрархії пам'яті у вигляді запровадження роздільного кешу для інструкцій і для даних. Такий підхід зберігає фон Нейманівську уніфікацію адресних просторів майже повністю.[1] Більшість програмістів можуть навіть не здогадуватись, що невелика частина кешу (L1) є розділеною, і що ця особливість суттєво підвищує швидкодію ЦП. Системні програмісти, що потребують максимальної швидкості виконання низькорівневого коду, повинні зважати на питання когерентності кешу.

Архітектура «пам'ять інструкцій як дані»

[ред. | ред. код]

Інша модифікація, хоча і зберігає принцип «розділені адресні простори» Гарвардської архітектури, забезпечує кілька спеціальних машинних команд для доступу до пам'яті інструкцій. При такій зміні дані не можна «запустити» як серію інструкцій (через це таку архітектуру не завжди розглядають як «модифіковану Гарвардську».

  • Читання з пам'яті інструкцій: спеціальні команди можуть копіювати вміст пам'яті інструкцій у пам'ять даних. У випадку констант (таких як пі чи текстові дані, що не будуть змінюватися), можливе також збереження їх прямо у пам'яті інструкцій, без копіювання у пам'ять даних.
  • Запис у пам'ять інструкцій: потрібна для можливості зміни програми. Наприклад, мікроконтролери зазвичай мають можливіть запису програми у флеш-пам'ять.[2]

Архітектура «пам'ять даних як інструкції»

[ред. | ред. код]

Деякі процесори Гарвардської архітектури (такі, як MAXQ)[3], можуть виконувати інструкції з будь-якого сегмента пам'яті. Відмінність від фон-Нейманівської архітектури полягає в тому, що такі процесори можуть читати інструкцію і дані одночасно, якщо вони розташовуються у різних сегментах. Це є можливим завдяки тому, що процесор має як мінімум дві незалежних апаратних шини, для читання адрес і даних відповідно. При програмуванні слід зауважувати, що читання даних з того ж самого сегменту, де виконуюється поточний код, не може бути здійснене водночас з виконанням інструкції.[4][5]

Сучасне застосування модифікованої Гарвардської архітектури

[ред. | ред. код]

Кеш-пам'ять сучасних процесорів, зокрема кеш першого рівня, зазвичай розділена на окремі частини для команд і для даних.

Існують також процесори, що можуть вважатися гарвардськими у найбільш суворому сенсі (програма і дані знаходяться у різних адресних просторах), «модифіковані» лише з метою можливості запису програми у пам'ять як послідовності байтів (даних). Для прикладу, інструкції LPM (Load Program Memory) і SPM (Store Program Memory) у контролерах Atmel AVR реалізують таку модифікацію. Схожі рішення застосовані і в інших мікропроцесорах, таких як PIC і Z8 Encore!, і у багатьох цифрових сигнальних процесорах (наприклад, TMS320 від Texas Instruments). Через те, що виконання програми суворо лімітоване окремим адресним простором, такі процесори дуже несхожі на традиційні фон-Нойманівські.

Розділені адресні простори створюють певні незручності при програмуванні на мовах високого рівня. Не всі компілятори підтримують модель, де дані лише для читання розташовуються в абсолютно іншому адресному просторі (і, як наслідок, вимагають особливих інструкцій для читання), в порівнянні з даними на читання і на запис. Компілятори з мови C, що підтримують розділені адресні простори, роблять це або за допомогою нестандартних розширень, або через механізми Embedded C, що лише нещодавно став стандартом.

Джерела

[ред. | ред. код]
  1. Modified Harvard Architecture: Clarifying Confusion. Архів оригіналу за 17 квітня 2020. Процитовано 16 січня 2018.
  2. AVR109: Self Programming (PDF) (Application note). Atmel. June 2004. Архів оригіналу (PDF) за 19 березня 2015. Процитовано 29 січня 2015.
  3. Catsoulis, John (2005). Designing Embedded Hardware: Create New Computers and Devices. с. 329.
  4. MAXQ Family User's Guide[недоступне посилання]. Sections 1.2 "Harvard Memory Architecture" and 2.5 "Pseudo-Von Neumann Memory Access".
  5. Konark Goel et al. About MAXQ GCC port [Архівовано 4 березня 2016 у Wayback Machine.].

Див. також

[ред. | ред. код]