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

Захист на рівні сторінок

Захист сторінок забезпечується двома рівнями привілеїв: супервізор і користувач. Рівню супервізора відповідають 0-й, 1-й, 2-й рівні привілеїв сегментів, а рівню користувача - 3-й. Для кожної сторінки вказується (в PDE / PTE), з якого рівня привілеїв вона доступна. Правило привілеїв таке: з рівня супервізора доступні всі сторінки, а з рівня користувача - лише сторінки з бітом U / S = 1. Крім того, в PDE / PTE вказується тип доступу до сторінки (чи доступна сторінка для запису): R / W = 0 - тільки читання, R / W = 1 - доступні читання і запис. Слід зазначити дію біта 16 (Write Protect) в регістрі CR0. Коли цей біт виставлений, сторінки рівня користувача з позначкою "read-only" захищені від запису при зверненнях з рівня супервізора.

1.5 Мультизадачність

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

Для управління мультизадачністю немає спеціальних команд. Завдання перемикаються командами FAR CALL, FAR JMP, INT, IRET. Однак при цьому беруть участь спеціальні дескриптори: дескриптор сегмента стану завдання (Task State Segment) і дескриптор шлюзу завдання. Коли управління передається на один з таких дескрипторів, відбувається перемикання завдання. При перемиканні завдання процесор зберігає (відновлює) свій контекст у сегменті стану завдання (TSS). Селектор TSS виконуваного завдання зберігається в регістрі завдання (Task Register). При перемиканні завдання процесор може змінити LDT, що дозволяє призначити кожному завданню свій адресний простір, недоступний для інших завдань. Можна також перевантажити CR3 (PDBR / PDPTR), що дозволяє застосувати для ізолювання завдань механізм сторінкового перетворення.

При перемиканні задачі за допомогою переривання або особливого випадку відбувається автоматичне повернення до перерваної задачі. Проте, організовуючи вкладення завдань, необхідно пам'ятати, що, на відміну від процедур, завдання не є реєнетрантними, так як при перемиканні завдання в стек нічого не включається. Дескриптор TSS завдання, що виконується в даний момент, позначається як "зайнятий". При перемиканні на іншу задачу з вкладенням (по INT або FAR CALL) Дескриптор TSS залишається позначеним. Переключитися на зайняту задачу не можна (виникає порушення загального захисту - виключення # 13).

Для перемикання завдань також діють правила привілеїв. За командою JMP або CALL можна переключитися на завдання, TSS якої менш привілейований:

DPLTSS> = max (CPL, RPL).

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

Не зовсім зручно адресувати саме TSS для перемикання завдання, тому що, по-перше, TSS можуть бути розміщені тільки в GDT (а в IDT або LDT - ні), а, по-друге, якщо користуватися тільки TSS, то кожне завдання ми "намертво" прив'язуємо до певного рівня привілеїв (DPLTSS), з якого вона доступна для перемикання. Цих недоліків позбавлені шлюзи завдання. Шлюз задачі містить селектор TSS. Шлюзи завдань можна розміщувати і в IDT, що дозволяє виконувати обробники переривань у вигляді окремих завдань, і в LDT, що дозволяє більш гнучко управляти перемиканням завдань: для другого завдання перша може бути видно з одного рівня привілеїв, а для третьої - з іншого. Остання можливість забезпечується особливим правилом привілеїв: при перемиканні завдання через шлюз враховується тільки DPL шлюза, а DPLTSS не грає ролі, тому одному завданню може відповідати безліч шлюзів з різними DPL.

Слід зазначити, що при перемиканні завдання не зберігається контекст співпроцесора, тому що, по-перше, співпроцесора може взагалі не бути, а по-друге, багато завдань можуть не використовувати співпроцесор, а на збереження / відновлення його контексту йде багато часу. У процесорі передбачена можливість простої програмної реалізації перемикання завдання з урахуванням контексту співпроцесора. Справа в тому, що при перемиканні завдання процесор виставляє біт 3 (Task Switched) в регістрі CR0. Якщо нова задача далі не використовує співпроцесор, то нічого не відбувається. В іншому випадку, зустрівши команду співпроцесора, коли прапор TS = 1, процесор генерує особливий випадок співпроцесора (виняток # 7). Оброблювач цього виключення може зберегти / відновити контекст співпроцесора, скинути прапорець TS (командою CLTS) і відновити перервану задачу.

Лише значення перших 68h байт сегмента стану завдання строго визначені. Саме це число є мінімальним розміром TSS. Операційна система може на свій розсуд встановлювати розмір TSS і заповнювати сегмент даними. Вона, наприклад, може відвести в ньому місце під контекст співпроцесора. Крім того, в TSS може розташовуватися необов'язкова для завдання структура - двійкова карта дозволу введення виводу (I / O permission bit map). Її адреса задається в останньому обов'язковому полі TSS. Процесор звертається до цієї карти, коли IOPL не дозволяє виконувати інструкцію вводу-виводу. Кожен біт цієї карти відповідає одному порту вводу-виводу. Якщо біт скинутий в 0, то операція вводу-виводу виконується без порушення загального захисту, а якщо біт виставлений в 1, то генерується виключення # 13.

При перемиканні завдання процесор може продовжити виконання нового завдання в особливому стані - у стані емуляції 8086 (VM86). Перехід в цей стан ініціює встановлення в 1 прапорця 17 (Virtual Mode) в регістрі EFLAGS при відновленні контексту процесора з TSS. Особливістю цього стану є те, що лінійні адреси у такій задачі формуються за безселекторною схемою, тому захист на рівні сегментів фактично не використовується. Однак якщо включено сторінкове перетворення, то всі пов'язані з ним нюанси вірні та безпека на рівні сторінок працює. Для завдання в стані VM86 вважається, що CPL = 3, код і дані за умовчанням мають розмір 16 біт, межі всіх сегментів - 64Кбайт, адресується тільки нижній мегабайт лінійного простору.     Процесор може перейти в стан VM86 не тільки при перемиканні задач, але і якщо при поверненні з обробника переривань по IRET з стека відновлюється образ EFLAGS з бітом VM = 1. Повернення в звичайний стан відбувається з переривання або особливого випадку з перемиканням завдання або з переходом на нульовий рівень привілеїв. У системі може бути декілька завдань в стані VM86. Для їх ізолювання зручно використовувати сторінкове перетворення.  

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