10.4.1. Модель памяти в защищенном режиме

Мы уже неоднократно описывали сегментную адресацию, рассказывая о на­значении сегментных регистров в реальном режиме или о программировании для расширителей DOS в защищенном режиме, но каждый раз для немедленных нужд

требовалась только часть всей этой сложной модели. Теперь самое время рассмот­реть ее полностью.

Для любого обращения к памяти в процессорах Intel используется логический адрес, состоящий из 16-битного селектора, который определяет сегмент, и 32- или 16-битногосмещения - адреса внутри сегмента. Отдельный сегмент памяти - это независимое защищенное адресное пространство. Для него указаны размер, раз­решенные способы доступа (чтение/запись/исполнение кода) и уровень приви­легий (см. раздел 10.7). Если доступ к памяти удовлетворяет всем условиям за­щиты, процессор преобразует логический адрес в 32- или 36-битный (на Р6) ли­нейный. Линейный адрес - это адрес в несегментированном непрерывном адресном пространстве, совпадающий с физическим адресом в памяти, если от­ключен режим страничной адресации (см. раздел 10.6). Чтобы получить линей­ный адрес из логического, процессор добавляет к смещению линейный адрес на­чала сегмента, который хранится в поле базы в сегментном дескрипторе. Сегмен­тный дескриптор - это структура данных, расположенная в таблице GDT или LDT; адрес таблицы находится в регистре GDTR или LDTR, а номер дескриптора в таблице определяется по значению селектора.

Дескриптор для селектора, находящегося в сегментном регистре, не считывает-ся из памяти при каждом обращении, а хранится в скрытой части сегментного ре­гистра и загружается только при выполнении команд MOV (в сегментный регистр), POP (в сегментный регистр), LDS, LES, LSS, LGS, LFS и дальних команд перехода.