У него есть СЕЛЕКТОР и СМЕЩЕНИЕ.
· Селектор определяет ВИРТУАЛЬНЫЙ СЕГМЕНТ.
· Смещение – понятно.
· Селектор помещается в один из СЕГМЕНТНЫХ РЕГИСТРОВ процесса
Структура этого селектора:
А) Индекс (номер в таблице) (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
- выключить поддержку страничной адресации
Все. Все остальное делает процессор САМ:
· быстро аппаратно преобразует виртуальные адреса в физические
· гарантирует защиту данных
А вот про защиту – это уже другая история, а именно - следующий вопрос.