Уровень привилегий выполняемой программы носит название текущий уровень привилегий CPL (Current Privilege Level). Он равен значению DPL в байте доступа дескриптора, определяющего текущий кодовый сегмент. При выборе дескриптора кодового сегмента из соответствующей дескрипторной таблицы и запоминании его в кэш-регистре CSт значение CPL копируется в поле RPL селектора кодового сегмента, размещаемого в регистре CS. Так как регистр CS нельзя использовать в качестве приемника, то программа не может изменить содержимое CS, а следовательно, и не может изменить свой уровень привилегий. Однако с помощью команды ARPL текущий уровень привилегий CPL программно можно проанализировать.
Процессор автоматически проверяет право программы на доступ к другому сегменту путем сравнения уровня привилегий программы CPL с уровнем привилегий сегмента DPL, к которому происходит обращение.
При всех межсегментных обращениях перед тем, как адресовать операнд в памяти (т.е. перед началом цикла обмена), программа загружает селектор в один из сегментных регистров, при этом аппаратно выполняется проверка возможности обращения к адресуемому операнду.
Критерий защиты (проверка уровня привилегий) зависит от типа сегмента назначения.
Проверку уровней привилегий удобно представить в виде схемы (Рис.)
Селектор
кодового Дескриптор кодового
сегмента
сегмента текущей задачи
CPL CS DPL CSт
Доступ
![]() |
Селектор целевого сегмента
Дескриптор
RPL DPL целевого
Доступ сегмента
![]() |
Рис. Схема проверки уровня привилегий при межсегментных обращениях
Для доступа к сегменту данных необходимо, чтобы уровень привилегий дескриптора запрашиваемого сегмента DPL был больше или равен наибольшему из значений текущего CPL и запрашиваемого RPL уровней привилегий
DPL ³ max (RPL \/ CPL) (*)
Нарушение критерия защиты (*) предотвращает начало цикла обмена и приводит к обработке исключения.
Таким образом, обращение к другому сегменту может быть выполнено только в случае, если текущая программа более привилегированна, чем вызываемый ею сегмент. В отношении данных это правило можно трактовать следующим образом: чем выше уровень привилегированности программы, тем к более защищенным данным она может обратиться.
Для доступа к сегменту кода (при межсегментных передачах управления) ограничения защиты более жесткие. Программам i-того уровня не разрешается передавать управление (командами Far Call и Far Jmp) коду с уровнем привилегий, отличном от i. Т.е., передачи управления ограничиваются кольцом уровня привилегий текущей программы, и при нарушении этого правила формируется исключение общей защиты. Критерий защиты при межсегментных передачах управления в общем случае имеет вид
DPL = max (RPL \/ CPL)
Очевидно, что при RPL > CPL требования защиты нарушаются, поэтому для правильной работы необходимо следить, чтобы значение RPL не превышало CPL.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.