Распределение памяти в реальном режиме

При работе в защищенном режиме каждый сегмент определяется специальной восьмибайтной структурой, которая называется дескриптор сегмента (Segment Descriptor).

Права доступа AR
Базовый адрес G D X U Предел P DPL S Тип A Базовый 31-24 19-16 адрес 23-16
Базовый адрес Предел 15-0 15-0
63 47 39 32
31 23 15 7 0 0

Поля дескриптора имеют следующие названия:

AR - Access Rights

DPL - Descriptor Privilege Level

D - Default size

U - User

A - Accessed

G - Granularity

P - Present

S - System(segment)

AVL - Available

Число дескрипторов в системе практически неограниченно. Если какую-то область адресного пространства не описать дескриптором, соответствующий диапазон адресов оказывается недоступным и процессор блокирует доступ к этим адресам.

Поля, необходимые для определения сегментов памяти:

1) Базовый адрес - это 32-х битное поле. Занимает 2,3,4,7 байты дескриптора и определяет начальный адрес сегмента в линейном адресном пространстве 4 Gb. Этот адрес формирует процессор при нулевом смещении.

2) Предел - 0,1 байты и 4 бита - граница сегментаили еще называют размер сегмента(20 бит). Он равен размеру сегмента в байтах минус 1. Предел задает последнюю адресуемую единицу в сегменте. 20-битное поле предела позволяет определить размер в 1 Mb элементов.

3) Бит G (гранулярность) - определяет единицы измерения элементов памяти:

- G=0, то поле предела измеряется в байтах и соответственно имеет размер 1 Mb;

- G=1, то единицей измерения является страница, каждая из которых имеет размер 4Kb, следовательно, максимальный размер 1 M*4Kb = 4 Gb.

Бит A - бит доступа. Автоматически устанавливается в 1, когда производится обращение к памяти, описанной данным дескриптором. Этот бит можно использовать для того, чтобы определить те сегменты, к которым долго не было обращения.

Бит D - размер по умолчанию. Он используется для совместимости с процессором 286.

Бит U - пользовательский. Его называют AVL. Он предназначен для использования при системном программировании.

Бит AR - байт прав доступа. Байт прав доступа определяет тип сегмента и те возможности, которые предоставляются программе при работе с этим сегментом.

4) Для всех типов дескрипторов в байте доступа имеется бит P (присутствие):

P=1, когда описываемый дескриптором сегмент находится в физической памяти. В системе с виртуальной организацией памяти часть сегментов располагается на вешней дисковой памяти, бит P = 0, и если программа обращается к сегменту, у которого в дескрипторе бит Р = 0, то возникает особый случай неприсутствия сегмента. В таком случае ОС должна найти свободную область в ОП, скопировать с диска содержимое сегмента в эту область, загрузить в дескриптор новый базовый адрес сегмента, установить P = 1 и осуществить повторный запуск команды, вызвавшей особый случай. Процесс обращения к не присутствующему сегменту с последующими передачами сегмента между основной памятью и диском называется свопингом (подкачкой-swapping). Если свободного места для размещения сегмента в ОП нет, то ОС должна выгрузить некоторые сегменты из ОП на дескрипторы этих сегментов и Р = 0.

5) DPL – уровень привилегий дескриптора сегмента (2 бита). Определяет уровень привилегий, ассоциируемый с той областью памяти, которую описывает дескриптор. Поэтому его следовало бы назвать уровень привилегий сегмента. Наивысший уровень привилегий: DPL =00 (ноль), а наименьший – DPL =11 (три). Поле DPL - составная часть механизма защиты в процессоре.

6) Бит S (системный, бит сегмента). В дескрипторах сегментов памяти этот бит всегда равен 1. А в дескрипторах системных объектов S=0.

Трех битное поле типа определяет целевое использование сегмента, задавая допустимые в сегменте операции.

Тип:

000 – сегмент данных, разрешено только считывание;

001 – сегмент данных, разрешено считывание и запись;

010 – сегмент стека, разрешено только считывание;

011 – сегмент стека, разрешено считывание и запись;

100 – сегмент кода, разрешено только выполнение;

101 – сегмент кода, разрешено выполнение и считывание;

110 – подчиненный сегмент кода, разрешено только выполнение;

111 – подчиненный сегмент кода, разрешено выполнение и считывание.

С каждым сегментным регистром связан 64-битный теневой регистр. В него загружается дескриптор, на который указано содержание сегментного регистра.

Для хранения дескриптора выделяется участок памяти – специальной таблицы. Есть одна общая глобальная дескрипторная таблица, и может быть большое число локальных дескрипторных таблиц. Адрес и размер глобальной дескрипторной таблицы заносится в GDTR. Может храниться 8192 дескриптора. Есть дескрипторная таблица прерываний и много локальных таблиц.

При работе в защищенном режиме сегментные регистры состоят из трех частей.

Индекс TI RPL
 
 
 
 
 


Схема преобразования адреса при работе в защищенном режиме:

Последовательность действий по преобразованию логического адреса в линейный адрес.

Взять селектор из сегментного регистра.

Если бит TI=0, то для преобразования задействована глобальная дескрипторная таблица. В этом случае:

1) Определяется адрес дескриптора в GDR. Для этого к линейному адресу GDR (хранится в GDTR) прибавляется значение индекса, умноженного на 8. Получится адрес выбранного дескриптора.

2) Из дескриптора выбирается базовый адрес сегмента (32бита)

3) К базовому адресу сегмента прибавляется смещение (эффективный адрес) и результат суммы является линейным адресом. Он же физический, если задействована только сегментная организация памяти.

Если бит TI=1, т.е. показывает на LDT, то:

1) Взять селектор сегмента LDT из регистра LDTR.

2) Выделить в селекторе поле индекса, умножить этот индекс на 8 и т.о. получить смещение внутри GDT, которое указывает на расположение дескриптора в LDTR.

3) Прибавить полученное значение к адресу GDT из регистра GDTR.

4) Считать из памяти адресуемый дескриптор.

5) Выделить из этого дескриптора базовый адрес сегмента, содержащего таблицу LDT, полученный адрес является адресом;

Выделить значение из поля исходного индекса селектора, умножить его на 8 и прибавить к адресу дескрипторной таблицы и считать дескриптор по этому адресу;

Выделить из дескриптора базовый адрес сегмента;

Прибавить значение смещения к базовому адресу сегмента, в результате получим линейный адрес

Осуществить обращение к памяти в соответствие с полученным линейным адресом

Если отмеченные действия производить каждый раз при преобразовании адреса, то время преобразования адреса было бы значительно больше, чем при работе процессора в реальном режиме.

Для ускорения таких преобразования адреса в процессоре имеются специальные теневые регистры, связанные с сегментными регистрами и LDTR. Размер этих регистров 64 бита и при загрузке нового значения либо в сегментный регистр, либо в LDTR, в соответствующий теневой регистр помещается в выбранный дескриптор из дескрипторной таблицы. Применение теневых регистров позволяет время преобразования адреса при работе в защищенном режиме сделать почти равным времени преобразования

В случае страничной организации памяти из линейного адреса происходит переход к физическому адресу.

PDE – Page Directory Entry.

PTE – Page Table Entry.

PDBR – Page Directory Base Register.

... PDE ...
... PTE ...
  Страничный кадр Байт
PDBR
Каталог Таблица Смещение
Каталог страниц
31 0
31 … 0
Физическая память
CR3
31 22 21 12 11 0
19 0
 
 
 
 
Таблицы страниц

В процессоре имеется специальная ассоциативная страница буфера. Таким образом, операция происходит в процессоре без обращения к памяти. На страничном уровне поддерживается только два уровня привилегий: системный и пользовательский.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: