Лекція №5
Дозвіл та заборона сегментів. Поля та прапорці захисту сегментів та сторінок. Рівні привілеїв та їх перевірка. Комбінування сегментного та сторінкового захистів.
Встановлення прапорця PE в регістрі CR0 призводить до переключення процесора в захищений режим, причому відбувається увімкнення механізму захисту сегментів. Не існує контрольного біту для встановлення або відключення захисту. Та частина механізму захисту сегментів, що базується на рівнях привілеїв буде відключена, доки в захищеному режимі не відбудеться приєднання всім сегментним селекторам і сегментним дескрипторам рівня привілеїв 0. Ця дія відключає захисний бар’єр між сегментами, але інший захист, такий як перевірка лімітів і первірка типів працювати будуть.
Захист рівня сторінки включається автоматично, коли сорінкова організація дозволена. Не існує біту для відключеня захисту рівня сторінки. Але, захист рівня сторінки може бути відключений шляхом виконання наступних операцій:
очистки прапорця WP в керуючому регістрі CR0
встановлення прапорців read/write(r/w) i user/superuser(u/s) для кожного входження в список сторінок(page directory) і таблицю сторінок(page-table)
Механізм захисту процесора використовує наступні поля і прапорці в
системних структурах даних для керування доступом до сегментів і сторінок:
Тип дескриптора(S) – біт 12 в 2-му подвійному слові сегментного десктиптора. Визначає, чи використовується сегментний дескриптор для системного сегменту, чи для сегменту кода або даних.
Поле типу - біти з 8 по 11 в 2-му подвійному слові сегментного десктиптора. Визначає тип коду, даних або системного сегменту
Поле обмеження - біти з 0 по 15 в 1-му подвійному слові і біти з 16 по 19 в 2-му подвійному слові сегментного десктиптора. Визначає розмір сегмента.
G – прапорець - біт 23 в 2-му подвійному слові сегментного десктиптора. Визначає розмір сегмента разом з полем обмеження і прапорцем E
E – прапорець - біт 10 в 2-му подвійному слові сегментного десктиптора. Визначає розмір сегмента разом з полем обмеження і прапорцем G
Поле рівня привілеїв десктиптора(Descriptor privilege level, DPL) – біти 13 і 14 в 2-му подвійному слові сегментного десктиптора. Визначає рівень привілеїв сегменту.
Поле запитуваного рівня привілеїв(Requested privilege level, RPL) – біти 0 і 1 будь-якого сегментного селектора. Визначає запитуваний рівень привілеїв сегментного селектора.
Поле біжучого рівня привілеїв(Сгккуте privilege level, СPL) – біти 0 і 1 сегментного регістра CS. Вказує на рівень привілеїв біжучої програми або процедури.
Прапорець User/Supervisor (U/S) – біт 2 списку сторінок або таблиці сторінок – визначає тип сторінки.
Прапорець Read/Write(R/W) – біт 1 списку сторінок або таблиці сторінок. Визначає тип доступу до сторінки: тільки для читання або читання-запису.
EMBED PBrush
За допомогою цих полів та прапорців може бути впроваджена велика кількість типів і схем захисту.
Поле границь сегментного дескриптора захищає прогаму від адресування пам’яті за межами сегменту. Ефективне значення границі залежить від встановлення прапорця G(granularity) Для сегментів даних границя також залежить від прапорця E (expansion direction) і B (default stack pointer size and/or upper bound) Прапорець E є одним з бітів в полі типу, коли сегментний дескриптор використовується для сегменту даних.
Якщо прапорець G не встановлений, ефективна границя має значення 20-бітного поля обмежувача сегментного дескриптора. При встановленому прапорці G процесор масштабує значення поля границі за допомогою множника 212(4К)
Для всіх типів сегментів за виключенням сегментів expand-down, ефективна границя є останньою адресою, якій дозволено доступ до сегменту. Процесор видає general-protection виключення при намаганні доступу за наступними адресами в сегменті:
Байт, що на offset більший від ефективної границі.
Слово, шо offset більший від ефективної границі - 1.
Подвійне слово, шо offset більший від ефективної границі – 3.
Четверне слово, шо offset більший від ефективної границі – 7.
Для сегментів expand-down сегментна границя виконує ту ж саму функцію, але інтерпретується інакше. Так, ефективна границя специфікує останню адресу, по якій не дозволено доступатись в межах сегмента.
Границя дозволяє схоплювати різні програмні помилки.
Крім переквірки обмежень сегментів, процесор також первіряє границі таблиці дескрипторів. Регістри GDTR i LDTR містять 16-бітові значення границь, які процесор використовує для заборони програмі вибору сегментного дескриптора за межами відповідної таблиці дескрипторів. LDTR і регістри задачі містять 32-бітові сегментні границі. Процесор використовує ці сегментні границі для запобігання доступу за межами біжучих LDT i TSS.
Сегментний дескриптор містить інформацію про тип в двох місцях:
Прапорець S
Поле типу
Процесор використовує інформацію для визначення програмних помилок, що є результатами намагань використати сегмент некоректно.
Прапорець S вказує, чи дескриптор є системного типу, чи коду або даних. Поле типу має 4 додаткових біти для використання при визначенні різних типів коду, даних і системних дескрипторів.
Механізм для захисту сегментів має 4 рівні привілеїв, що пронумеровані від 0 до 3. Більшим номерам відповідають менші привілеї.
EMBED PBrush
Процесор використовує рівні привілеїв для запобігання роботи прорами з більшими привілеями, ніж дозволено для даного сегменту. Якщо процесор визначає порушення рівня привілеїв, він генерує виключення general-protection.
Для взаємодії перевірки рівнів привілеїв між сегментом коду та сегментом даних, процесор розпізнає три типи рівнів привілеїв:
Біжучий рівень привілеїв (Current privilege level (CPL)) CPL – це рівень привілеїв виконуваної на даний момент програми. Звичайно, CPL рівний рівню привілеїв сегменту кода. Процесор змінює CPL, якщо управління передається сегменту коду з іншим івнем привілеїв.
Descriptor privilege level (DPL) – рівень привілеїв сегмента або шлюза. Якщо біжуча задача намагається звернутись до сегмента або шлюза, DPL сегмента порівнюється з CPL або RPL селектора сегмента або шлюза.
Запитаний рівень привілеїв (Requested privilege level (RPL)) RPL переписує рівень привілеїв, що присвоєний сегментному селектору.
Для доступу операндів до сегменту даних, сегментний селектор сегменту даних повинен бути завантажений в регістри сегмента даних(DS, ES, FS, GS) або в регістр стеку(SS). Перед тим, як процесор завантажить сегментний селектор в сегментний регістр, він виконує перевірку привілеїв шляхом порівняння рівнів привілеїв біжучої програми, RPL сегментного селектора і DPL сегментного дескриптора. Процесор завантажує сегментний селектор в сегментний регістр якщо DPL більший або рівний і CPL i RPL. Інакше, генерується виключення general-protection
fault і сегментний регістр не завантажується .
EMBED PBrush
Іноді виникає необхідність доступу до структур даних, що знаходять ся в сегменті коду. Для доступу можливі наступні методи:
завантажити сегмент даних сегментним селектором сегменту коду для підтвердженого читання
завантажити сегмент даних сегментним селектором сегменту коду для непідтвердженого читання
використати code-segment override prefix (CS) для читання сегмента кода, чий селектор вже завантажений в регістр CS.
Перевірка рівня привілеїв також відбувається і при завантаженні регістра SS сегментним селектором для сегмента стека.
Захист сторінок може відбуватись окремо або разом із захистом сегментів. Якщо захисть сторінок використовується з лінійною моделлю пам’яті, це дозволяє коду і даним супервізора бути захищеним від коду і даних користувачів. При сумісному використанні захисту сторінок і сегментів існує можливість більш глибокого і гнучкого захисту сторінок.
Як і при захисті на рівні сегментів, призахисті на рівні сторінок кожне звертання до пам’яті перевіряється. Всі перевірки відбуваються до того, як почнеться цикл обміну з пам’яттю, і в разі виникнення виключення, воно пройде перед циклом обміну. Оскільки перевірка відбувається паралельно з трансляцією адрес, втрат швидкодії не відбувається.
Процесор виконує дві перевірки рівня захисту сторінок:
Обмеження адресного простору
Тип сторінки(read, write)
Коли дозволена сторінкова адресація, процесор спочатку обраховує сегментний захист, а потім – захист сторінок. Якщо процесор визначає порушення захисту на рівні сегменту або сторінки, доступ до пам’яті не дозволяється і генерується виключення. Якщо виключення генерується на рівні сегментного захисту, сторінкове виключення не генерується.
Захист рівня сторінок не може бути використаний для заміни захисту рівня сегментів. Наприклад, сегмент коду за визначенням є тільки для читання. Якщо сегмент коду розбитий на сторінки, встановлення прапорця R/W для сторінок сегменту не зробить його доступним для запису. Намагання запису в сторінки буде блоковане захистом рівня сегмента.
Наведу таблицю комбінованого захисту:
EMBED PBrush