Тема 8

8. Сегментна преадресация за 32-битов линеен адрес: таблици, селектори и дескриптори – формати и предназначение.


страницата се нуждае от дописване/преглеждане


<< Тема 7 | Тема 9 >>

Общи разяснения

untitled301.JPG
В защитен режим на паметта участват два механизма на преадресация, които са включени в процесора – странична преадресация и сегментна преадресация. Сегментацията е задължителна и не може да се изключи.
  • При сегментната преадресация логическия адрес(състоящ се от сегментен селектор и сегментно отместване) се преобразуват в линеен адрес.
  • При страничната преадресациялинейния адрес се преобразува във физически адрес. Тази стъпка е опционална.

Тези преадресации се изпълняват по начин, който не е видим за програмиста. Фигурата по-горе показва двете трансформации.
Тук ще разгледаме сегментната преадресация.
Тази фигура показва в повече детайли как процесора превръща логическия адрес в линеен.
untitled302.JPG
За да се направи тази преадресация процесора използва следните структури данни:
- Дескриптори (Descriptors)
- Таблици на дескрипторите (Descriptor tables)
- Селектори (Selectors)
- Сегментни регистри

Дескриптори

Сегментния дескриптор осигурява на процесора информация която му е необходима за да изобрази логическия адрес в линеен. Дескрипторите не се създават от програмиста.
untitled303.JPG

Полетата на сегментния дескриптор са:
BASE: Дефинира местоположението на сегмента в 4-те GB линейно адресно пространство. Процесора конкатенира трите фрагмента от базовия адрес за да формира една 32-битова стойност.
LIMIT: Дефинира размера на сегмента. Когато процесора конкатенира двете части на това поле, се получава 20-битова стойност. Процесора интерпретира това поле в един от следните два вида в зависимост от G бита:
1. На части от по един байт за да дефинира лимит от до 1 MB.
2. На части от по 4 KB за да се дефинира лимит от до 4 GB.
Granularity бит: Специфицира частите с които LIMIT полето се свързва. Когато бита е празен, лимита се интерпретира на части от по един байт.
TYPE: Разделяне между видовете дескриптори.
DPL (Descriptor Privilege Level): Използва се от защитните механизми.
Segment-Present бит: Ако този бит е нула, дескриптора не е валиден за използване в адресна преадресация; процесора ще издаде exception когато селектор за този дескриптор се зареди в сегментен регистър.
untitled304.JPG
Тази фигура показва формата на дескриптора когато този бит е нула. Операционната система е свободна да използва местата означени с AVAILABLE. Операционни системи които имплементират сегментирана виртуална памет изтриват този бит в един от тези случаи:
• Когато линейното адресно пространство измервано от сегмента не е изобразено в страничния механизъм.
• Когато сегмента не е в паметта.

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

Сегментните дескриптори се съхраняват в един от следните два типа дескрипторни таблици:
- Global descriptor table (GDT)
- Local descriptor table (LDT)
Дескрипторната таблица е просто паметен масив от 8-байтови входни данни които съдържат дескриптори, както показва фигурата по-долу. Дескрипторната таблица е с променлива дължина и може да съдържа до 8192 (2^(13)) дескриптора. Първите входни данни на GDT (INDEX=0) не се използва от процесора.
Процесора намира GDT и текущата LDT в паметта с помоща на GDTR и LDTR регистрите. Тези регистри пазят базовия адрес на таблиците в линейното адресно пространство и съхраняват и сегментните лимити. Инструкциите LGDT и SGDT достъпват GDTR; инструкциите LLDT и SLDT достъпват LDTR.
untitled305.JPG

Селектори

Частта от логическия адрес която съдържа селектора идентифицира дескриптора като специфицира дескрипторна таблица и индексира дескриптора в тази таблица. Селекторите могат да бъдат видими за програмите като поле в указателя, но стойностите на селекторите обикновено не се поставят от програмиста.Следната фигура показва формата на селектора:
untitled306.JPG
Index: Избира един от 8192-те дескриптора в таблицата на дескрипторите. Процесора просто умножава тази индексна стойност по 8(дължината на дескриптора) и събира резултата с базовия адрес на дескрипторната таблица за да се достъпи определения сегментен дескриптор в таблицата.
Table Indicator: Специфицира за коя дескрипторна таблица селектора „говори”. Нула сочи към GDT; еденица сочи към LDT.
Requested Privilege Level: Използва се от защитния механизъм.
Понеже първия вход на GDT не се използва от процесора селектор който има индекс нула и table indicator нула може да бъде използван като нулев селектор. Процесора не предизвиква exception когато сегментен регистър (друг освен CS или SS) е зареден с нулев селектор. Така ще се появи exception когато сегментния регистър се използва за да се достъпи паметта.

Сегментни регистри

untitled307.JPG
х86 съхранява информация от дескрипторите в сегментни регистри, така заобикаляйки нуждата да се допитва до дескрипторна таблица всеки път, когато се достъпва паметта.
Всеки сегментен регистър има видима част и невидима част, както показва фигурата по-горе. Видимите части от тези сегментни регистри се манипулират от програми, като че са просто 16-битови регистри. Невидимите части се управляват от процесора.
Операциите които зареждат тези регистри са инструкциите на нормални програми. Тези инструкции са два вида:
1. Директно зареждащи инструкции; например MOV, POP, LDS, LSS, LGS, LFS.
2. Заложени зареждащи инструкции; например far CALL и JMP. Тези инструкции неявно се отнасят към CS регистъра и го зареждат с нова стойност.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License