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

1.11 Дескрипторні таблиці

У системах на базі процесорів x86 допускається створення майже будь–якого числа сегментів – необхідна тільки наявність відповідного дескриптора. Всі дескриптори мають довжину 8 байт і зберігаються в спеціальній області оперативної пам’яті, званої дескрипторною таблицею. Порядок розміщення дескрипторів довільний, а максимальне число дескрипторів – 8192. Таким чином максимальний розмір дескрипторної таблиці – 64 Кбайт.

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

1.11.1 Дескриптор

Дескриптор сегмента (в архітектурі x86) – службова структура в пам’яті, яка визначає сегмент. Довжина дескриптора дорівнює 8 байт.

Структура сегментного дескриптора виглядає наступним чином(рис. 1.6.):

Рис. 1.6 – Структура сегментного дескриптора

– База (жовті поля, 32 біта) – початок сегмента в лінійній пам’яті

– Ліміт (червоні поля, 20 біт) – (розмір сегмента в байтах) –1 (База + Ліміт = лінійна адреса останнього байта)

– Права доступу (сині поля, 12 біт) – прапори, що визначають наявність сегмента в пам’яті, рівень захисту, тип, розрядність + один користувальницький прапор.

Байт прав доступу :

– Біт P визначає доступність сегмента (0 – сегмента немає, 1 – є). При зверненні до сегмента з скинутим бітом P відбувається виключення #NP, обробник якого може завантажити/створити сегмент.

Номер привілеїв DPL містить 2–бітний номер (0–3), що визначає, до якого рівня захисту відноситься цей сегмент.

Тип сегмента (біти 8–12 на малюнку). Старший біт (S) визначає сегмент як системний (S = 0) або користувацький (S = 1). Значення інших біт для системних і користувальницьких сегментів описано в таблицях:

Таблиця 1.1 – Типи системних сегментів

№

Біти AR

Опис

3

2

1

0

0

0

0

0

0

Заборонене значення

1

0

0

0

1

Вільний 10–бітний TSS

2

0

0

1

0

LDT

3

0

0

1

1

Зайнятий 16–бітний TSS

4

0

1

0

0

16–бітний шлюз виклику

5

0

1

0

1

Шлюз задачі

6

0

1

1

0

16–бітний шлюз переривання

7

0

1

1

1

16–бітний шлюз пастки

8

1

0

0

0

Заборонене значення

9

1

0

0

1

Вільний 32–бітний TSS

A

1

0

1

0

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

B

1

0

1

1

Зайнятий 32–бітний TSS

C

1

1

0

0

32–бітний шлюз виклику

D

1

1

0

1

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

E

1

1

1

0

32–бітний шлюз переривання

F

1

1

1

1

32–бітний шлюз пастки

Таблиця 1.2 – Типи користувацьких сегментів

№

Біти AR

Опис

3

2

1

0

0

0

0

Сегмент даних тільки для читання

2

0

0

1

Сегмент даних для читання/запису

4

0

1

0

Сегмент даних тільки для читання, росте в низ

6

0

1

1

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

8

1

0

0

Сегмент коду тільки для виконання

А

1

0

1

Сегмент коду для виконання/читання

С

1

1

0

Підлеглий сегмент коду тільки для виконання

Е

0

0

0

Підлеглий сегмент коду для виконання/читання

Молодший біт байта AR користувальницьких сегментів (A, англ. Accessed, біт 8 на малюнку) можна використовувати для збору статистики про сегменти. При першому ж зверненні до сегменту (читання, запис, виконання) він встановлюється процесором в 1.

– Прапорець гранулярності G визначає ліміт сегмента: при G = 0 ліміт дорівнює значенню відповідного поля в дескрипторі, а при G = 1 ліміт дорівнює полю дескриптора, помноженому на (212 = 4096). Таким чином при G = 0 максимальний розмір сегмента 1 МБайт, а при G = 1 4 Гбайт.

– Прапор розрядності DB (біт 22 на малюнку) актуальний для користувальницьких сегментів коду і стека. Визначає розрядність в 16 біт при нульовому і 32 біт при одиничному значенні.

– Зарезервований прапорець (сіре поле) повинен завжди дорівнювати нулю.

– Користувацький прапор AVL (A, біт 20 на малюнку) відданий операційній системі. Його стан ніяк не впливає на роботу з сегментом.

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