Захищений режим функціонування процесорів

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

Основним захищається ресурсом є пам'ять.

Захист пам'яті заснована на сегментації, атрибутах і привілеїв.

Сегмент - це блок простору пам'яті. Максимальний розмір сегмента - 4 Гбайт. Сегменти пам'яті виділяються задачам операційною системою, але в реальному режимі, будь-яке завдання може перевизначити значення сегментних регістрів, які задають положення сегмента в просторі пам'яті, і «залізти» в чужу область даних або коду. У захищеному режимі сегменти теж розподіляються операційною системою, але прикладна програма зможе використовувати тільки дозволені для неї сегменти пам'яті, вибираючи їх за допомогою селекторів з попередньо сформованих таблиць дескрипторів сегментів.

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

# 159; використовувати сегменти не за призначенням (наприклад, намагатися трактувати область даних як коди інструкцій);

# 159; порушувати права доступу (намагатися модифікувати сегмент, призначений тільки для читання, звертатися до сегменту, не маючи достатніх привілеїв і т. п.);

# 159; змінювати вміст таблиць дескрипторів (тобто параметрів сегментів), не маючи достатніх привілеїв.

Чотирьохрівнева ієрархічна система привілеїв призначена для управління використанням привілейованих інструкцій і доступом до дескрипторів. Рівні привілеїв нумеруються від 0 до 3, нульовий рівень відповідає максимальним (необмеженим) можливостям доступу і відводиться для ядра операційної системи. Рівень 3 має самі обмежені права та постачається разом прикладних задач.

Дескриптори і таблиці

Глобальна таблиця (GDT) містить дескриптори, доступні всім завданням. Вона може містити дескриптори будь-яких типів, крім дескрипторів переривань і пасток. Нульовий елемент цієї таблиці процесором не використовується.

Локальна таблиця (LDT) може бути власної для кожного завдання і містить тільки дескриптори сегментів, шлюзи завдань і викликів. Сегмент недоступний задачі, якщо його дескриптора немає в поточний момент ні в GDT, ні в LDT.

Малюнок 3.10- Дескриптор сегмента даних

В атрибутах сегментів поля мають таке призначення:

# 159; A (Accessed) - звернення. А = 0 до сегменту не було звернення, А = 1 селектор даного сегмента завантажувався в регістр сегмента або для нього виконувалася команда тестування;

# 159; W (Writeable) - дозвіл (W = 1) або заборону (W = 0) записи даних в сегмент;

# 159; Е (Expand Down) -напрям розширення, Е = 0 вгору, Е = 1 розширення вниз (стек, у якого зміщення повинно перевищувати значення ліміту);

# 159; DPL (Descriptor Privilege Level) -прівілегіі сегмента;

# 159; Р (Present) - присутність в пам'яті. При Р = 1 сегмент відображений у фізичній пам'яті, при Р = 0 відображення немає;

# 159; В - визначає верхню межу сегмента, при В = 0 - 64 Кбайт, при В = 1 максимальний розмір сегмента 4 Гбайт.

Дескриптор сегмента коду показаний на малюнку 3.12. Ліміт вказує на його останній байт, а біти атрибутів приймають наступні значення:

# 159; З (Conforming, підпорядкованість або конформність). при С = 1 команда може виконуватися, якщо рівень привілеїв (CPL) не нижче рівня привілеїв дескриптора (DPL), при С = 0 (непідлегла сегмент) управління до даного сегменту може передаватися тільки, якщо CPL = DPL;

# 159; R (Readable) - дозвіл (R = 1) або заборону (R = 0) читання сегмента.

Для багатозадачних і багатокористувацьких операційних систем важлива здатність процесора до швидкого переключення виконуваних завдань. Операція перемикання завдань процесора (Task Switch Operation) зберігає стан процесора і зв'язок з попередньою завданням, завантажує стан нового завдання і починає її виконання.

Перемикання завдань виконується за інструкцією межсегментного переходу (JMP) або виклику (CALL), по апаратним і програмним перериванням і винятків.

Дескриптор TSS вказує на сегмент, що містить повне стан процесора (рисунок 3.12).

Дескриптор шлюзу завдання містить селектор, який вказує на дескриптор TSS.

Кожне завдання має TSS. Сегменти TSS містять образи регістрів процесора, роздільні покажчики стеків для рівнів привілеїв 0, 1 і 2, а також зворотне посилання на селектор TSS викликала завдання. Вільне поле TSS може використовуватися на розсуд ОС. Останнім елементом TSS повинен бути байт OFFh

Сторінкове управління пам'яттю

Сторінкове управління (Paging) є засобом організації віртуальної пам'яті з підкачкою сторінок за запитом (Demand-Paged Virtual Memory) і оперує з пам'яттю, як з набором сторінок однакового розміру. У момент звернення сторінка може бути присутнім в фізичної оперативної пам'яті, а може бути вивантажені на зовнішню (дискову) пам'ять. При зверненні до вивантажених сторінці пам'яті процесор виробляє виключення #PF - відмова сторінки, і програмний обробник виключень виконує свопинга - «підкачування» відсутньої сторінки з диска. Сторінки не мають прямого зв'язку з логічною структурою даних або програм.

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

Захищений режим функціонування процесорів
Малюнок 3.12 - Сегмент стану завдання

процесор введений буфер асоціативної трансляції TLB (Translation Look aside Buffer) який зберігає інтенсивно використовуваних рядків таблиць.

У процесорах TLB є двоканальний набірний-асоціативний кеш на 32 рядки таблиць трансляції. Такий розмір дозволяє зберігати інформацію про трансляцію 128 Кбайт пам'яті, що дає коефіцієнт кеш-влучень 98%, тобто тільки 2% звернень до пам'яті вимагають додаткових звернень до таблиць. У процесорі Pentium є роздільні TLB для інструкцій і даних, а в Р6 буфери розділені ще й за розміром обслуговуються сторінок (4 Кбайт і 2 Мбайт / 4 Мбайт).

31 12 11 9 8 7 6 5 4 3 2 1 0