Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операцiйнi системи та середовища6.05.07(Антонов...doc
Скачиваний:
11
Добавлен:
04.05.2019
Размер:
801.79 Кб
Скачать

3 Захищений режим 32-розрядних процесорів

3.1 Основні поняття захищеного режиму

Захищений режим (Protected Virtual Address Mode) – основний режим роботи 32-розрядних процесорів. У цьому режимі процесор використовує лінійну модель пам’яті й може адресувати 4 Гбайти фізичної пам’яті. При використанні ж віртуальної пам’яті для кожного процесу в захищеному режимі можна відбивати до 64 Тбайтів, а середньостатистична кількість одночасно присутніх в ОС завдань сягає 80. Врешті, режим віртуального процесора 8086 (v86) – це особливий стан задання віртуального режиму, в якому процесор функціонує як 8086 з можливістю використання 32-розрядних адрес та операндів.

Захищений режим призначено для забезпечення незалежності виконання кількох завдань, як ОС, так і додатків, що потребує захисту ресурсів одного завдання від впливу іншого. Головним ресурсом, який захищається, є пам’ять, в якій зберігаються коди, дані, системні таблиці, наприклад таблиця векторів переривань тощо. Захищати доводиться апаратуру, до якої є доступ через переривання та команди введення/виведення.

У захищеному режимі процесор апаратно зреалізовує безліч функцій захисту, необхідних для побудови супервізора багатозадачної ОС, в тому числі й віртуальної пам‘яті [1, 5].

3.2 Сегментний механізм віртуалізації пам’яті

У мікропроцесорах фірми Intel та ОС фірми Microsoft, орієнтованих на Intel-сумісні процесори, зорганізовування пам’яті грунтується на сегментуванні за максимального розміру сегмента 4 Гбайти. ОС надає завданням сегменти, але в реальному режимі кожне завдання може перевизначити сегментні регістри, які задають початок сегментів у пам’яті й, тим самим, увірватися до чужої область даних чи коду.

Наприклад, команда:

MOV ES: [BX],DX

надає таку нагоду.

У захищеному режимі сегменти також розподіляються ОС, але додаток може дістати дозвіл від неї лише на ті сегменти пам’яті, які мають дескриптори в таблицях дескрипторів сегментів. Наприклад, у фрагменті програми мовою асемблера:

START: MOV AX,DATA ; cуміщення

MOV DS,AX ; сегментів

MOV ES,AX ; даних

ОС сама замість символьної змінної DATA підставить значення початку сегментів у вільній області пам’яті. У сегментні регістри програмно завантажуються 16-розрядні селектори, за допомогою яких з таблиць будуть обиратися дескриптори (описувачі) сегментів.

Селектор має поля INDEX, TI та RPL.

15

0

INDEX вказує на дескриптор сегмента, що вміщує параметри: розташування у пам’яті, розмір, права доступу.

ТІ=1 вказує на локальну дескрипторну таблицю, а ТІ=0 – на глобальну.

Якщо сегментний регістр не використовується, то в нього завантажується нульовий селектор сегмента. Спроба звертання за таким сегментним регістром викликає програмне вилучення. При завантаженні нульового селектора у регістр CS або SS також виникає вилучення.

Поле RPL вказує на потрібний рівень привілеїв.

Захист пам’яті за допомогою сегментування не дозволяє:

  • використовувати сегменти не за призначенням, наприклад, трактувати коди інструкцій як дані й навпаки;

  • порушувати права доступу (намагатися змодифіковувати сегмент, призначений дише для читання, звертатися до сегмента без достатніх привілеїв тощо;

  • адресувати елементи, котрі виходять за межі сегмента;

  • змінювати вміст таблиць дескрипторів без достатніх привілеїв.

Якщо процес, перебуваючи в режимі завдання, спробує звернутись до сегмента, який належить ядру, процесор згенерує апаратне вилучення, а ядро відправить процесові відповідний сигнал.

Рисунок 3.1 – Транслювання адреси з використанням механізму сегментації

На рис. 3.1 подано сегментний спосіб транслювання адреси. LDT – локальна дескрипторна таблиця, забезпечує транслювання віртуальних адрес сегментів процесу; GDT – глобальна дескрипторна таблиця, забезпечує транслювання віртуальних адрес сегментів ядра, наприклад при опрацьовуванні системного виклику чи переривання. Для кожного процесу створюється власна LDT, а GDT використовується усіма процесами і створюється при завантаженні ОС.

Кожен запис до LDT чи GDT є дескриптором сегмента, який може бути кількох типів: коду, стека, даних. Дескриптори у GDT забезпечують багатозадачність, передавання керування від процесу до ядра (шлюзи). Заповнює таблиці дескрипторів ядро, а процесор виконує відбивання адрес на апаратному рівні.

Лінійна адреса обчислюється як сума базової адреси сегмента, що зберігається в дескрипторі з глобальної та локальної таблиць, та зміщення у віртуальній адресі; тлумачиться як фізична адреса й використовується для адресування фізичної пам’яті.

У кожній локальній дескрипторній таблиці є інформація про поточне розташування сегмента в оперативній пам’яті або на твердому диску, що ідентифікується за допомогою „біта присутності” (Present). Якщо біт встановлено, то в поле „адреса” рядка LDT диспетчер записує адресу, з якої сегмент розпочинається, а в полі „довжина сегмента” зазначається кількість адресованих комірок пам’яті. У спеціальних бітах встановлюються права доступу сегмента та позначення про звернення до даного сегмента.

Оскільки в оперативній пам’яті можна розміщувати лише ті сегменти, з якими даного часу працює ОС, загальний обсяг віртуального простору адрес є більший, аніж фізичний, і є можливе розміщення в пам‘яті більшої кількості завдань одночасно. Це призводить до збільшення коефіцієнта мультипрограмування і до більш ефективного використання ресурсів.

Реалізація віртуальної пам’яті на підставі лише сегментування не є гнучкою. Сегмент може або бути цілковито присутнім в оперативній пам’яті, або перебувати в зовнішній пам’яті, чи у виконуваному файлі. У багатозадачному режимі за великого розміру сегмента одночасне виконання кількох великих процесів зумовить конкуренцію за ресурси пам’яті та інтенсивний обмін даними поміж оперативною пам’яттю та твердим диском. Обмін сегментами різного розміру призведе до фрагментування та незначної ефективності використання пам’яті.