Апаратне забезпечення засобів захисту

Автор: Пользователь скрыл имя, 30 Марта 2013 в 12:01, реферат

Описание работы

Апаратне забезпечення засобів захисту
Керування пам'яттю: віртуальна пам'ять і трансляція адрес
Захист сегментів і сторінок пам'яті
Керування процесами (задачами)
Реалізація функцій захисту в процесорах Intel х86

Работа содержит 1 файл

Апаратне забезпечення засобів захисту.doc

— 1.12 Мб (Скачать)



 

 

 

 

 

Окремі  розділи таблиці сторінок може бути витіснено з фізичної пам'яті на диск. При цьому кожний розділ таблиці має розмір 4 Кбайт (210 = 1024 дескриптори) і відтак займає рівно одну сторінку. Таблиця розділів завжди присутня у пам'яті, її фізична адреса міститься в регістрі сгЗ.


Таблиця 10.5. Поля дескриптора сторінки


Рис. 10.9. Формат дескриптора сторінки


Таблиця 10.4 (закінчення)




Номер

Символьне

Призначення і вміст полів

біта

позначення

 

0

Ρ (Present)

Прапорець наявності сторінки у фізичній пам'яті

1

W (Writable)

Прапорець дозволу записування у сторінку

2

U (User mode)

Прапорець користувач/супервізор

3

PWT

Керують механізмом кешування сторінок (введені

4

PCD

починаючи з процесора 80486)

5

A (Accessed)

Ознака  того, чи було здійснено доступ до сторінки

6

D

Ознака  модифікації вмісту сторінки

7...8

0

Зарезервовані

9...11

AVL (Available)

Зарезервовані для потреб операційної системи

12...31

 

Номер сторінки у пам'яті



Ще  два розряди байта захисту  дескриптора — 5 і 6 — визначають рівень привілеїв дескриптора (Descriptor Privilege Level, DPL). Разом із рівнем привілеїв селектора RPL і поточним рівнем привілеїв процесу, що виконується (Current Privilege Level, CPL), ці рівні дають змогу організувати розмежування доступу до сегментів за мандатним принципом (так звані кільця захисту) [91].

Якщо  включено сторінковий механізм керування  пам'яттю (біт pg регістра сг0 дорівнює 1), то з дескриптора визначається лінійна базова адреса сегмента, а після додавання до неї зміщення — лінійна адреса даних. Для обчислення фізичної адреси здійснюється сторінкове перетворення. Більш докладно цей процес буде розглянуто далі, а тепер звернемо увагу лише на пов'язані з ним структури даних.

Лінійна адреса — 32-розрядна, старші 20 розрядів інтерпретуються як номер сторінки, а молодші 12 — як зміщення у сторінці. Номер сторінки інтерпретується як індекс дескриптора сторінки, а з дескриптора визначається номер у фізичній пам'яті, який водночас становить старші 20 розрядів 32-розрядної фізичної базової адреси сторінки. На рис. 10.9 показано формат дескриптора сторінки, а в табл. 10.5 наведено значення його полів.


Біт S

Комбінація  бітів

Тип сегмента

 

у полі type_seg

 

1

011х

Сегмент стека, дозволено читання і записування

1

100х

Сегмент коду, дозволено лише виконання

1

101х

Сегмент коду, дозволено читання і записування

1

110х

Підпорядкований сегмент коду, дозволено лише виконання

1

111х

Підпорядкований сегмент коду, дозволено читання і виконання




 

 

 

 

 

Рис. 10.10. Механізм перетворення віртуальної адреси на фізичну, коли процесор х86 функціонує в сегментному режимі з використанням дескриптора сегмента з таблиці GDT



10.5.1. Сегментний розподіл пам'яті

У сегментній моделі пам'яті кожний сегмент утворює свій окремий адресний простір (див. рис. 10.1). Кількість сегментів визначається максимальною кількістю дескрипторів, яку може обробити процесор. Як уже зазначалося, кожний процес використовує одночасно дві таблиці — LDT і GDT; максимальна кількість дескрипторів у кожній із них визначається розрядністю індексу з селектора — 13 розрядів. Тобто в кожній таблиці може міститися до 213 дескрипторів, загалом — 16k (16 384) сегментів. З цього випливає, що в такому режимі кожний процес може мати 16k * 4 Гбайт = 64 Тбайт віртуального адресного простору.

Розглянемо  механізм трансляції адреси, коли процесор працює в такому режимі (рис. 10.10, 10.11).


10.5. Керування оперативною пам'яттю

Як уже зазначалося, архітектура процесорів х86 передбачає сегментну і сегментно-сторінкову моделі розподілу пам'яті. Засоби сегментної організації формують верхній рівень керування пам'яттю, а сторінкової — нижній (який можна вмикати та вимикати за допомогою прапорця pg в регістрі сг0) [63, 92].



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Цей механізм ініціюється за спроби звернутися до будь-яких даних у пам'яті (наприклад, коли дані завантажуються в регістр процесора чи записуються з peгiстра в пам'ять, та під час роботи зі стеком) або до нового сегмента (завантаження селектора в сегментний регістр). Принципово цей механізм відповідає схемі, наведеній на рис. 10.3. Насправді-ж перша частина алгоритму виконується лише під час завантаження селектора в сегментний регістр. Якщо здійснюється доступ до даних всередині сегмента, пошук дескриптора сегмента не виконується, позаяк процесор має спеціальні 64-розрядні регістри для зберігання дескрипторів, що відповідають завантаженим у сегментні регістри селекторам. Ці дескрипторні регістри є тіньовими, програмно недоступними. Дескриптор завантажується разом із селектором.

Завантаження  селектора в сегментний регістр

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


Рис. 10.11. Механізм перетворення віртуальної адреси на фізичну, коли процесор х86 функціонує в сегментному режимі з використанням дескриптора сегмента з таблиці LDT




 

 

 

 

 

 

 

 

 

 

Регістр

Ρ

DPL

S

Ε

C/ED

R/W

Α

Примітка

CS

χ

χ χ

1

1

χ

χ

χ

Сегмент коду

SS

χ

χ χ

1

0

1

1

χ

Сегмент стека

ds, es, fs, gs

χ

χ χ

1

1

χ

1

χ

Сегмент коду

0

χ

χ

χ

Сегмент даних або стека



Таблиця 10.6. Дозволені комбінації бітів байта захисту дескриптора під час виконання операції завантаження селектора в сегментний регістр


Якщо  у селекторі прапорець ТІ = 0, то дескриптор міститься в глобальній таблиці дескрипторів GDT. Базова адреса і межа (тобто розмір) таблиці GDT визначаються з регістра gdtr. Для вибору потрібного дескриптора використовується індекс, що міститься в селекторі. Індекс — це фактично номер дескриптора в таблиці. Оскільки адресація здійснюється побайтово, індекс необхідно помножити на 8 (розмір дескриптора в байтах), що досягається зміщенням уліво на три розряди. Насправді ж, через те що індекс у селекторі займає 13 старших розрядів, він вже фактично зсунутий на три розряди вліво, тому достатньо обнулити три молодших розряди селектора і додати останній до базової адреси таблиці. Далі здійснюється перша операція, що стосується захисту сегментів пам'яті, — перевіряється, чи не виходить дескриптор за встановлену межу таблиці GDT. Якщо ні — відбувається звернення до дескриптора. У разі виходу за межу генерується внутрішнє переривання процесу — виняткова ситуація 11.

Якщо  ж у селекторі прапорець ТІ = 1, дескриптор міститься в таблиці LDT. Тоді спочатку визначається поточна таблиця LDT, для чого як селектор використовують уміст регістра Idtr. Після виконання операції, аналогічної описаній вище, з таблиці GDT вибирається дескриптор, що описує таблицю LDT (нагадаємо, що таблиця дескрипторів — це спеціальний вид сегмента). При цьому перевіряється, чи відповідає тип дескриптора таблиці дескрипторів (див. табл. 10.4) та чи є таблиця в пам'яті (біт Ρ байта AR дескриптора дорівнює 1). З дескриптора таблиці LDT визначаються базова адреса таблиці та її межа. Потім із цієї таблиці обирається потрібний дескриптор, так само, як із таблиці GDT і з тими самими перевірками. (На рис. 10.10 і 10.11 операції перевірки виходу поза межі таблиць і сегментів не показано.)

В обох випадках було розглянуто процедуру до моменту звернення до дескриптора сегмента, селектор якого ми завантажуємо в регістр.

Далі  здійснюється перевірка сумісності типів селектора і дескриптора. Дескриптор має описувати сегмент у пам'яті (біт S = 1). Якщо селектор завантажується в регістр, що вказує на сегмент даних, то несумісним буде дескриптор, що описує сегмент коду із захистом від читання (біт Ε = 1, біт R = 0). Якщо селектор завантажується в регістр cs, то сумісним буде лише сегмент коду, і аналогічно під час завантаження селектора в регістр ss сумісним буде лише сегмент стека (табл. 10.6). Очевидно, більш суворі умови сумісності для сегментів стека і коду спрямовані на запобігання «підсовування» процесору зловмисного коду через сегменти даних. У випадку коли перевірка дає негативний результат, фіксується несумісність типів — генерується виняткова ситуація 13 (загальна помилка захисту).



 

 

 

 

 

 

 

Потім перевіряються привілеї доступу до сегмента. Для цього  порівнюються значення RPL (рівень привілеїв селектора, який ми завантажуємо в сегментний регістр процесора), DPL (рівень привілеїв дескриптора, на який посилається се лектор, що ми його завантажуємо) і CPL (поточний рівень привілеїв, тобто рівень привілеїв процесу, що виконується), який дорівнює RPL селектора, що зна ходиться в регістрі cs). Для сегмента стека (за спроби завантажити селектор у регістр ss) має виконуватися рівність DPL = RPL = CPL. Для решти сегментів рівень DPLMae бути не вищим за рівні RPLi CPL, тобто DPL > RPL і DPL >CPL (па гадаємо, що найвищому рівню привілеїв відповідає значення 0, а найнижчому-3).

Якщо потрібне співвідношення не виконується, фіксується недостатній рівень

привілеїв — виняткова ситуація 13 (загальна помилка захисту).

Розглянемо приклад [91]. Зауважимо, що, описуючи послідовність перевірок, ми припускалися, що у разі фіксації помилки виконання алгоритму припиняється і викликається оброблювач відповідного переривання.

Приклад 1. Завантаження селектора в сегментний регістр

Виконується команда

mov. ds, ах

Регістр ах містить  значення 0x37 = 0000000000110111. Процес виконується в нульовому кільці захисту, тобто CPL = 0.

  1. Аналізується біт ТІ селектора. ТІ = 1 (тобто дескриптор знаходиться в LDT).
  2. Обчислюється фізична адреса дескриптора dt локальної таблиці дескрипторів LDT, що відповідає поточному процесу (дескриптор dt знаходиться в таблиці GDT).
  3. З дескриптора dt добувається межа LDT ldt limit.
  4. Якщо в dt G=l, то ldt_limit *= 4096 (межа у 4-кілобітових сторінках).
  5. Із селектора добувається індекс дескриптора:

index = 6

  1. Перевіряється, чи не виходить індекс за межі таблиці LDT:

(index +1) * 8 - 1 = 55

Якщо ldt_limit < 55, фіксується некоректність селектора (помилка 11).

  1. З таблиці LDT добувається дескриптор d сегмента:

offset = index * 8 = 48; d_addr = ldt_base + offset

  1. Якщо в d біт S = 0 або одночасно Ε = 1 і R = 0, фіксується несумісність типів селектора і 

      регістра (помилка 13).

  1. Із селектора добувається RPL:

RPL = 3

  1. Порівнюються CPL, RPL і DPL:

        CPL = 0, RPL = З

  1. Якщо DPL < 3, фіксується недостатній рівень привілеїв (помилка 13).

 

 

 

 

Щоб перевірити коректність доступу, перевіряється, чи не виходить адреса за межу сегмента. Перевірка здійснюється з урахуванням розміру даних і напрямку зростання сегмента. Якщо сегмент є сегментом стека (біт Ε = 0 та біт ED = 1), то він зростає в бік молодших адрес, і тоді обчислена адреса має бути не меншою за межу сегмента. Якщо ж сегмент є сегментом коду (біт Ε = 1) або даних (біт Ε = 0 та біт ED = 0), він зростає в бік старших адрес, тому до обчисленої адреси додається розмір даних (для команди mov — залежно від того, який із регістрів процесора бере участь у передаванні-прийманні даних) і отримана адреса має бути не більшою за межу сегмента. За наявності помилки генерується виняткова ситуація 13 (загальна помилка захисту). 
Розглянемо такий приклад [91].

Приклад 2. Звернення до пам'яті

Виконується команда 
mov es:[ebx+4],еах

  1. Перевіряється біт Ε дескриптора d, завантажений у дескрипторний регістр, 
    який відповідає сегментному регістру es. Якщо Ε = 1, фіксується спроба запису в сегмент коду (помилка 13).
  2. Перевіряється біт W дескриптора d. Якщо W = 1, фіксується спроба запису 
    в сегмент, захищений від запису (помилка 13).
  3. Із сегмента d добувається межа сегмента seg_limit. Якщо в d значення G=l, то 
    seg_limit *= 4096 (межа у 4-кілобайтових сторінках).
  1. Обчислюється зміщення: 
    offset = ebx + 4

Операція

Ρ

DPL

S

Ε

C/ED

R/ W

Α

Примітка

Зчитування з пам'яті

1

1

Χ χ

χ χ

1

1

0

1

χ

χ

χ

1

χ

χ

Сегмент даних або стека Сегмент коду

Записування в пам'ять

1

χ χ

1

0

χ

1

χ

Сегмент даних або стека

Информация о работе Апаратне забезпечення засобів захисту