Встроенные средства защиты. Принципы модульности и перемещаемости. Проверка привилегированности сегмента, страница 4

Уровень привилегий выполняемой программы носит  название текущий уровень привилегий 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.