Средства поддержки сегментной организации памяти в процессорах Пентиум
(собственно ответ на билет)
Процессор Пентиум – 32 разрядный, поэтому максимальный размер физической ОП, на которую он может отображать ВАП – 4 гига.
Процессор Пентиум может поддерживать как сегментную, так и сегментно-страничную организацию памяти.
· Сегментные средства работают всегда (верхний уровень);
· Страничные средства могут быть вкл/выкл (это нижний уровень);
Это делается в управляющем регистре CR0 – путем установки однобитного признака PE (Paging Enabling) в 0/1.
Итак, Пентиум работает в сегментном режиме.
1. У него есть ВАП, поделенный на СЕГМЕНТЫ.
2. У каждого сегмента есть описание – ДЕСКРИПТОР СЕГМЕНТА.
Формат дескриптора сегмента (размер – 8 байт)
Структура у дескриптора немного странная, это все пережитки истории.
Но в целом основные поля:
3. База – занимает 32 бита (4 байта) – содержит базовый адрес сегмента.
На рисунке желтая, видно, что состоит из 3 частей
4. Размер – занимает 24 бита (3 байта)
§ Поле G – единица измерения:
- 0 – байты (максимальный р-р сегмента – 64 кб)
- 1 – страницы по 4 кб
5. 5-й байт дескриптора (в красной рамке – байт доступа). – 8 бит (1 байт)
Он содержит:
§ Бит присутствия Р (1 бит):
o - 0 – сегмент не в памяти,
o - 1 – в памяти
§ DPL (Descriptor Privilege Level) – уровень привилегий для доступа к дескриптору (2 бит)
§ 5 бит – поля типа сегмента:
o - сегмент данных
o - сегмент кода
o - системный сегмент (GDT, TSS)
o И способ использования сегмента (чтение, запись, выполнение)
3. Дескрипторы объединяются в ТАБЛИЦЫ ДЕСКРИПТОРОВ (2 типа):
· Глобальная таблица дескрипторов(GDT) – сегменты межпроцессного взаимодействия, сегменты ОС, общие сегменты для всех процессов
· Локальная таблица дескрипторов (LDT) – у каждого процесса своя.
· (IDT – Interrupt Descriptor Table –таблица дескрипторов прерываний – используется системой прерываний для их обработки)
GDT – одна
LDT – столько, сколько процессов, при этом в каждый момент времени используется только одна.
Таблицы GDT и LDT размещены в памяти в виде отдельных сегментов.
Таблица GDT кроме всего прочего, хранит в себе данные о себе самой и обо всех LDT.
Адреса GDT и LDT хранятся в регистрах системных адресов GDTR и LDTR соответственно.
В GDTR хранится 32 разрядный физический адрес
В LDTR – индекс дескриптора в таблице GDT, а уже адрес нужной LDT берется из этой записи.
Итак, процесс обратился за памятью. Что происходит?
У него есть СЕЛЕКТОР и СМЕЩЕНИЕ.
· Селектор определяет ВИРТУАЛЬНЫЙ СЕГМЕНТ.
· Смещение – понятно.
· Селектор помещается в один из СЕГМЕНТНЫХ РЕГИСТРОВ процесса
Структура этого селектора:
А) Индекс(номер в таблице) (13 бит) – всего сегментов может быть 2 13 (8 килобайт) каждого типа, т.е. 16 килобайт (2 16). 16Кбайт * 4 Гбайта = 64 Тбайт – максимальный размер ВАП. До фига, в общем.
Б) Таблица, где его искать: глобальная или локальная (1 бит)
В) Требуемый уровень привилегий, чтобы с ним работать RPL (2 бита)
· Смещение задается МАШИННОЙ ИНСТРУКЦИЕЙ (под него отведено 32 бита – отсюда максимальный размер сегмента – 4 Гига)
Вариант 1: оказалось, что нужный сегмент – в GDT:
· Адрес GDT взят из регистра GDTR
· Сложили базовый адрес с индексом сегмента, сдвинутым на 3 разряда влево (зачем, я не въехала, но не суть)
· Получили ФИЗИЧЕСКИЙ АДРЕС ДЕСКРИПТОРА СЕГМЕНТА
· Извлекли дескриптор из памяти:
o - проверили, не больше ли смещение величины сегмента (если чего - прерывание)
o - проверили права доступа – (если чего, прерывание)
o - проверили, есть ли он в памяти (бит присутствия Р) – если чего, ну, вы поняли.
· Если все хорошо – приплюсовали смещение и радуемся.
Вариант 2: оказалось, что нужный сегмент – в LDT:
· Добываем базовый адрес таблицы LDT из GDT и LDTR
· Ну а дальше все по накатанной.
Таким образом, ОС, работая на Пентиуме должна всего лишь:
- сформировать таблицы GDT и LDT
- загрузить GDT в оперативу
- загрузить указатели на них в регистры GDTR и LDTR
- выключить поддержку страничной адресации
Все. Все остальное делает процессор САМ:
· быстро аппаратно преобразует виртуальные адреса в физические
· гарантирует защиту данных
А вот про защиту – это уже другая история, а именно - следующий вопрос.