Организация вычислительных систем


Защищенный режим (Protected Mode) - часть 8


Рис. 4.3.  Интерпретация уровней привилегий в виде колец защиты

Механизм контроля уровня привилегий микропроцессора оперирует следующими значениями:

CPL - текущий уровень привилегий (Current Privilege Level): уровень привилегий, на котором в данный момент исполняется задача. Значение CPL хранится в поле RPL селектора сегмента кода, который помещен в регистр CS. Обычно это значение соответствует уровню привилегий дескриптора исполняемого сегмента кода. Уровень привилегий меняется, когда управление передается сегменту кода с другим значением DPL (за исключением подчиняемых сегментов кода).

DPL - уровень привилегий дескриптора (Descriptor Privilege Level): наименее привилегированный уровень, на котором задача может получить доступ к сегменту или шлюзу, связанному с этим дескриптором. Уровень DPL определяется битами 46 и 45 дескриптора.

RPL - запрашиваемый уровень привилегий (Requested Privilege Level) используется для временного понижения своего уровня привилегий при обращении к памяти. RPL заносится в младшие биты селектора.

Механизм контроля уровня привилегий обычно сравнивает уровень привилегий дескриптора (DPL) с максимальным из двух чисел CPL и RPL. Наименее привилегированный из текущего уровня привилегий и запрашиваемого считается эффективным уровнем привилегий: EPL = max (CPL, RPL).

Контроль привилегий при доступе к данным осуществляется при загрузке селектора в сегментный регистр DS, ES, FS, GS (либо при обращении к памяти, если селектор содержится в коде инструкции). Программа может обратиться к сегменту данных, который находится на том же или более низком уровне привилегий (с учетом RPL), т.е. доступ к данным разрешен, если max(CPL, RPL)<= DPL; в противном случае генерируется нарушение общей защиты.

Контроль привилегий при доступе к стеку осуществляется при загрузке селектора в регистр SS. Программа должна использовать сегмент стека, находящийся на том же уровне привилегий, т.е. CPL = RPL = DPL.

Для передачи управления на обычный сегмент кода его уровень привилегий должен совпадать с текущим уровнем привилегий.


Начало  Назад  Вперед