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

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

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

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

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

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

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


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


Селектор  із регістра ах завантажується в регістр ds, тоді ж дескриптор d завантажується в дескрипторний регістр, що відповідає регістру ds.

Звернення до пам'яті

Під час звернення до пам'яті у  разі її сегментного розподілу перевіряється, чи дозволено операцію та чи коректно здійснено доступ. Обмеження для  команди зчитування з пам'яті встановлено лише для сегментів коду (біт Ε = 1): якщо біт R = 0 — читання заборонено. Для команди записування в пам'ять сегмент коду — взагалі несумісний тип, а всі інші типи сегментів можуть бути захищені бітом W: якщо W = 0, записування заборонено. В усіх згаданих випадках генерується виняткова ситуація 13 (загальна помилка захисту). У табл. 10.7 наведено дозволені комбінації бітів байта захисту.



 

 

 

 

 

 

6. Перевіряється відсутність виходу за межу сегмента за таким алгоритмом: Якщо ED = 0 (сегмент даних зростає в бік старших адрес), то порівнюється offset + data_size — 1 = offset + 3 (зміщення останнього байта даних, розмір даних — 4 байти) і seg_limit; якщо offset + 3 > seg_limit, фіксується некоректне звернення (помилка 13).

Інакше, якщо ED = 1 (сегмент стека зростає в бік молодших адрес), то порівнюється offset і seg_limit; якщо offset < seg_limit, фіксується некоректне звернення (помилка 13).

7.  З дескриптора d добувається seg_base.

8.  Обчислюється адреса seg_base + offset, і в пам'ять за цією адресою заносяться дані з регістра еах.

10.5.2. Сегментно-сторінковий розподіл пам'яті

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

Важливою відмінністю  сегментно-сторінкового розподілу  пам'яті порівняно з сегментним розподілом пам'яті у процесорах х86 є те, що в режимі сегмент но-сторінкового розподілу пам'яті максимальним віртуальним адресним просто ром є 4 Гбайт, і різні сегменти можуть перекриватися (вони можуть мати однаковий розмір у 4 Гбайт і перекриватися повністю). Тоді до однієї лінійної адреси можна звернутися через різні сегменти та обійти таким чином згадані вище функції захисту сегментів. Ці проблеми процесор не вирішує, а передає їх у сферу відповідальності операційної системи. Саме розробники операційної системи визначають, як будуть виділятися сегменти пам'яті процесам і потокам і як буде організовано взаємодію між ними, зокрема обмін даними.

Нумерація віртуальних  сторінок — наскрізна та не залежить від поділу віртуального адресного простору на сегменти. Кожний процес має свій 4-гігабайтовий віртуальний адресний простір, а також власний набір розділів таблиць сторінок і власну таблицю розділів. Адресація таблиці розділів здійснюється через регістр сгЗ, отже, значення цього регістра специфічне для кожного процесу.

10.6. Керування задачами

Процесори х86 надають засоби для підтримки виклику процедур і задач [63, 92].

Виклик процедури  означає виклик коду в межах одного процесу (потоку), коли

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

 

 

 

 

 

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

10.6.1. Виклик процедур

Виконуючи будь-який програмний код, сучасні операційні системи постійно викликають процедури, код яких розміщено в інших сегментах. Такі сегменти можуть належати іншому програмному модулю тієї самої програми, бібліотеці або операційній системі. Процесори х86 пропонують кілька способів виклику процедур з інших сегментів:

  • прямий виклик процедури з непідпорядкованого сегмента;
  • прямий виклик процедури з підпорядкованого сегмента;
  • непрямий виклик процедури через шлюз.

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

у байті захисту  дескриптора сегмента коду (див. табл. 10.3): С = 1 — підпорядкований сегмент, С = 0 — непідпорядкований сегмент.

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

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

Для такого виклику  встановлено суворі правила захисту. Якщо сегмент, який викликають, є непідпорядкованим, то виклик дозволено лише тоді, коли рівень привілеїв сегмента, з якого робиться виклик, дорівнює рівню привілеїв сегмента, який викликають, тобто CPL = DPL. Виклик процедури за умови, що CPL > DPL (тобто поточний код має нижчий рівень привілеїв, ніж код, який намагаються викликати), заборонено з очевидних міркувань захисту критичного коду з більшими привілеями від виклику з процедур, що мають нижчі привілеї, наприклад, для захисту процедур ОС від безконтрольного виклику з процедур користувача (безконтрольного — оскільки за такого виклику можна задати будь-яку точку входження і передати через стек будь-які параметри).

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

 

 

 

 

 

Рис. 10.12. Шлюз виклику процедури: а — формат шлюзу; б — формат байта захисту шлюзу



привілейований  код не може використовувати процедури  з низькими привілеями, позаяк останні  вважаються ненадійними.

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

Виклик підпорядкованих сегментів — це один зі способів, у який програми з низьким рівнем привілеїв можуть використовувати код, що має високий рівень привілеїв. Наприклад, це буває корисним, коли програми користувача застосовують системні бібліотеки. Виклик коду процедури, яка розміщується в підпорядкованому сегменті, здійснюється аналогічно виклику процедур із не підпорядкованих сегментів (точки входження так само можна задавати в довільний спосіб). Але у разі підпорядкованого сегмента виклик здійснюється за умови, що CPL > DPL, тобто код, що викликає, має привілеї, не вищі за привілеї коду, який викликають. Підпорядкований сегмент має особливу властивість. Код із підпорядкованого сегмента успадковує рівень привілеїв коду, що його викликав, тому, яким би не був DPL підпорядкованого сегмента, під час виклику коду CPL не змінюється. Наприклад, код системної бібліотеки, який міститься в сегменті з DPL = 0 виконуватиметься з CPL = 0, якщо його було викликано з ядра ОС, і з CPL = 3, якщо його було викликано з програми користувача. Тож системний код, викликаний із програми користувача, буде мати обмежені можливості доступу до системних даних і достатні можливості для роботи з даними користувача.

Непрямий виклик процедури через  шлюз

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

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

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



 

 

 

 

 

 

 

 

 

Шлюзом  можна керувати: біт Ρ у байті захисту шлюзу використовується для 
його «відкривання» або «закривання».

Виклик  через шлюз надає також можливість контрольовано передавати параметри  через стек. У будь-якому процесі  передбачено кілька (до трьох) стеків, кожний з яких відповідає певному рівню привілеїв. Під час виклику через шлюз процедури, яка має рівень привілеїв, відмінний від CPL, процесор створює новий стек шляхом завантаження в регістр ss селектора, що відповідає потрібному рівню привілеїв (цей селектор міститься в контексті процесу TSS). У новий стек із поточного копіюється стільки 32-розрядних слів (параметрів виклику процедури), скільки вказано в полі WC шлюзу. Також у новий стек копіюється селектор старого стека, який дає змогу повернутися до процедури, з якої було здійснено виклик.

10.6.2. Виклик задач

Для переключення між задачами (процесами) в команді CALL потрібно задати 
селектор, що вказує на дескриптор системного сегмента стану задачі (TSS). Такі 
дескриптори можуть бути лише у таблиці GDT. Формат дескриптора аналогічний 
формату дескриптора сегмента даних, але біт S = 0 (див. табл. 10.4).

Сегмент TSS зберігає контекст процесу, тобто всю інформацію, необхідну для 
поновлення його виконання після переривання. На рис. 10.13 показано структуру 
сегмента TSS. Переключення контекстів здійснюється апаратно: 
♦ виконується команда CALL, в якій задано селектор, що вказує на дескриптор 
сегмента типу TSS;

♦ здійснюється перевірка прав доступу, якщо CPL > DPL, доступ заборонено;


Номер байта

Ширина

Символьне

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

в шлюзі

поля

позначення

 
 

(розряди)

   

0...1

16

offset_l

Молодші 16 розрядів зміщення точки входження

2...3

16

selector

Селектор  сегмента, який містить код

4

   

процедури

біти 0...4

5

WC

Лічильник параметрів

біти 5...7

3

 

Заповнення  нулями

5

   

Байт  захисту

біти 0...3

4

Type

Тип: С (386) або 4 (286)

біт 4

1

S

v =0 — «системний»

біти 5...6

2

DPL

Рівень  привілеїв шлюзу

біт 7

1

p -

— шлюз відкритий

     

=0 — шлюз закритий

6...7

16

offset_l

Старші 16 розрядів зміщення точки входження



Шлюз  має власний DPL, який визначає можливість доступу до нього коду: 
виконується умова CPL <DPL, тоді код має привілеї, не нижчі за привілеї шлюзу. 
Рівень DPL сегмента того коду, що викликається через шлюз, із рівнем CPL не 
порівнюється, натомість порівнюється із RPL селектора, що міститься у шлюзі. 
Якщо виклик успішний, код виконується зі своїм CPL, заданим DPL сегмента.

Таблиця 10.8. Поля шлюзу виклику процедури



 

 

 

 

 

 

 

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


Рис. 10.13. Структура сегмента TSS


Бітова  карта введення-виведення (БКВВ)

8 Кбайт

Додаткова інформація ОС

 

Відносна адреса БКВВ

0...0

64

0...0

Селектор LDT

60

0...0

gs

5C

0...0

fs

58

0...0

ds

54

0...0

ss

50

0...0

cs

4C

0...0

es

48

edi

44

esi

40

ebp

3C

esp

38

ebx

34

edx

30

ecx

2C

eax

28

eflags

24

eip

20

cr3

0...0

ss рівня 2

18

esp2

14

0...0

ss рівня 1

10

espl

0...0

ss рівня 0

08

esp0

04

0...0

Селектор TSS повернення

00

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