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

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

Весь віртуальний адресний простір (4 Гбайти) розподіляється на блоки однакового розміру – сторінки. Переважно розмір сторінки становить 4 Кбайти. Сторінка може перебувати в оперативній пам’яті, в області свопінга або у виконуваному файлі процесу.

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

Лінійна адреса тлумачиться як складена з трьох частин:

1 поле адреси, з 22 по 31 біти, вказує на елемент каталога таблиць сторінок (Page Directory Entry, PDE). Каталог таблиць сторінок має довжину, дорівнювану одній сторінці, і вміщує до 1024 покажчиків на таблиці сторінок (Page Table). Перше поле адресує певну таблицю сторінок;

2 друге поле, яке посідає з 12 до 21 біти, вказує на елемент таблиці сторінок (Page Table Entry, PTE). Таблиці сторінок також мають довжину 4 Кбайти, а елементи таблиць адресують в сукупності 1024 сторінки. Друге поле адресує конкретну сторінку;

3 третє поле визначає зміщення на сторінці, воно посідає молодші 12 бітів лінійної адреси.

Отже, за допомогою одного каталога таблиць процес може адресувати 1024х1024х4096=4 Гбайти фізичної пам‘яті.

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

На рис. 3.2 зазначено, як блок сторінкового адресування транслює лінійну адресу до фізичної. Процесор використовує поле PDE адреси як індекс у каталозі таблиць. Віднайдений елемент, своєю чергою, вміщує адресу таблиці сторінок. Друге поле, PTE, лінійної адреси дозволяє процесові обрати потрібний елемент таблиці, котра адресує фізичну сторінку. Сума адрес початку сторінки, яка перебуває у третьому полі, і становить 32-бітову фізичну адресу. Кожен елемент таблиці сторінок також вміщує кілька полів (табл. 3.1).

Таблиця 3.1 – Поля РТЕ

Р

Ознака присутності в оперативній пам’яті. Доступ до сторінки, відсутньої у пам’яті (Р=0), спричинює помилку, особливу ситуацію, про що процесор інформує ядро, яке опрацьовує її у відповідний спосіб.

R/W

Права лише на читання сторінки (R/W=0) або на читання та запис (R/W=1).

U/S

Привілеї доступу. Якщо U/S=0, лише привілейовані завдання (ядро) мають доступ до адреси сторінки. Якщо U/S=1, доступ до сторінки мають усі завдання.

Адреса

Фізична адреса початку сторінки (адреса бази).

Адресний простір ядра зазвичай збігає з адресним простором виконуваного у тобто ядро розташовано у тому самому контексті, що й процес. Коли процесові передаються ресурси, система відновлює контекст завдання цього процесу. Контекст вміщує значення регістрів загального призначення, сегментних регістрів, покажчики на таблиці сторінок, що відбивають віртуальну пам’ять процесу в режимі завдання. В одночас, системний контекст не змінюється впродовж життя системи. Для процесорів фірми Intel адреса початку каталогу таблиць сторінок розміщується у спеціальному регістрі CR3.

Більшість сучасних процесорів розміщують дані про кілька останніх використовуваних ними сторінок у кеш-пам’яті. Лише коли процесор не відзнаходить потрібної сторінки в кеші, він звертається до каталога та таблиць сторінок. Як правило, 98...99% адресних посилань потрапляють до кеша, не потребуючи для транслювання адреси звертання до оперативної пам’яті, де розташовано каталог і таблиці.

Слід зауважити, що операційні системи фірми Microsoft, зокрема Windows, використовують сегментний та сторінковий способи транслювання адрес, а ОС UNIX – лише сторінковий.

Головними системними об’єктами, якими маніпулює процесор у захищеному режимі, є дескриптори. Дескриптори сегментів вміщують інформацію про рівень привілеїв відповідного сегмента коду або даних. Рівень привілею виконуваного завдання визначається значенням поля привілею, яке перебуває у дескрипторі його поточного кодового сегмента, поля DPL. Для поточного сегмента коду поле DPL стає полем СPL – поточним рівнем привілеїв. При звертанні до певного сегмента у відповідному селекторі зазначається запитуваний рівень привілеїв RPL (Requested Privilege Level). Це робить програміст через систему програмування; поле RPL, на відміну від DPL, може легко змінюватись.

У межах одного завдання використовуються сегменти з різним рівнем привілеїв, і в конкретні моменти часу виконуються або опрацьовуються сегменти з відповідними рівнями привілеїв. Механізм перевірки привілеїв працює в ситуаціях, які є міжсегментними переходами (звертаннями). Це є доступ до сегментів даних, стека, міжсегментні передавання керування при перериваннях, при використанні команд CALL, JMP, INT, IRET, RET. У таких звертаннях беруть участь два сегменти: один – сегмент цілі (до якого йде звертання), другий – з якого йде звертання. Поняття ефективного рівня привілеїв обмежує доступ до сегментів за такими правилами залежно від того, йде звертання до коду чи до даних. Ефективний рівень привілеїв EPL (Effective Privilege Level) визначається мінімальним привілеєм, тобто

EPL=max(RPL, DPL).

При доступі до сегментів даних перевіряється умова CPL≤EPL. У разі порушення умови виникає особлива ситуація помилки захисту – й вдбувається переривання. Рівень привілею сегмента даних, до якого йде звертання, має бути таким, як поточний, або менший за нього. Звертання до сегмента з більш високим рівнем привілею процесор сприймає як помилку, тому що є можливість змінення даних з високим рівнем привілеїв у програмі з низьким рівнем. Доступ до даних з меншим рівнем привілеїв дозволяється.

У разі звернення до сегмента стека перевіряється умова CPL= DPL= RPL. Якщо вона порушується – виникає вилучення. Передавання керування з високо привілейованого сегмента коду на менш привілейований потребує додаткового контролю, тобто код ОС не повинен довіряти кодові програми-додатка. Так само не можна дозволяти завданням можливості виконувати високо привілейований код, хоча потреба в цьому є завжди. Наприклад, багато функцій, в тому числі введення/виведення, є привілейованими й повинні виконуватись лише ОС. Для реалізації можливостей передавання керування у сегменти коду з іншими рівнями привілеїв введено механізм шлюзування.

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

Рисунок 3.3 – Механізм шлюзування для переходу до іншого рівня привілеїв.

На рис. 3.3 подано механізм шлюзування. Основна різниця поміж дескриптором сегмента та шлюзом полягає в тому, що вміст дескриптора вказує на сегмент у пам’яті, а шлюз звертається до дескриптора і є механізмом переспрямовування.

Для дістання дозволу на звертання до більш привілейованого коду завдання має звернутися до нього не безпосередньо шляхом зазначення дескриптора цього коду, а через звернення до шлюзу цього сегмента. На рис. 3.4 подано перехід на сегмент коду з більш високим привілеєм.

Рисунок 3.4 – Перехід на сегмент з більш високим привілеєм коду

У дескрипторі шлюзу замість адреси сегмента зазначається селектор, який допомагає віднайти дескриптор сегмента коду, до якого спрямовано звертання, і адресу, з якої буде виконуватись підлеглий сегмент. Дескриптори шлюзів не є дескрипторами сегментів, але можуть розташовуватись з-посеред них. Це надає менш привілейованим програмам можливості створювати неконтрольовані шлюзи. Користування шлюзом можливе за такими правилами:

  • значення DPL шлюзу виклику має бути більшим чи дорівнюваним значенню поточного рівня привілеїв CPL;

  • значення DPL шлюзу виклику має бути більшим дорівнюваним значенню RPL селектора шлюзу;

  • значення DPL шлюзу виклику має бути більшим чи дорівнюваним значенню DPL сегмента коду, до якого спряоване звертання;

  • значення DPL цільового сегмента коду має бути меншим чи дорівнюваним значенню поточного рівня привілеїв CPL.

Механізм шлюзування забезпечує такі переваги в організації середовища для виконання програм:

  • привілейований код є надійно захищений, і програми, що його викликають, не можуть його зіпсувати;

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

  • програма, що вона викликає системні функції, адресує лише шлюз виклику, тому самі функції можна змінити чи пересунути в адресному просторі, а інтерфейс зі шлюзом можна не змінювати;

  • програмні модулі викликаються з більш привілейованого рівня.

Основний ризик пов’язаний з передаванням керування через шлюз виклику більш привілейованій процедурі. Не можна передавати програмі, яка викликає функцію, жодних переваг, пов’язаних з тимчасовим підвищенням привілеїв. Якщо така програма передасть процедурі „погані” параметри, вона може порушити роботу процедури. Шлюз виклику не перевіряє значення параметрів, це робить процедура, приміром, лічильники циклів на максимальне й мінімальне значення, 8- та 16-бітові параметри, передавані у 32-розрядних регістрах тощо [1, 5].