Банки пам'яті
Банки пам'яті використовуються, коли
адресний простір процесора малий, а додаток вимагає. При цьому
вартісні і електротехнічні обмеження дозволяють нам встановити в
систему значно більше пам'яті, чим процесор може адресувати. Наприклад, біля
багатьох" мікроконтроллерів адреса має довжину всього 8 біт, проте 256
байт даних, і тим більше 256 команд коди для більшості додатків недостатньо.
Багато хто з ранніх персональних комп'ютерів, заснованих на
8-розрядних мікропроцесорах i8085 і Z80 з 16-розрядною адресою, мав
значно більше 64 Кбайт пам'яті. Наприклад, популярні в роки дитинства авторів
комп'ютери Yamaha мали до 2 Мбайт оперативної пам'яті.
Адресація додаткової пам'яті в цій ситуації забезпечується додатковим
адресним регістром, який може бути як конструктивним елементом процесора,
так і зовнішнім пристроєм. Цей регістр дає нам додаткові біти адреси,
які і забезпечують адресацію додаткової пам'яті. Регістр цей називається
розширювачем адреси або селектором
банку а область пам'яті, яку можна адресувати, не змінюючи селектор
банку, - банком пам'яті. Значення регістра-селектора
називають номером банку.
Банкова адресація в 16-розрядних
мікропроцесорах
Уважний
читач, знайомий з системою команд Intel 8086, не може не
відзначити, що "сегментні" регістри цього процесора мають мало
загального з власне сегментацією, що описується в главі
5. Ці регістри більш схожі на химерний гібрид селектора банків
і базового регістра. Як і описуваний далі PIC, I8086 має команди
"ближніх" (внутрішньобанкових) і "далеких" (міжбанкових)
переходів, викликів і повернень.
Що
відноситься до того ж поколінню процесорів Zylog 800 має повноцінні
селекторы банків. Зі всіх виготівників 16-розрядних мікропроцесорів
лише інженери фірми Motorola наважилися розширити адресу до 24 біт (це
зажадало збільшення розрядності регістрів і надання команд 32-розрядного
складання), всі інші так чи інакше експериментували з селекторами
банків і варіаціями на цю тему.
Робота з банками пам'яті даних зазвичай
не представляє великих проблем, за винятком ситуацій, коли нам
потрібно скопіювати з одного банку в іншій структуру даних, яку
неможливо розмістити в регістрах процесора. Істотно складнішим завданням
є передача управління між банками програмної пам'яті.
У
тому випадку, коли селектор банку програмної пам'яті інтегрований в процесор, надаються
спеціальні команди, що дозволяють перезавантажити одночасно
"молодшу" (власне регістр РС) і "старшу" (селектор
банку) частини лічильника команд.
Банки команд в Р/с
Біля мікроконтроллерів PIC арифметичні операції виробляються лише над
молодшими 8 бітами лічильника команд, тому відносні і обчислювані
переходи допустимі лише в межах 256-командного банку. Проте повне
— з врахуванням селектора банку — адресний простір для команд досягає
64 Кбайт, а біля старших моделей і 16 Мбайт за рахунок використання двох регістрів-розширювачів.
Перемикання банку здійснюється спеціальними командами "довгого"
— міжбанкового — переходу.
Якщо банкова адресація реалізована як зовнішній пристрій,
проблема міжбанкової передачі управління встає перед нами в повне зростання.
Оскільки ми не маємо команд міжбанкового переходу, будь-якою такий перехід
складається мінімум з двох команд: перемикання банку і власне переходу.
Кожна з них порушує порядок виконання команд.
Розглянемо ситуацію
детальніше (мал. 2.15): з коди, що знаходиться в банці 1
за адресою OxlOaf, ми хочемо викликати процедуру, що знаходиться в банці 2
за адресою 0x2000. Якщо ми спочатку виконаємо перемикання банку, ми виявимося
в банці 2 за адресою ОХЮЬО, не маючи жодного уявлення про те, який
же код або дані розміщені за цією адресою. З тією ж проблемою ми зіткнемося,
якщо спочатку спробуємо зробити перехід за адресою Oxlfff.
Як рішення можна запропонувати розміщення за адресою Oxlfff в банці 1
команди перемикання на банк 2. Можливо, для цього доведеться перемістити якийсь
код або дані, але ми попадемо за бажаною адресою. Впро-чем, якщо
ми постійно здійснюємо міжбанкові переходи, цей підхід Зажадає вставки
команд перемикання банку для кожної можливої точки входу у всіх
останніх банках. Ручне (та і автоматизоване) розміщення цих
команд — операція надзвичайно трудомістка, і виникає природна ідея:
сконцентрувати всі ці вставлені команди і відповідні ним точки
входу в якомусь одному місці. Втім, навіть ця ідея не дає нам відповіді
на питання, як же при такій архітектурі повертати управління з процедур?
Вставляти команду перемикання ще і для кожної команди виклику?

Мал. 2.15. Міжбанковий перехід
Розвиток цієї ідеї наводить нас до чогось, схожому на менеджер оверлеїв (див.
разд. Оверлеї (перекриття) .
програмний модуль, який присутній у всіх банках поодинці і тій же адресі
(мал. 2.16). Якщо нам потрібно викликати відому процедуру в певному
банку, ми передаємо її адресу і номер банку цьому модулю, і він здійснює
збереження поточного банку, перемикання і перехід. Якщо процедура робить
повернення, вона повертає управління тому ж модулю, який, у свою чергу,
відновлює вихідний банк і повертає управління в точку виклику.
Подальший розвиток цієї ідеї наводить до думки, що найпростіший спосіб
розмістити цей код у всіх банках — це ускладнити схему роботи селектора
банків, наприклад, завжди відображувати перший кілобайт адресного простору
на одні і ті ж фізичні адреси. Апаратний це нескладно: ми аналізуємо
старші шість бітів адресної шини процесора. Якщо вони не дорівнюють нулю,
ми подаємо на старші біти адресної шини пам'яті вміст селектора банку,
якщо ж рівні — нульові біти. Приблизно цим способом і розширюють пам'ять
більшість мікрокомп'ютерів на основі 8-розрядних процесорів.
Оскільки ми вступили на дорогу аналізу логічної адреси, можна піти
і далі: розбити адресний простір процесора на декілька банків,
кожен зі своїм селектором.

Мал. 2.16. Перемикач банків
Адресний простір PDP-11
Машини серії PDP-11 мають 16-розрядну адресу, яка дозволяла
адресувати 64 Кбайт. Біля старших моделей серії цей простір розбитий на 8
сегментів по 8 Кбайт кожен. Кожному з цих сегментів відповідає свій
селектор банку (в даному випадку слід вже говорити про дескриптор сегменту)
(мал. 2.17). Фізичний адресний простір, який може бути охоплене
дескрипторами сегментів, складає 2 Мбайт, що набагато більше адрес, доступних
окремому процесу. На перший погляд, ця конструкція є ускладненою
реалізацією банкової адресації, мета якої — лише розширити фізичний
адресний простір за межі логічного, але той факт, що, окрім
фізичної адреси, кожен сегмент має і інші атрибути, у тому числі
права доступу, заставляє нас визнати, що це вже зовсім інша історія,
заслуговуюча окремої глави (див. главу
5).
Мал. 2.17. Віртуальна пам'ять
PDP-11/20 |