Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kursova_Klimyuk(1).doc
Скачиваний:
6
Добавлен:
13.09.2019
Размер:
314.37 Кб
Скачать

1.4 Захист по привілеях

    Специфічною особливістю захищеного режиму є захист по привілеях. У процесорі є два рівні захисту: захист на рівні сегментів і захист на рівні сторінок.

Захист на рівні сегментів

Захист на рівні сегментів представлений ​​чотирма рівнями привілеїв. Найбільш привілейованих нульовий рівень, найменш привілейованих - третій. У реальних операційних системах звичайно не використовуються всі чотири рівні. UNIX та Windows, наприклад, використовують тільки два рівні привілеїв - 0 (для ядра системи) і 3 (для всього іншого), а OS / 2 використовує рівні 0 (для ядра системи), 2 (для процедур введення-виведення) і 3 (для прикладних програм).

Для опису механізму захисту користуються такими поняттями:     Рівень привілеїв дескриптора (Descriptor Privilege Level: DPL) - рівень привілеїв, на який поміщений описуваний дескриптором об'єкт. Поле DPL зберігається в байті прав доступу дескриптора.

Поточний рівень привілеїв (Current Privilege Level: CPL) - рівень привілеїв виконуваного сегмента коду. Це значення відповідає DPL сегменту коду. Значення CPL зберігається в полі RPL селектора сегмента коду, який поміщений в регістр CS.

Запитуваний рівень привілеїв (Requested Privilege Level: RPL) - використовується для тимчасового зниження свого рівня привілеїв при зверненні до пам'яті. RPL заноситься в молодші біти селектора.

Рівень привілеїв введення-виведення (Input / Output Privilege Level: IOPL) - вказує який рівень привілейований для роботи з портами вводу-виводу. Це значення зберігається в регістрі EFLAGS і може бути різним для різних завдань.

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

До цих командам відносяться:

• HLT - зупинка процесора;

• CLTS - скидання прапорця Task Switched (використовується при управлінні мультизадачністю);

• LIDT, LGDT, LLDT - завантаження регістрів дескрипторних таблиць;

• LTR - завантаження регістра завдання;

• LMSW - завантаження молодшого слова регістра CR0;

• MOV CRx, reg32 - робота з керуючими регістрами;

• MOV DRx, reg32 - робота з регістрами відладки;

а також команди роботи зі специфічними регістрами (TRx - для 386,486; MCRs - для Pentium і P6; MTRRs - для P6). Слід зазначити, що команда POPFD також чутлива до рівня привілеїв. Вона не змінює стан керуючих прапорців IOPL, IF та ін., якщо виконується на рівні привілеїв, відмінному від нульового.

Крім безумовно привілейованих команд є команди чутливі до рівня привілеїв вводу-виводу. Це команди роботи з портами (IN, INS, OUT, OUTS) та команди скидання / установки прапорця дозволу переривань (CLI, STI). Ці команди виконуються тільки в тому випадку, якщо CPL <= IOPL. Якщо ця умова не виконується, то для команд вводу-виводу проводиться додаткове співставлення з картою дозволу портів вводу-виводу. Якщо код не має привілеїв на виконання команди, то виникає порушення загального захисту (виняток # 13).

Другий аспект захисту - захист доступу до даних. Код має право звернутися до даних, які знаходяться на тому ж або на більш низькому рівні привілеїв. При цьому враховується не тільки CPL, але і RPL. Дані доступні, якщо дескриптор сегмента даних має

DPL> = max (CPL, RPL).

Такий контроль здійснюється при завантаженні селекторів в сегментні регістри (DS, ES, FS, GS). У сегментний регістр можна завантажити лише селектор доступного з поточного рівня привілеїв сегмента даних або, якщо сегментний регістр не буде використовуватися, порожній селектор. Спроба порушити правило привілеїв або завантажити селектор системного дескриптора або дескриптора сегмента коду тільки для виконання в сегментний регістр даних призведе до порушення загального захисту (виняток # 13). Крім того, в командах зміни даних у пам'яті проводиться перевірка на можливість запису в сегмент.

Особливе правило привілеїв для сегментів стека. Стек повинен знаходитися строго на тому ж рівні привілеїв, що і код програми (DPL = CPL). При цьому сегмент стека обов'язково повинен бути присутнім (P = 1) і для нього повинні бути доступні операції і читання, і запису (типи Data Read-Write або Stack Read-Write).

Для захисту сегментів коду використовується жорстке правило привілеїв:

DPL = CPL.

Тобто міжсегментні команди FAR JMP і FAR CALL можуть передавати управління сегментами коду в межах того ж рівня привілеїв. Винятком є ​​підлеглі сегменти коду. При передачі управління підлеглому сегменту діє правило:

DPL> = max (CPL, RPL).

Однак при цьому підлеглий код виконуватиметься на тому ж рівні привілеїв, що і код, який викликав його (CPL не зміниться).

Для передачі управління між рівнями привілеїв використовуються системні дескриптори, звані шлюзами виклику. Дескриптор шлюзу виклику містить точку входу в привілейовану процедуру (селектор: зміщення) і число переданих їй через стек параметрів. Для передачі управління привілейованій процедурі адресується не сама процедура, а шлюз до неї. Шлюзи можна адресувати тільки в команді FAR CALL, тобто "Назовсім" змінити рівень привілеїв таким способом не можна, завжди передбачається повернення на більш низький рівень привілеїв. Правило дозволу виклику через шлюз виглядає так: DPL цілі <= max (CPL, RPL) <= DPL шлюзу.

Приклади дозволених переходів показані на рис. 1.9.

Рис. 1.9 Дозволені переходи

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

(Таким чином, при зміні рівнів привілеїв в процесорах Intel x86 реалізовано угоду про зв'язки мови Pascal.)

На рис. 1.10 показаний приклад перемикання стека PL3 => PL0 з передачею трьох параметрів.

  

Рис. 1.10 Перемикання стека PL3 => PL0

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]