Адресация и многозадачность: Селекторы |
Программирование - Архитектура и система команд микропроцессоров 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.
Указывает на нужный дескриптор в таблице дескрипторов. Процессор умножает значение этого поля на 8 (размер дескриптора) и прибавляет к базовому адресу таблицы дескрипторов из регистра GDTR или LDTR. Полученное значение и является адресом дескриптора.
|
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru