Към съдържанието

Глава VI — Управление на паметта в защитен режим: Сегментация

1. Общи принципи за управлението на паметта

В архитектурата Intel се използват два механизма за управление на паметта:

  1. Сегментиране — разделя линейното адресно пространство на защитени области
  2. Странициране — допълнителна транслация на линейни към физически адреси

И двата механизма целят изолиране на адресните пространства на задачите в многозадачна среда. Защитите се базират на:

  • Нива на привилегия
  • Тип на съхраняваната информация
  • Права на достъп
  • Размер на адресираната област

2. Физическо адресно пространство в 32- и 64-битов режим

РежимЛинейно п-воФизическо п-воЗабележка
32-битов (без PAE)4 GB4 GBCR4.PAE = 0
32-битов (с PAE)4 GB64 GB (236)CR4.PAE = 1, 36-битов физически адрес
64-битов256 TB (248)до 4 PB (252)MAXPHYADDR = 52 (типично)

3. Структури за сегментация: сегменти, сегментни дескриптори, дескрипторни таблици и селектори

3.1 Сегментен дескриптор

Всеки сегмент се описва с 8-байтова структурадескриптор (descriptor):

Байт 7Байт 6Байт 5Байт 4Байтове 3–2Байтове 1–0
База 31..24G | D | 0 | AVL | Лим 19..16P | DPL | S | ТипБаза 23..16База 15..0Лимит 15..0

Полета на дескриптора:

ПолеРазмерОписание
Базов адрес32 битаНачалният линеен адрес на сегмента (3 части: байтове 2,3,4 и 7)
Лимит20 битаРазмерът на сегмента (интерпретира се с флага G)
G (Granularity)1 битG=0 → лимитът е в байтове (1 B – 1 MB); G=1 → в 4 KB единици (4 KB – 4 GB)
D/B (Default/Big)1 битЗа кодов сегмент: D=1 → 32-bit; D=0 → 16-bit (адреси и операнди)
L1 битL=1 → 64-битов кодов сегмент (само в Long Mode)
AVL1 битСвободен за ОС
P (Present)1 битP=1 → сегментът е в паметта; P=0 → изключение #NP
DPL2 битаDescriptor Privilege Level: нивото на привилегия (0–3)
S (Segment)1 битS=1 → даннов/кодов сегмент; S=0 → системен дескриптор
Тип4 битаТипът и правата за достъп (виж по-долу)
A (Accessed)1 битВдига се автоматично при обръщение; ОС го използва за swap

Типове сегменти (S=1):

Тип (4 бита)Описание
0000BДанни, само четене
0001BДанни, четене и запис
0010BДанни (стек), само четене, надолу нарастване
0011BДанни (стек), четене и запис, надолу нарастване
1000BКод, само изпълнение
1001BКод, изпълнение и четене
1010BПодчинен код, само изпълнение (conforming)
1011BПодчинен код, изпълнение и четене (conforming)

Системни дескриптори (S=0):

ТипОписание
2LDT дескриптор
9TSS дескриптор (незает)
11TSS дескриптор (зает)
12Шлюз на извикване (Call Gate)
14Шлюз на прекъсване (Interrupt Gate)
15Шлюз на капан (Trap Gate)

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

Дескрипторите се съхраняват в специални таблици (макс. размер 64 KB = 8192 дескриптора):

GDT (Global Descriptor Table) — Глобална дескрипторна таблица:

  • Съдържа дескриптори на общи сегменти, достъпни за всички задачи
  • Локализира се чрез регистъра GDTR (32-битов базов адрес + 16-битов лимит)
  • Първият елемент (индекс 0) не се използва — нулевият дескриптор
  • Зареждане на CS или SS с нулев селектор → изключение #GP

LDT (Local Descriptor Table) — Локална дескрипторна таблица:

  • За всяка задача може да съществува своя LDT с локални за задачата сегменти
  • LDT се съхранява в сегмент, чийто дескриптор е в GDT
  • Локализира се чрез LDTR (16-битов видим + 64-битов кеш-регистър)

IDT (Interrupt Descriptor Table) — Дескрипторна таблица на прекъсванията:

  • Съдържа дескриптори на шлюзове (gates) за обработка на прекъсвания/изключения
  • Локализира се чрез IDTR (32-битов базов адрес + 16-битов лимит)
  • Може да бъде навсякъде в паметта

3.3 Сегментен селектор

Селекторът е “адресът” на дескриптора — той не съдържа самия сегмент, а казва на процесора кой запис от GDT/LDT да прочете, за да намери базата и лимита на сегмента.

Всеки сегментен регистър (CS, DS, SS, ES, FS, GS) съдържа 16-битов селектор:

15 3 2 1 0
┌───────────────────┬───┬────────┐
│ Index (13b) │TI │ RPL │
└───────────────────┴───┴────────┘
ПолеРазмерЗначение
Index13 битаНомерът на дескриптора в таблицата (0–8191)
TI (Table Indicator)1 битTI=0 → търси в GDT; TI=1 → търси в LDT
RPL (Requested Privilege Level)2 битаЗаявеното ниво на привилегия (0–3)

Как процесорът използва селектора:

  1. Взима TI бит → избира GDT (при TI=0) или LDT (при TI=1)
  2. Умножава Index × 8 → това е отместването в таблицата (всеки дескриптор е 8 байта)
  3. Чете дескриптора от: Таблица.База + Index × 8
  4. Взима базовия адрес от дескриптора → Линеен адрес = База + Offset

Примери:

Селектор 0x0008 = 0000 0000 0000 1 0 00
│ │ └─ RPL = 0 (Ring 0, kernel)
│ └──── TI = 0 (GDT)
└─────── Index = 1 → GDT[1] → 2-ри дескриптор
Селектор 0x0023 = 0000 0000 0010 0 0 11
│ │ └─ RPL = 3 (Ring 3, потребителски)
│ └──── TI = 0 (GDT)
└─────── Index = 4 → GDT[4] → 5-ти дескриптор
Селектор 0x000F = 0000 0000 0000 1 1 11
│ │ └─ RPL = 3 (Ring 3)
│ └──── TI = 1 (LDT)
└─────── Index = 1 → LDT[1]

Забележка: RPL е заявеното ниво — за сравнение с DPL на дескриптора. Действителното текущо ниво на привилегия (CPL) е в битове 1–0 на CS регистъра.


4. Регистри за управление на паметта

РегистърВидимаНевидима (кеш)Зарежда се с
GDTR48 бита (лимит 16 + база 32)LGDT m48
IDTR48 битаLIDT m48
LDTR16 бита (селектор)64-битов дескрипторLLDT r/m16
TR16 бита (селектор)64-битов дескрипторLTR r/m16

Към всеки сегментен регистър (CS, DS, SS…) е асоциран 64-битов кеш-регистър (сянка), в който автоматично се зарежда дескрипторът при зареждане на селектора. Кеш-регистрите са невидими за програмата.


4.1 TR (Task Register) и TSS (Task State Segment)

TR е 16-битов регистър, чийто селектор сочи към дескриптор на TSS в GDT. Невидимата (кеш) част съдържа самия TSS дескриптор — база, лимит и атрибути.

TR: [ Селектор 16 бита ] → GDT[Index] → TSS дескриптор (тип 9 или 11)
TSS в паметта

TSS (Task State Segment) е специална структура в паметта (минимум 104 байта в 32-битов режим), която ОС поддържа за всяка задача. Съдържа:

Поле в TSSПредназначение
EIP, EFLAGSУказател и флагове на задачата
EAX–EDIСнимка на регистрите с общо предназначение
CS, DS, SS, ES, FS, GSСегментни регистри на задачата
CR3Адрес на Page Directory (адресно пространство на задачата)
ESP0, SS0Стеков указател и сегмент за Ring 0 (ядрото)
ESP1, SS1Стек за Ring 1
ESP2, SS2Стек за Ring 2
LDT SelectorСелектор на LDT на тази задача
I/O Permission BitmapБитова маска: кои I/O портове са достъпни от Ring 3
Previous Task LinkСелектор на предишния TSS (при вложени задачи, NT=1)

Как се ползва TR при превключване на задача:

TSS на нова задачаTSS на стара задачаПроцесорTSS на нова задачаTSS на стара задачаПроцесорTSS тип = Зает (Busy, бит 1 в тип поле)Изпълнението продължава от EIP на новата задачаЗапазва EIP, EFLAGS, EAX–EDI,\nCS/DS/SS/ES/FS/GS, CR3Зарежда TR с новия TSS селекторЧете EIP, EFLAGS, EAX–EDI,\nCS/DS/SS/ES/FS/GS, CR3Зарежда CR3 → нова страница директория\nЗарежда LDTR → нова LDT

Важни особености на TR:

  • Зарежда се с инструкцията LTR r/m16 (само Ring 0) — само веднъж при инициализация; при превключване на задача TR се обновява автоматично от процесора
  • STR r/m16 чете текущия TR (достъпна от всяко ниво)
  • TSS дескрипторът в GDT е тип 9 (незает / Available) или тип 11 (зает / Busy) — процесорът автоматично превключва типа при Task Switch, за да предотврати рекурсивно превключване
  • Дори ОС, която не използва апаратно превключване на задачи (като Linux и Windows), трябва да зареди валиден TSS — процесорът го ползва за стека при преход от Ring 3 към Ring 0 (системно повикване или прекъсване): зарежда ESP0 и SS0 от TSS

5. Транслиране на логически в линеен адрес

Логически адрес = [Сегментен Регистър (Selector) : Ефективен адрес (Offset)]

Всеки логически адрес се превежда до линеен по следния начин:

Логически адрес: [ Selector (CS/DS/SS...) : Offset (32 бита) ]
TI=0 → GDTR.Base + Index×8
TI=1 → LDTR.Base + Index×8
Дескриптор (8 байта):
База (32b) + Лимит (20b) + права
Проверки: P=1? Offset ≤ Лимит? DPL ≥ CPL?
Линеен адрес = Дескриптор.База + Offset

Транслиране на логически в линеен адрес — сегментни дескриптори в LDT и съответните сегменти в паметта

Стъпки на транслацията:

  1. Изчислява се ефективният адрес (Offset) от инструкцията
  2. От селектора: TI бит → GDT или LDT; Index → номер на дескриптора
  3. МП взима дескриптора от: Таблица.База + Index × 8
  4. Проверява: P=1 (в памет), Offset ≤ Лимит, DPL ≥ CPL → иначе #GP/#NP/#SS
  5. Линеен адрес = Дескриптор.База + Offset
  6. Ако CR0.PG=1 → линейният адрес се превежда допълнително до физически чрез странициране

TLB кеширане на дескрипторите:

  • При зареждане на селектор в сегментен регистър → МП автоматично извлича и кешира дескриптора в кеш-регистъра (сянка)
  • Следващите обръщения използват кешираните данни (без достъп до памет)

6. Сегментни модели на паметта

6.1 Базов плосък модел (Basic Flat Model)

  • Системата и приложенията работят с непрекъснато, несегментирано адресно пространство
  • Минимум 2 дескриптора: 1 кодов + 1 даннов; и двата покриват цялото 4 GB линейно пространство (база = 0, лимит = 4 GB)
  • Скрива сегментирането от програмиста
  • Без апаратна защита при излизане извън физически достъпна памет

6.2 Защитен плосък модел (Protected Flat Model)

  • Подобен на базовия, но сегментите покриват само реално съществуващата физическа памет
  • При достъп извън дефинираните граници → изключение #GP
  • Може да се усложни чрез странициране за по-детайлна защита
  • Използва се в популярни ОС (например Linux, Windows)

6.3 Многосегментен модел (Multi-Segment Model)

  • Пълно използване на механизма на сегментиране
  • Всяка програма/задача има своя LDT с дескриптори на собствените и сегменти
  • Максимална апаратна защита на код, данни и стек
  • Всеки достъп до сегмент се контролира апаратно

Резюме за изпита

  • Дескриптор = 8 байта: Базов адрес (32 бита), Лимит (20 бита), P, DPL, S, Тип, G, D, AVL
  • GDT: обща за системата; LDT: лична за задача; IDT: за прекъсвания
  • Селектор = 13-битов Index + TI (GDT/LDT) + RPL (0–3)
  • Линеен адрес = Дескриптор.База + Ефективен адрес
  • Три модела: Базов плосък (без защита), Защитен плосък (с ограничения), Многосегментен (пълна защита)
  • Кеш-регистри (сянки) ускоряват адресацията

→ Речник на всички съкращения


Източници:

  • Рускова Н. Микропроцесорни системи. ТУ-Варна, 1999 (OCR)
  • Intel 64 and IA-32 Architectures Software Developer’s Manual, Vol. 3A, Chapter 3 (Protected-Mode Memory Management)