Адресация в защищенном режиме.


Если Ti = 0, то адресация идет по глобальной дескрипторной таблице, иначе по локальной дескрипторной таблице.

Адресация по глобальной дескрипторной таблице.
1. По содержимому регистра GDTR определяем адрес в глобальной дескрипторной таблице.
2. По содержимому селектора (бит TI = 0) определяем, что адресация идет по GDT.
3. По содержимому поля INDEX, определяем номер дескриптора в GDT.
4. Проверяются права доступа.
5. Из поля базы выбирается базовый адрес сегмента.
6. Базовый адрес складывается с эффективным адресом
7. Производится проверка на попадание полученного адреса в пределы сегмента.
8. По полученному адресу производится обращение к ячейке памяти.

Адресация по локальной дескрипторной таблице
1. Определяется адрес GDT.
2. По полю TI = 1 определяется, что адресация будет происходить по LDT.
3. Из регистра LDTR определяем номер дескриптора, описывающего LDT.
4. Из поля базы этого дескриптора определяем базовый адрес LDT.
5. По полю INDEX в селекторе определяем конкретный дескриптор LDT.
6. Поле базы выбранного дескриптора складывается с эффективным адресом и получаем линейный адрес.

Структура дескриптора.
Дескриптор GDT.

База – базовый адрес сегмента (размер 32 бита).
Предел – верхняя граница сегмента. Для сегмента стека это нижняя граница.
Байт AR – права доступа. Байт, который описывает этот сегмент.
Бит U (user – пользовательский бит) – используется по усмотрению программиста.
Бит X – всегда равен нулю. Зарезервирован для будущего использования.
Бит D – бит совместимости с 286-м процессором.
Бит G – бит гранулярности. Единица измерения размеров сегмента. если 1, то предел указан в 4КБ страницах, иначе в байтах.

Байт AR.

Бит P называется битом присутствия. Показывает находится ли этот сегмент на ОЗУ или диске. Если Р = 1, то сегмент находится в физическом ОЗУ, если Р = 0, то нижний сегмент находится на диске. Процессор сгенерирует исключение и сегмент автоматически подгрузится.
Два бита DPL – уровень привилегий сегмента. Значения от 0 до 3. Самый старший уровень — 0.
Бит S – показывает, что описывает сегмент или системный объект. S = 1 означает, что это системный объект.
TYPE – 3 бита. Показывают тип сегмента.
Бит А – бит доступа. Служит для оптимизации виртуальной памяти. Показывает, что за какой-то промежуток времени к нему было произведено обращение. Время определяется ОС.
Бит 2 – показывает является ли сегмент данных или кода. Если 0, то сегмент данных, если 1, то сегмент кода.
Бит 0 – если 0, то для чтения, если 1, для чтения и записи.
Подчиненный сегмент кода используется для защиты.
Если Бит2 = 1 и Бит0 = 0, то сегмент кода только для выполнения, если Бит0 = 1, то для выполнения и чтения.
Если гранулярность 0, то бит памяти в самых старших областях сегмента.
Формат дескриптора LDT.
Если бит Р = 0, то вся таблица LDT не присутствует и её надо загрузить с диска.
Особенности сегментации.
Существуют 2 структуры: перекрывающая и не перекрывающая.

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

Страничная организация памяти.
Виртуализация применяется для расширения адресного пространства, доступного прикладным программам. Всё адресное пространство процессора разбито на страницы, размером по 4Кб. Это виртуальные страницы.
Задача состоит в том, чтобы преобразовать виртуальную страницу к физической странице. Физическая страница – это физический адрес.

Одноуровневое физическое преобразование.
Одноуровневое физическое преобразование не применяется из-за большого расхода памяти под таблицу страниц – 4Кб.
Двухуровневое физическое преобразование.

Служебный регистр CR3 содержит 20 бит физического адреса каталога страниц памяти. Существует каталог страниц, который содержит 1024 номера таблиц страниц.
Линейный адрес разбивается на 3 части: младшие 12 бит – смещение внутри страниц, средние 10 бит – номер внутри таблицы страниц, старшие 10 бит – номер в каталоге страниц.
Старшие 10 бит линейного адреса выбирают элемент PDE, который содержит 20-тибитный адрес таблицы страниц. Средние 10 бит индексируют элемент таблицы PTE. Он содержит 20-тибитный адрес страницы в физической памяти. Полученный 20-тибитный адрес, дополненный 12 младшими нулями, складывается с 12-тибитным смещением и получается 32-хбитный физический адрес, по которому происходит обращение.

Формат элементов таблицы страниц PTE.

A – Access (доступ), D – Dirty (грязный).
Бит Р – бит присутствия.
Если Р = 1 – страница в ОЗУ.
Если Р = 0, то:
1. Копирует страницу с диска в физическое ОЗУ.
2. Заполняется поле адреса в таблице PTE и устанавливается бит Р = 1.
3. Обновить буфер TLB (кеш).
4. Выполнить рестарт команды, вызвавшей страничное нарушение.

DPL – уровень привилегий дескриптора.
CPL – уровень привилегий дескриптора, который выполняется.
RPL
IOPL
1. Четыре группы команд, позволяющие оперировать с дескрипторами таблиц.
llt
lldt sldt
lgdt sgld
Lidt sidt
in out команды
ins outs ввода
sti cli вывода.
2. Запрещается доступ к более привилегированным данным. Запрещается обращение к стеку на не своем уровне привилегий.
3. Запрещается передача управления вне своего кольца защиты. Значение регистра IP должно попадать в сегмент (в его размер).

2-й механизм: шлюзы вызова. Шлюз позволяет передавать управление между кольцами защиты.

Мультизадачность.

TSS – сегмент состояния задач.
1. Контекст задач – это блок информации, необходимый для того, чтобы прерванная задача успешно продолжила работу.
2. Переключение контекста – действие процесса по «фотографированию» выходящей задачи и продолжению выполнения другой.
Задача – это совокупность кода и данных с назначенным блоком TSS. Для каждой задачи существует единственный блок TSS. Этот сегмент адресуется специальным дескриптором.

S – означает, что это системный объект.
P – бит присутствия.
При переключении задачи проверяется бит В.
67h – минимальный размер памяти, чтобы задача полностью сохранила своё состояние.

Загрузка...