Архітектура 32-розрядних мікропроцесорів

3. Сегментна організація пам'яті 32-розрядних МП

У 32-розрядних МП роз­різняють три адресні простори пам'яті — логічний, лінійний і фізичний. Логічна адреса (або віртуальна) складається з селектора і зміщення ЕА. Лінійна адреса утворюється дода­ванням базової адреси сегмента до ефективної адреси. Фізична адреса пам'яті створюється після перетворення лінійної адреси блоком сторінкової переадресації.

Організація пам'яті залежить від режиму роботи МП. У ре­альному і віртуальному режимах i8086 адресація пам'яті така сама, як у МП i8086. У захищеному режимі здійснюється сегментна і сторінкова організація пам'яті. Сегментна організація використовується на прикладному рівні, а сторін­кова — на системному. Формування адреси комірки пам'яті у захищеному режимі подано на рис. 3.9. Блок сегментації перетворює простір логічних адрес на простір лінійних адрес. Вихідними даними для блока сегментації є зміщення ЕА у сегменті та сегментний регістр, які задаються у команді. Вміст сегментного регістра у захищеному режимі є селектором. Він містить інформацію про тип дескрипторної таблиці (глобаль­ної або локальної) та індекс дескриптора (див. рис. 1). Індекс дескриптора є номером дескриптора у таблиці. Де­скриптор містить базову адресу сегмента. Лінійна адреса ство­рюється додаванням базової та ефективної адрес згідно з рисунком 2.

 

Рисунок 2 -  Формування адреси комір­ки пам'яті у захищеному режимі

 

Блок сторінкової переадресації формує фізичну адресу пам'яті. За вимкненого блока лінійна адреса збігається з фізичною. Блок обчислення ефективної адреси обчислює адресу-зміщення операнда у сегменті за одним з наступних типів адресації, наведених у табл. 1. Алгоритм обчислення адреси комірки пам'яті для різних типів адресації показано на рис. 2. Регістри загального призначення МП можуть виконувати функції таких регістрів: базового Base, індексно­го Index, масштабування множника Scale і зміщення Disp. У табл. 2 подано використання цих регістрів залежно від режимів адресації: 16- або 32-розрядної. Масштабовані типи адресації можливі лише у 32-розрядному режимі адресації.

 

Таблиця 1 -. Типи адресації у 32-розрядних процесорах

Тип адресації

Обчислення ЕА

Регістрова

ЕА = вмісту РЗП

Пряма

ЕА = Disp

Непряма регістрова

ЕА = Base

Базова

ЕА = Base + Disp

Індексна

ЕА - Index + Disp

Масштабована індексна

ЕА = Scale x Index + Disp

Базова індексна

ЕА = Base + Index

Масштабована базова індексна

EA = Base + Index ´ Scale

Базова індексна зі зміщенням

EA- Base + Index +Disp

Масштабована базова індексна зі зміщенням

EA = Base + Index ´ Scale + Disp

У реальному режимі за замовчуванням використовується 16-бітова адресація, але за допомогою префікса зміни розрядності адреси можна перемкнути на 16-розрядний режим. У захищеному режимі тип адресації залежить від біта D у дескрипторі кодового сегмента (за D = 0 використовується 16-розрядна адресація, а за D = 1 — 32-розрядна).

Використання сегментних регістрів під час адресації пам'яті визначається типом звернення до пам'яті (табл. 3). Для деяких типів звернень допускається заміна сегментного регістра, що вводиться, застосуванням префіксів команд CS:, DS:, SS:, ES:, FS:, GS:, наприклад

ADD FS:[ESI],EAX;     [FS.ESI] ¬ [FS:ESI]+EAX.

 

Рисунок 3 -  Алгоритм обчислення ад­реси комірки пам'яті для різних типів адресації

  

Tаблиця 2 -  Використання РЗП під час обчислення ефективної адреси

Компонент

Адресація

16-розрядна

32-розрядна

Базовий регістр (Base)

ВХ або ВР

Будь-який 32-розрядний РЗП

Індексний регістр (Index)

SI або DI

Будь-який 32-розрядний РЗП, крім ESP

Масштаб (Scale)

1

1,2,4або8

Зміщення (Disp)

0,8 або 16 біт

0, 8 або 32 біт

 

Таблиця 3 - Використання сегментних регістрів для адресації пам'яті

Тип звернення до пам'яті

Сегментний регістр

Змі­щення

за замовчу­ванням

альтернативний

Вибірка команд

CS

Немає

IP, EIP

Стекові операції

SS

Немає

SP, ESP

Адресація змінної

DS

CS, ES, SS, ES, GS

ЕА

Рядок-джерело

DS

CS, ES, SS, ES, GS

SI

Рядок-приймач

ES

Немає

DI

Використання ВР, ЕВР або ESP як базо­вого регістра

SS

CS, ES, DS, ES, GS

ЕА

 

Приклад 1. Знайти значення фізичної адреси операнда в команді пересилання у регістр AL вмісту комірки пам'яті

 

MOVAL, [ВХ + 4   SI + 1000H],

 

якщо базова адреса сегмента даних дорівнює 12 456 789H, а вміст регістрів ВХ = 0120H, SI = 1234H. Блока сторінкової переадресації немає.

Ефективна адреса комірки пам'яті

ЕА = 0120H + 4 ∙ 1234H + 1000H = 59F0H.

Виконавши операцію додавання 32-розрядної базової адреси з ефек­тивною адресою ЕА, отримаємо лінійну адресу, яка збігається і з фізич­ною адресою:

12456789H + 59F0H = 1245С179H.

Отже, фізична адреса дорівнює 1245С179H.

Формування базової адреси сегмента пояснює рисунку  4. Поле ТІ селектора сегмента визначає робочу дескрипторцу таблицю (глобальну або локальну), де знаходиться початко­ва адреса сегмента.

Поле RPL визначає запрошений рівень привілею сегмента, а поле Index —зміщення від початкової адреси таблиці. За­значимо, що початкова адреса таблиці зберігається або у регістрі GDTRдля глобальної таблиці, або у тіньовому ре­гістрі. В останньому випадку регістр LDTR, в свою чергу, є селектором і вказує, де в глобальній дескрипторній таблиці знаходиться інформація про початкову адресу локальної таб­лиці. Ця інформація переписується у тіньовий регістр.

Формат дескриптора для 32-розрядних процесорів пода­но на рисунку 5. Дескриптор МП i80286 містить нуль у бітах 63 — 48, а поля базової адреси і межі займають відповідно 24 і 16 біт. У 32-розрядному МП поле базової адреси займа­ють другий, третій, четвертий і сьомий байти дескриптора. У процесі виконання команди ці байти об'єднуються в одну 32-розрядну базову адресу.

Рисунок 4 - Формування базової адреси сегмента

 

Рисунок 5 -  Формат дескриптора для 32-розрядних процесорів

 

Поле межі займає байти з номерами 0, 1 і молодші чотири біти шостого байта дескриптора. Межа задає максимальне зміщення у сегменті або останню одиницю, що адресується в сегменті. За 20-розрядної межі максимальне значення еле­ментів, що адресуються, становить 220. Оскільки елементом сегмента є не лише байт, а й сторінка 4 Кбайт, сегмент може містити від одного байта до 4 Гбайт. Байт з номером 5 дес­криптора AR (Access Rights) містить право доступу, зокрема, такі біти керування: Р (Present) — біт наявності; DPL (Descripter Privilege Level) — поле рівня привілеїв сегмен­та; S (System) — системний біт; Туре — поле типу сегмента; A (Accessed) — біт звернення.

Біт присутності Р дорівнює одиниці, якщо сегмент знаходиться у фізичній пам'яті (ОЗП). У системі віртуаль­ної пам'яті операційна система може передавати вміст деяких сегментів на диск, при цьому вона скидає біт Р у стан логіч­ного нуля в дескрипторі цього сегмента. Якщо програма після цього знову звертається до сегмента, виникає особливий ви­падок відсутності сегмента. Операційна система шукає вільну область фізичної пам'яті (при цьому, можливо, відправляє на диск деякий інший сегмент), копіює вміст запрошеного сегмен­та з диска у пам'ять, записує в його дескриптор нову базову адресу та здійснює рестарт команди, що викликала особли­вий випадок 11 відсутності сегмента. Описаний процес нази­вають свопінгом (swapping), або довантаженням.

Поле рівня привілеїв сегмента DPL містить 2 біти. Найвищому рівню привілею відповідає значення 0, найниж­чому — значення 3.

Системний біт S має нульове значення (S = 0) у дес­крипторах сегмента кодів, системних сегментів для зберіган­ня локальних таблиць дескрипторів, станів задач TSS (Task State Segment) та у дескрипторах, що називають вентилями (Gate), або шлюзами. В інших випадках 5=1.

Рисунок 6 -  Формат вентилів

Вентиль містить інформацію про логічну адресу входу до деякої системної програми і займає 8 байт. Формат вентилів показано на рисунку 6.

Вентилі призначені для передавання керування і містять логічну адресу переходу у вигляді селектора SELECTOR і 32-розрядного зміщення OFFSET. Вентилі виклику використовують для викликів процедур зі зміною рівня привілеїв, вентилі задач — для перемикання задач, вентилі перери­вань та вентилі пастки — для переходу до процедур обслу­говування переривань, при цьому вентилі переривань забо­роняють переривання (відбувається скидання прапорця IF), а вентилі пастки — не забороняють.

Поле WORD COUNT (див. рис. 6) у вентилях викли­ку визначає кількість слів, які копіються зі стеку однієї про­цедури у стек іншої процедури. Для інших вентилів поле WORD CO UNT містить нульові значення.

Поле типу сегмента Туре займає три розряди і визна­чає тип сегмента згідно з табл. 3.6.

Таблиця 4 -  Типи сегментів і системних об'єктів

Туре

А

Тип сегмента

Дозволені операції

Сегменти кодів і даних

0   0   0

А

Даних 

Тільки зчитування

0   0   1

А

—«—-

Зчитування і запис

0   1   0

А

Стеку

Тільки зчитування

0        1

А

—«—

Зчитування і запис

1   0   0

А

Коду

Тільки виконання

1   0   1

А

—«—

Виконання і зчитування

1   1   0

А

Підлеглий сегмент коду**

Тільки виконання

1   1   1

А

—«—

Виконання і зчитування

Системні сегменти***

0   0   0

1

Доступний сегмент TSS стану задачі* i80286

0   0   1

0

Таблиця локальних дескрипторів LDT

0   0   1

1

Зайнятий сегмент TSS стану задачі i80286

1   0   0

1

Доступний сегмент TSS стану задачі i386+

1   0   1

0

Зарезервовано

1   0   1

1

Зайнятий сегмент TSS стану задачі* i386+

Вентилі***

0   1   0

0

Вентиль виклику i80286 {Call Gate)

0   1   0

1

Вентиль задачі i80286 (Task Gate)

0   1   1

0

Вентиль переривання i80286 (Interrupt Gate)

0   1   1

1

Вентиль пастки i80286 (Trap Gate)

1   1   0

0

Вентиль виклику i386 + (Call Gate)

1   1   0

1

Вентиль задачі i386 +(Task Gate)

1   1   1

0

Вентиль переривання i386 + (Interrupt Gate)

1   1   1

1

Вентиль пастки i386 + (Trap Gate)

Примітки: *На практиці такі сегменти стеку не використо­вуються.

** Підлеглі сегменти кодів подано у п. 3.2.4.

*** Інші стани полів Туре та А не використовуються.

Біт звернення А. У сегментах коду і даних А = 0 озна­чає, що до сегмента не було звернень. У системних об'єктах поле Туре разом з бітом А визначає тип системного об'єкта (див. табл. 3.6).

У старшій тетраді шостого байта дескриптора знаходяться такі біти керування:

G (Granularity) — біт гранулярності. Якщо G = 0, одини­цею пам'яті в сегменті є байт, а якщо G = 1, — сторінка завдовжки 4 Кбайт;

D (Default size) — біт розміру. Якщо D = 0, операнди в пам'яті вважають 16-розрядними, а якщо D = 1, — 32-розрядними. Застосовується для сумісності з МП i80286;

U (User) біт користувача. Може бути встановлений або відбутися скидання програмно.

Як видно з опису дескриптора, 32-розрядний МП дозволяє створювати сегменти, в яких можуть виконуватися операції зчитування, читання-записування, виконання або виконання-зчитування. Для створення характерних для МП i8086 сег­ментів, у яких виконуються одночасно всі перелічені опе­рації, використовують перекриття сегментів пам'яті, тобто початкова адреса одного сегмента є адресою іншого