Сегментна адресация в PENTIUM
страницата се нуждае от дописване/преглеждане
|
Table of Contents
|
В машините PENTIUM са вградени два механизма за организация на виртуалната памет – сегментация и страниране (segmentation и paging);
В така наречения защитен режим (protected mode) могат да се използват и двата механизма при адресация.
При сегментацията адресът се получава от 16-битов сегментен регистър и 32-битово отместване;
сегментните регистри в PENTIUM са следните:
- CS – кодов сегментен регистър – показва началото на сегмента на кода на програмата;
- SS – стеков сегментен регистър – показва началото на сегмента на стека;
- DS, ES, FS, GS – сегментни регистри за данни - показват началото на четири сегментна за данни;
регистърът EIP е 32-битов и в него се записва отместването относно началото на кодовия сегмент.
регистърът ESP е 32-битов и в него се записва адресът на върха на стека, зададен като отместване относно началото на стековия сегмент;
всеки от останалите 32-битови общи регистри може да се използва за задаване на отместване при адресация на данни в някой от сегментите за данни.
в защитен режим сегментните регистри се наричат селектори, поради специалната роля която изпълняват;
Шестнайсете бита на всеки селектор се интерпретират по следния начин:
- индексът показва отместване в глобална (GDT) или локална (LDT) дескрипторна таблица;
- ако бита TI е 0, селекторът е за поле в глобалната дескрипторна таблица, ако е 1, селекторът е за поле в локалната дескрипторна таблица;
- битовете RPL ( Requested Privilege Level ) са битове за нивото на привилегии на текущата програма. Нивата на привилегии са 4 като най високото е 0. Това е нивото на привилегия на операционната система.
RPL
Дескрипторните таблици съдържат сегментни дескриптори, като всеки сегментен дескриптор описва един сегмент. Сегментите дескриптори са по 8 байта, разпределени по следния начин:
(на долния ред са младшите 4 байта, на горния ред са старшите 4 байта)
- полето Base задава адреса на началото на сегмента. То е разделено на 3 части
- полето Limit задава размерът на сегмента; то е 20 бита, така че максималният размер на сегмент е 1 000 000 единици. Битът G (гранулярност) определя големината на единиците:
- ако битът G е 0, единиците в сегмента са байтове, така че един сегмент е до 1 MB
- ако битът G е 1, единиците в сегмента са страници по 4KB - един сегмент може да достигне 4GB
- битът DB задава размерът на операндите и адресите за този сегмент
- DB = 0 — 16 битови операнди и адреси
- DB = 1 — 32 битови операнди и адреси
- битът P е бит за наличност (present)
- P = 1 — ако сегментът е наличен в оперативната памет
- P = 0 — ако сегментът не е наличен в оперативната памет, т.е ще трябва да му търсим място ако се наложи да пишем по него
- битовете DPL са битове за нивото на привилегии на дескриптора - от 0 до 3
- битът DT определя типа на дескриптора
- DT = 0 за системен сегмент
- DT = 1 за сегмент за приложна програма
при адресиране се използват два типа дескрипторни таблици:
- глобална дескрипторна таблица GDT, която е единствена и се използва най-вече за дескриптори на системни сегменти; адресът на началото на GDT се записва в регистър GDTR, който се инициализира от ядрото на операционната система при нейното стартиране;
- локална дескрипторна таблица LDT, която не е единствена и се използва най-вече за дескриптори на приложни сегменти; в даден момент може да се използва точно една локална дескрипторна таблица – нейният начален адрес е поместен в дескриптор на GDT, индексът на който се намира в регистър LDTR;
коя дескрипторна таблица ще се използва – глобалната или текущата локална зависи от бита TI на съответния сегментен селектор – ако TI = 0 се използва GDT, ако TI = 1 се използва LDT;
тъй като размерът на индекса в селекторите е 13 бита, то една дескрипторна таблица може да съдържа най-много 8192 дескриптора;
получаване на адреса при сегментацията става по следния начин:
(зададени са селектор и отместване)
- по бита TI се определя в коя дескрипторна таблица да се търси сегментния дескриптор;
- ако TI = 0, таблицата е GDT – по регистъра GDTR и индекса в селектора се определя сегментният дескриптор в GDT;
- ако TI = 1, таблицата е LDT – по регистъра LDTR и регистъра GDTR се определя дескриптор в GDT, от който се извлича адресът на началото на LDT и след това по индекса в селектора се определя сегментният дескриптор в LDT;
- след като е определен сегментният дескриптор, се прави проверка дали сегментът е достъпен за програмата, дали се намира в оперативната памет, дали отместването е в рамките на сегмента; ако това е изпълнено, взима се адресът Base на началото на сегмента и към него се прибавя отместването;
за по-голяма ефективност на тази адресация, към всеки селектор се залепя 64-битов невидим регистър, който съдържа дескрипторът на сегмента, който последно е бил адресиран; по този начин, ако непосредствено след това отново се адресира този сегмент, информацията се изважда директно от невидимия регистър, а не от съответната дескрипторна таблица;
полученият адрес след сегментацията се нарича линеен адрес и той е част от линейното адресно пространство;
линейното адресно пространство е 4GB; оттук са възможни два случая:
- линейното адресно пространство директно се изобразява върху физическото адресно пространство;
- линейното адресно пространство е виртуално – извършва се странична преадресация; страниците имат размер 4KB;
кой от двата случая е налице зависи от бит, разположен в контролния регистър CR0 – този бит указва дали се използва страниране или не;





