Сегментация в защищенном режиме
Начиная с 80386 сегментные регистры в процессорах Intel имеют размер
уже не 2 байта, а 10 байт. "Теневые" 8 байт недоступны ни для чтения, ни
для записи, они используются только процессором.
Сегментная адресация в защищенном режиме осуществляется при помощи
специальных таблиц дескрипторов - глобальной таблицы (GDT), к которой
имеют доступ все выполняющиеся задачи, и локальной таблицы (LDT) - своей
для каждой задачи.
Таблицы дескрипторов состоят из восьмибайтных дескрипторов. (эти
самые 8 байт и помещаются в теневую часть сегментных регистров при их
загрузке)
Формат дескриптора:
байты 0-1: биты 15-0 лимита сегмента
байты
2-3: биты 15-0 базы сегмента
байт 4: биты 23-16 базы сегмента
байт
5: байт доступа
бит 7: бит присутствия сегмента
биты 6-5: уровень привилегий
бит 4: тип дескриптора (для GDT - 1)
бит 3: тип сегмента (0 - сегмент данных, 1 - сегмент кода)
бит 2: для сегмента данных: расширение вниз, для сегмента кода:
подчиненность
бит 1: для сегмента данных: разрешение записи, для сегмента кода:
разрешение чтения
бит 0: бит обращения (1 - к дескриптору было обращение)
байт 6:
бит 7: гранулярность сегмента (0 - лимит в байтах, 1 - лимит -
количество 4-килобайтных единиц)
бит 6: бит разрядности сегмента(0-16бит, 1-32бит)
биты 3-0: биты 19-16 лимита
байт 7: биты 31-24 базы сегмента
База селектора - байт, с которого начинается описываемый сегмент. Лимит
- размерность сегмента.
Рассмотрим пример дескриптора:
FF, FF, 00, 00, 00, 92, CF,
00
Этот дескриптор описывает сегмент данных с базой 0,
гранулярностью 1 и лимитом FFFFF, т.е. - с помощью этого дескриптора можно
обращаться ко всем доступным процессору 4 гигабайтам памяти.
В защищенном режиме в сегментных регистрах присутствуют селекторы
сегментов - которые фактически являются указателями на необходимый
дескриптор в таблице.
Формат селектора таков:
биты 16-3: номер дескриптора в
таблице
бит 2: бит используемой таблицы (0 - GDT, 1 - LDT)
биты 1-0:
уровень привилегий для обращения к сегменту
Пример
селектора:
00001000b - селектор, указывающий на первый
дескриптор в таблице GDT, требуемый уровень привилегий - 0
(наивысший).
Нулевой дескриптор (дескриптор с порядковым номером 0) не используется
и любое обращение к сегменту, описанному нулевым дескриптором приводит к
исключению GP (General Protection Fault - общая ошибка защиты)