користувача операційна система повинна сформувати таблицю сегментів. Кожний елемент таблиці сегментів містить описувач (дескриптор) сегменту (поля бази, межі і індикаторів режиму доступу). За відсутності сторінкової організації поле бази визначає адресу початку сегменту в основній пам'яті, а межа – довжину сегменту. За наявності сторінкової організації поле бази визначає адресу початку таблиці сторінок даного сегменту, а межа – число сторінок в сегменті. Поле індикаторів режиму доступу є деякою комбінацією ознак блокування читання, запису і виконання.
Таблиці сегментів різних користувачів операційна система зберігає в основній пам'яті. Для визначення розташування таблиці сегментів програми, що виконується, використовується спеціальний регістр захисту, який завантажується операційною системою перед початком її виконання. Цей регістр містить дескриптор таблиці сегментів (базу і межу), причому база містить адресу початку таблиці сегментів програми, що виконується, а межа – довжину цієї таблиці сегментів. Розряди номера сегменту віртуальної адреси використовуються як індекс для пошуку в таблиці сегментів. Таким чином, наявність базово-граничних пар в дескрипторі таблиці сегментів і елементах таблиці сегментів запобігає можливості звертань програми користувача до таблиць сегментів і сторінок, з якими вона не зв'язана. Наявність в елементах таблиці сегментів індикаторів режиму доступу дозволяє здійснити необхідний режим доступу до сегменту з боку даної програми. Для підвищення ефективності схеми використовується асоціативна кеш-пам'ять.
Відзначимо, що в описаній схемі сегментації таблиця сегментів з індикаторами доступу надає всім програмам, що є частинами деякої задачі, однакові можливості доступу, тобто вона визначає єдину область (домен) захисту. Проте для створення захищених підсистем в рамках однієї задачі для того, щоб змінювати можливості доступу, коли точка виконання переходить через різні програми, що управляють її рішенням, необхідно пов'язати з кожною задачею безліч доменів захисту. Реалізація захищених підсистем вимагає розробки деяких спеціальних апаратних засобів.
Розглянемо суть захищеного режиму, трохи докладніше розглянемо організацію пам'яті в захищеному режимі і поговоримо про концепції захисту.
Історія організації пам'яті
Ранні моделі процесорів від Intel мали 16 біт шини даних і 20 біт шини адреси. Це накладало певні обмеження на адресацію пам'яті, бо 16-бітний регістр неможливо було використовувати для адресації більш ніж 64 кілобайтів пам'яті. Щоб обійти цю перешкоду розробники передбачили сегментні регістри. Сегментний регістр зберігає в собі старші 16 біт адреси і для отримання повної адреси до сегментної адреси додається зсув в сегменті.
19 | 15 | 8 | 4 | 0
Сегмент
Зсув
Лінійна адреса
Таким чином, стало можливим адресувати до 1 мегабайта пам'яті. Це ж дозволило робити програми не настільки прив'язаними до пам'яті і спростило адресацію. Сегменти можуть починатися з будь-якої адреси, кратної 16 байтам, ці 16-байті блоки пам'яті одержали назву параграфів. Але це й створює певні незручності. Перша незручність полягає в тому, що на одну адресу пам'яті вказує 4096 різних комбінацій сегмент/зсув. Друга незручність полягає в тому, що немає можливості обмежити програмам доступ до тих або інших частин пам'яті, що в деяких випадках може бути істотно. Введення захищеного режиму розв'язало ці проблеми, але ради сумісності будь-який з сучасних процесорів може працювати в реальному або віртуальному режимі процесора i8086.
Захист
Для забезпечення надійної роботи операційних систем і прикладних програм розробники процесорів передбачили в них механізми захисту. В процесорах фірми Intel передбачено чотири рівні привілеїв для програм і даних. Нульовий рівень вважається найбільш привілейованим, третій рівень – найменш.
Так само в захищеному режимі зовсім інакше працює механізм перетворення адрес. В сегментному регістрі тепер зберігаються не старші біти адреси, а селектор. Селектор представляє з себе індекс в таблиці дескрипторів. І окрім цього містить в собі декілька службових біт. Формат селектора такий:
15 | 2 | 0
Index | TI | RPL
Поле Index визначає індекс в дескрипторній таблиці.
У процесорах Intel одночасно в системі може існувати дві дескрипторні таблиці: Глобальна (Global descriptor table або GDT) і Локальна (Local descriptor table або LDT).
GDT існує в єдиному екземплярі. Адреса і межа GDT зберігаються в спеціальному системному регістрі (GDTR) в 48 біт завдовжки (6 байт).
LDT може бути індивідуальна для кожної задачі, або загальна для системи, або ж її взагалі може не бути. Адреса і розмір LDT визначається в GDT, для звернення до LDT в процесорі існує спеціальний регістр (LDTR), але на відміну від GDTR він має розмір 16 біт і містить в собі селектор з GDT.
Поле TI (Table indicator) селектора визначає приналежність селектора GDT (0) або LDT (1).
Дескриптори сегментів
Дескрипторні таблиці складаються із записів по 64 біти (8 байт) в кожній. Формат дескриптора такий:
7 | 6 | 5 | 4
Базова адреса 31-24 | Межа 19-16 | Права доступу | Базова адреса 23-16
3 | 2 | 1 | 0
Базова адреса 15-0 | Межа 15-0
Відразу впадає в очі дуже дивна організація дескриптора, але це пов'язано з сумісністю з процесором i286, формат дескриптора в якому був такий:
7 | 6 | 5 | 4
Зарезервовано | Права доступу | Базова адреса 23-16
3 | 2 | 1 | 0
Базова адреса 15-0 | Межа 15-0
Що ж міститься в дескрипторі:
Базова адреса – 32 біти (24 біти для i286). Визначає лінійну адресу пам'яті, з якої починається сегмент. На відміну від реального режиму ця адреса може бути вказаний з точністю до байта.
Межа – 20 біт (16 біт для i286). Визначає розмір сегменту (максимальна адреса, по якій може бути проведене звертання). 20-бітне поле може показатися не дуже то великим для 32-х бітового