Адресация и многозадачность: Селекторы

Печать
Программирование - Архитектура и система команд микропроцессоров x86

 

Селектор — это 16-битная величина, которая однозначно указывает на дескриптор в одной из таблиц дескрипторов. Селекторы помещаются в сегментные регистры и являются важнейшим компонентом механизмов адресации и защиты. Формат селектора приведен на рис. 2.9.

Процессор полностью проверяет корректность селектора и дескриптора сегмента при загрузке селектора в сегментный регистр. Существуют т.н. нулевые селекторы, которые указывают на первый дескриптор в глобальной таблице дескрипторов GDT. Этот дескриптор не используется, поэтому при загрузке нулевого селектора в сегментные регистры DS, ES, FS или GS никаких проверок не производится, однако при попытке обращения к памяти с нулевым селектором генерируется ошибка общей защиты (#GP).

 

Формат селектора сегмента

Рис. 2.9. Формат селектора сегмента

 

RPL (Запрашиваемый уровень привилегий, биты 1, 0)

Определяет уровень привилегий, запрашиваемый селектором (наивысшие привилегии имеет уровень 0). При обращении к сегменту или шлюзу процессор осуществляет проверку прав доступа на основе поля DPL дескриптора сегмента или шлюза и текущего уровня привилегий CPL. Обычно в программах CPL = RPL, но если числовое значение RPL выше CPL, то при проверках используется именно это значение вместо CPL. Например, если программа с CPL = 0 попытается с помощью селектора с RPL = 3 получить доступ к сегменту с DPL = 2, то будет сгенерирована ошибка общей защиты (#GP).

Само значение текущего уровня привилегий CPL — это значение поля RPL в селекторах, находящихся в регистрах CS и SS во время выполнения программы. CPL изменяется каждый раз, когда управление передается в кодовый сегмент с новым уровнем привилегий. При обращении к согласованному кодовому сегменту поведение процессора несколько иное. В этом случае CPL не изменяется и выполнение кода согласованного сегмента производится не на уровне привилегий сегмента, а на уровне привилегий программы, передавшей управление в сегмент.

 

TI (Бит указания таблицы, бит 2)

Задает, какую таблицу дескрипторов необходимо использовать. TI = 0 – GDT или TI = 1 – LDT.

 

Index (Индекс, биты 15..3)

Указывает на нужный дескриптор в таблице дескрипторов. Процессор умножает значение этого поля на 8 (размер дескриптора) и прибавляет к базовому адресу таблицы дескрипторов из регистра GDTR или LDTR. Полученное значение и является адресом дескриптора.