Rambler's
Top100

Сегментация в защищенном режиме

Автор: lonesome TSH/Digital Daemons
Дата: .01.2003
Раздел: Разработка ОС

Начиная с 80386 сегментные регистры в процессорах Intel имеют размер уже не 2 байта, а 10 байт. "Теневые" 8 байт недоступны ни для чтения, ни для записи, они используются только процессором.

Сегментная адресация в защищенном режиме осуществляется при помощи специальных таблиц дескрипторов - глобальной таблицы (GDT), к которой имеют доступ все выполняющиеся задачи, и локальной таблицы (LDT) - своей для каждой задачи.

Таблицы дескрипторов состоят из восьмибайтных дескрипторов. (эти самые 8 байт и помещаются в теневую часть сегментных регистров при их загрузке)

Формат дескриптора:
байты 0-1: биты 15-0 лимита сегмента
байты 2-3: биты 15-0 базы сегмента
байт 4: биты 23-16 базы сегмента
байт 5: байт доступа

байт 6: байт 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 - общая ошибка защиты)



Rambler's Top100