Тема 11

Сегментна адресация в PENTIUM


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


Table of Contents

В машините PENTIUM са вградени два механизма за организация на виртуалната памет – сегментация и страниране (segmentation и paging);

В така наречения защитен режим (protected mode) могат да се използват и двата механизма при адресация.

При сегментацията адресът се получава от 16-битов сегментен регистър и 32-битово отместване;

сегментните регистри в PENTIUM са следните:

  • CS – кодов сегментен регистър – показва началото на сегмента на кода на програмата;
  • SS – стеков сегментен регистър – показва началото на сегмента на стека;
  • DS, ES, FS, GS – сегментни регистри за данни - показват началото на четири сегментна за данни;

регистърът EIP е 32-битов и в него се записва отместването относно началото на кодовия сегмент.
регистърът ESP е 32-битов и в него се записва адресът на върха на стека, зададен като отместване относно началото на стековия сегмент;
всеки от останалите 32-битови общи регистри може да се използва за задаване на отместване при адресация на данни в някой от сегментите за данни.

в защитен режим сегментните регистри се наричат селектори, поради специалната роля която изпълняват;

Шестнайсете бита на всеки селектор се интерпретират по следния начин:

theme11_index.PNG
  • индексът показва отместване в глобална (GDT) или локална (LDT) дескрипторна таблица;
  • ако бита TI е 0, селекторът е за поле в глобалната дескрипторна таблица, ако е 1, селекторът е за поле в локалната дескрипторна таблица;
  • битовете RPL ( Requested Privilege Level ) са битове за нивото на привилегии на текущата програма. Нивата на привилегии са 4 като най високото е 0. Това е нивото на привилегия на операционната система.

RPL

theme11_RPL.PNG

Дескрипторните таблици съдържат сегментни дескриптори, като всеки сегментен дескриптор описва един сегмент. Сегментите дескриптори са по 8 байта, разпределени по следния начин:
(на долния ред са младшите 4 байта, на горния ред са старшите 4 байта)

theme11_table.PNG
  • полето 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 дескриптора;

theme11_dectiptor_table.PNG

получаване на адреса при сегментацията става по следния начин:
(зададени са селектор и отместване)

  • по бита TI се определя в коя дескрипторна таблица да се търси сегментния дескриптор;
  • ако TI = 0, таблицата е GDT – по регистъра GDTR и индекса в селектора се определя сегментният дескриптор в GDT;
  • ако TI = 1, таблицата е LDT – по регистъра LDTR и регистъра GDTR се определя дескриптор в GDT, от който се извлича адресът на началото на LDT и след това по индекса в селектора се определя сегментният дескриптор в LDT;
  • след като е определен сегментният дескриптор, се прави проверка дали сегментът е достъпен за програмата, дали се намира в оперативната памет, дали отместването е в рамките на сегмента; ако това е изпълнено, взима се адресът Base на началото на сегмента и към него се прибавя отместването;

за по-голяма ефективност на тази адресация, към всеки селектор се залепя 64-битов невидим регистър, който съдържа дескрипторът на сегмента, който последно е бил адресиран; по този начин, ако непосредствено след това отново се адресира този сегмент, информацията се изважда директно от невидимия регистър, а не от съответната дескрипторна таблица;

полученият адрес след сегментацията се нарича линеен адрес и той е част от линейното адресно пространство;
линейното адресно пространство е 4GB; оттук са възможни два случая:

  • линейното адресно пространство директно се изобразява върху физическото адресно пространство;
  • линейното адресно пространство е виртуално – извършва се странична преадресация; страниците имат размер 4KB;

кой от двата случая е налице зависи от бит, разположен в контролния регистър CR0 – този бит указва дали се използва страниране или не;

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