Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Безпека.docx
Скачиваний:
164
Добавлен:
31.08.2019
Размер:
6.2 Mб
Скачать

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

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

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

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

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

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

  • селектор поточного сегмента TSS добувається з регістра tr; здійснюється звернення

до TSS, в якому зберігаються значення регістрів процесора;

♦ у регістр tr завантажується селектор TSS задачі, на яку переключається процесор;

♦ з нового TSS у регістр Idtr завантажується селектор LDT;

  • із відповідних полів нового TSS поновлюються всі регістри процесора;

♦ селектор сегмента TSS попередньої задачі заноситься в поле селектора повернення нового сегмента 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

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

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