Організація пам'яті
Фізична пам'ять, до якої мікропроцесор має доступ по шині адреси (див. рис. 1.2), називається оперативною пам'яттю (або оперативним запам'ятовувальним пристроєм — ОЗУ). На самому нижньому рівні пам'ять комп'ютера можна розглядати як масив бітів. Один біт може зберігати значення 0 або 1. Для фізичної реалізації бітів і роботи з ними ідеально підходять логічні схеми. Але мікропроцесору незручно працювати з пам'яттю на рівні бітів, тому реально ОЗУ організоване як послідовність комірок — байтів. Один байт складається з 8 біт. Кожному байту відповідає своя унікальна адреса (його номер), називаний фізичним. Діапазон значень фізичних адрес залежить від розрядності шини адреси мікропроцесора. Для i486 і Pentium він перебуває в межах від 0 до 232 – 1
(4 Гбайт).
Механізм керування пам'яттю повністю апаратний. Це означає, що програма не може сама сформувати фізичну адресу пам'яті на адресній шині. Їй доводиться «грати» за правилами мікропроцесора. Що це за правила, ми довідаємося трохи нижче. Поки ж відзначимо, що в остаточному підсумку цей механізм дозволяє забезпечити:
компактність зберігання адреси в машинній команді;
гнучкість механізму адресації;
захист адресних просторів завдань у багатозадачній системі;
підтримку віртуальної пам'яті.
Мікропроцесор апаратно підтримує кілька моделей використання оперативної пам'яті:
сегментовану модель. У цій моделі пам'ять для програми ділиться на безперервні області пам'яті (сегменти), а сама програма може звертатися тільки до даних, які перебувають у цих сегментах;
сторінкову модель. Її можна розглядати як надбудову над сегментованою моделлю. У випадку використання цієї моделі оперативна пам'ять розглядається як сукупність блоків фіксованого розміру 4 Кбайт. Основне застосування цієї моделі пов'язане з організацією віртуальної пам'яті, що дозволяє операційній системі використовувати для роботи програм простір пам'яті більший, ніж обсяг фізичної пам'яті. Для мікропроцесорів i486 і Pentium розмір можливої віртуальної пам'яті може досягати 4 Тбайт (терабайт).
Особливості використання й реалізації цих моделей залежать від режиму роботи мікропроцесора:
Режим реальних адрес, або просто реальний режим. Це режим, у якому працював i8086. Наявність його в i486 і Pentium обумовлене тим, що фірма Intel намагається забезпечити в нових моделях мікропроцесорів функціонування програм, розроблених для ранніх моделей мікропроцесорів.
Захищений режим. Цей режим дозволяє максимально реалізувати всі архітектурні ідеї, закладені в моделі мікропроцесорів Intel, починаючи з i80286. Програми, розроблені для i8086 (реального режиму), не можуть функціонувати в захищеному режимі. Одна із причин цього зв'язана саме з особливостями формування фізичної адреси в захищеному режимі.
Режим віртуального 8086. Перехід у цей режим можливий, якщо мікропроцесор уже перебуває в захищеному режимі. Відмінною рисою цього режиму є можливість одночасної роботи декількох програм, розроблених для i8086. Незважаючи на те, що мікропроцесор перебував у захищеному режимі, у режимі віртуального i8086 можлива робота програм реального режиму. Це пояснюється тим, що процес формування фізичної адреси для цих програм проводиться за правилами реального режиму.
Розглянемо поки тільки особливості роботи з оперативною пам'яттю для реального режиму, у якому підтримується тільки сегментована модель організації пам'яті. Усі питання, пов'язані із захищеним режимом, і, зокрема, особливості організації пам'яті в цьому режимі розглянемо пізніше.
Сегментована модель пам'яті
Спочатку постараємося формально визначити фундаментальні поняття сегмента й сегментації.
Сегментація — механізм адресації, що забезпечує існування декількох незалежних адресних просторів як у межах одному завдання, так і в системі в цілому для захисту завдань від взаємного впливу. В основі механізму сегментації лежить поняття сегмента, який являє собою незалежний, підтримуваний на апаратному рівні блок пам'яті.
Коли ми розглядали сегментні регістри, то відзначали, що для мікропроцесорів Intel, починаючи з i8086, прийнятий особливий підхід до керування пам'яттю.
Кожна програма в загальному випадку може складатися з будь-якої кількості сегментів, але безпосередній доступ вона має тільки до трьох основним: коду, даних і стека, — і від одного до трьох додаткових сегментів даних. Програма ніколи не знає, по яких фізичних адресах будуть розміщені її сегменти. Цим займається операційна система. Операційна система розміщає сегменти програми в оперативній пам'яті по певних фізичних адресах, після чого поміщає значення цих адрес у певні місця. Куди саме, залежить від режиму роботи мікропроцесора. Так, у реальному режимі ці адреси містяться безпосередньо у відповідні сегментні регістри, а в захищеному режимі вони розміщаються в елементи спеціальної системної дескрипторній таблиці. Усередині сегмента програма звертається до адрес відносно початку сегмента лінійно, тобто починаючи з 0 і закінчуючи адресою, рівним розміру сегмента. Ця відносна адреса, або зсув, який мікропроцесор використовує для доступу до даних усередині сегмента, називається ефективним.
Розглянемо порядок формування фізичної адреси в реальному режимі. Порядок формування фізичної адреси в захищеному режимі ми розглянемо пізніше. Під фізичною адресою розуміється адреса пам'яті, видаваний на шину адреси мікропроцесора (див. рис. 1.2). Інша назва цієї адреси — лінійна адреса. Ця подвійність у назві обумовлена наявністю сторінкової моделі організації оперативної пам'яті. Ці назви є синонімами тільки при відключенні сторінкового перетворення адреси (у реальному режимі сторінкова адресація завжди відключена). Сторінкова модель, як ми відзначили вище, є надбудовою над сегментованою моделлю. У сторінковій моделі лінійна адреса й фізична адресу мають різні значення. Трохи нижче ми будемо обговорювати рис. 2.3, на якому показаний порядок формування адреси в реальному режимі роботи мікропроцесора. Зверніть увагу на наявність у цій схемі пристрою сторінкового перетворення адреси. Цей пристрій призначений для того, щоб сполучити дві принципово різні моделі організації оперативної пам'яті й видати на шину адреси дійсне значення фізичної адреси пам'яті.
Формування фізичної адреси в реальному режимі
У реальному режимі механізм адресації фізичної пам'яті має наступні характеристики:
діапазон зміни фізичної адреси від 0 до 1 Мбайт. Ця величина визначається тим, що шина адреси і8086 мала 20 ліній;
максимальний розмір сегмента 64 Кбайт. Це пояснюється 16- розрядною архітектурою i8086. Неважко підрахувати, що максимальне значення, яке можуть містити 16-розрядні регістри, становить 216 - 1, що стосовно до пам'яті й визначає величину 64 Кбайт;
для звертання до конкретної фізичної адреси оперативної пам'яті необхідно визначити адресу початку сегмента (сегментну складову) і зсув усередині сегмента. Але ми пам'ятаємо, що сегментна складова адреси (або база сегмента) являє собою всього лише 16-бітне значення, поміщене в один із сегментних регістрів. Максимальне значення, яке при цьому виходить, відповідає 216 - 1. Якщо так міркувати, то виходить, що адреса початку сегмента може бути тільки в діапазоні 0-64 Кбайт від початку оперативної пам'яті. Виникає питання про те, як адресувати іншу частину оперативної пам'яті аж до 1 Мбайт із урахуванням того, що розмір самого сегмента не перевищує 64 Кбайт. Справа в тому, що в сегментному регістрі зберігаються тільки старші 16 біт фізичної адреси початку сегмента. Відсутні молодші чотири біти 20-бітної адреси виходять зсувом значення в сегментному регістрі вліво на 4 розряди. Ця операція зсуву виконується апаратно й для програмного забезпечення абсолютно прозора. Отримане 20-бітне значення і є справжньою фізичною адресою, що відповідає початку сегмента. Що стосується другого компонента, що брало участь в утворі фізичної адреси деякого об'єкта в пам'яті, — зсуву, — те воно являє собою 16-бітне значення. Це значення може втримуватися явно в команді або побічно в одному з регістрів загального призначення. У мікропроцесорі ці дві складові складаються на апаратному рівні, у результаті чого виходить фізична адреса пам'яті розмірністю 20 біт. Даний механізм утворення фізичної адреси дозволяє зробити програмне забезпечення переміщуваним, тобто не залежним від конкретних адрес завантаження його в оперативній пам'яті. Він показаний на рис. 2.3.
Рис. 2.3. Механізм формування фізичної адреси в реальному режимі
На рис. 2.3 добре видне, як формується деяка цільова фізична адреса: сегментна частина зчитується з одного із сегментних регістрів, зрушується на чотири розряди вліво й підсумується зі зсувом. У свою чергу, видно, що значення зсуву можна одержати мінімум з одного й максимум із трьох джерел: зі значення зсуву в самій машинній команді й (або) із умісту одного базового й (або) одного індексного регістру. Кількість джерел, що бере участь у формуванні зсуву, визначається кодуванням конкретної машинної команди, і якщо таких джерел декілька, то значення в них складаються. На закінчення помітимо, що не варто хвилюватися щодо того, що існує невідповідність розмірів шини адреси мікропроцесора i486 або Pentium (32 біта) і 20-бітного значення фізичної адреси реального режиму. Поки мікропроцесор перебуває в реальному режимі, старші 12 ліній шини адреси попросту недоступні, хоча за певних умов і існує можливість роботи з першими 64 Кбайт оперативної пам'яті, що лежать відразу після першого мегабайта.
Недоліки такої організації пам'яті:
сегменти безконтрольно розміщаються з будь-якої адреси, кратного 16
( тому що вміст сегментного регістру апаратно зміщається на 4 розряду). Як наслідок, програма може звертатися по будь-яких адресах, у тому числі й реально не існуючим;
сегменти мають максимальний розмір 64 Кбайт;
сегменти можуть перекриватися з іншими сегментами.
Бажанням увести в архітектуру засоби, які дозволяють позбутися зазначених недоліків, зокрема, і обумовлена поява захищеного режиму(див. пізніше).
