Методы защиты в процессорах семейства Х86, страница 3

CPL – определяет уровень привилегий выполняемой в данный момент процессором задачи, т.е. процесса. Поэтому, иногда говорят, что CPL является уровнем привилегий процессора. Он идентифицируется состоянием двух младших разрядов сегментного регистра CS. При передаче управления сегменту кода с другим уровнем привилегий процессор будет работать на новом уровне привилегий, соответствующим новому состоянию младших битов сегментного регистра. Таким образом, CPL задачи может измениться только при передаче управления к новому кодовому сегменту через дескриптор шлюза. Задача, выполняемая на нулевом уровне привилегий, имеет доступ ко всем сегментам данных, описанным в глобальной дескрипторной таблице, и является самой привилегированной.

                       Атрибут уровня привилегий дескриптора (DPL).

Правильнее говорить про уровень привилегий сегмента, описываемого этим дескриптором, поскольку сам дескриптор уровня привилегий не имеет.

Атрибут уровня привилегий дескриптора (сегмента) идентифицируется битами поля DPL в его байте прав доступа. Если дескриптор описывает сегмент данных, то все данные внутри сегмента имеют уровень привилегий, содержащийся в поле DPL. В случае сегмента кода, весь код в сегменте также находится на уровне привилегий, определяемом полем DPL байта прав доступа. Значения битов DPL определяют наименьший уровень привилегий, с которым возможен доступ к данному дескриптору (а, следовательно, и к содержимому сегмента, которого он определяет). Заметим, что в системном дескрипторе, описывающем сегмент локальной дескрипторной таблицы, поле DPL не используется.

                       Атрибут уровня привилегий селектора (RPL).

Уровень привилегий селектора идентифицируется полем RPL – двумя младшими битами селектора. Эти два бита селектора определяют максимальный запрашиваемый уровень привилегий дескриптора сегмента данных или стека, к которому происходит обращение. Если же данный селектор требует обращения к сегменту, уровень привилегий которого выше, чем запрашиваемый уровень привилегий, то обращения не происходит и процессор уходит на прерывание, т.е. возникает особый случай (исключение). Формируется нарушение общей защиты. Другими словами, значение поля RPL численно должно быть всегда меньше или равно значению поля DPL выбираемого дескриптора.

Основные правила защиты по привилегиям сегментов.

                         Защита сегментов данных.

Основное правило защиты доступа к данным заключается в том, что процессор не разрешает обращаться к данным, которые более привилегированны, чем выполняющаяся программа. Это правило, следовательно, может быть представлено в виде выражения: DPL ≥ CPL.                                          

Когда программа пытается осуществить обращение к данным с нарушением этого правила, процессор отказывается выполнять эту команду, уходит на прерывание и сообщает о нарушении общей защиты. Проверка этого правила осуществляется при загрузке селектора в один из сегментных регистров данных DS, ES, FS или GS. Если DPL того сегмента, которого выбирает селектор, численно меньше CPL, процессор не загружает селектор и формирует нарушение общей защиты.

Однако это правило, практически, несколько расширяется. Дело в том, что уровень привилегий вызываемого сегмента должен быть в то же время ниже или равен запрашиваемому селектором уровню привилегий  RPL. Следовательно, уровень привилегий вызываемого сегмента должен быть равен или меньше как уровня привилегий текущей задачи, так и запрашиваемого уровня привилегий. Таким образом, выражение, определяющее правила доступа к сегментам данных приобретает вид:

                    DPL ≥ max (CPL, RPL) = EPL

где  EPL (Effective Privilege Level) – эффективный уровень привилегий.

Отсюда следует, что, задавая определенное значение RPL в селекторе, можно управлять доступом текущей программы к сегментам данных, имеющим различный уровень защиты. Например, при RPL = 0 доступ к данным будет определяться только значением CPL, т.е. уровнем привилегий текущей программы. Если же задать RPL = 3, то при любом CPL программа может обратиться только к наименее защищенным сегментам данных, размещенных в кольце 3 системы защиты.

При загрузке селектора в сегментный регистр стека SS правила защиты  ужесточаются еще больше. Загрузка разрешается только в том случае, если значение DPL сегмента стека точно равна значению CPL. Напомним к тому же, что загрузка селектора в регистр SS допускается, кроме этого, только тогда, когда выбираемый сегмент допускает операции, как считывания, так и записи.

                                  Защита сегментов кода.

Защита сегментов кода основывается на том, что прямая передача управления сегменту кода, находящемуся на другом уровне привилегий  запрещена, независимо от того, на более низком  или на более высоком уровне привилегий он находится.

Следовательно, непосредственные обращения между сегментами кода, а также между сегментами кода и сегментами данных, в пределах колец защиты и между ними может быть иллюстрирована рис. VI.3.

 

Рис.VI.3. Правила обращения  в пределах колец защиты и между ними.

Однако в процессе выполнения программ процессор обязательно должен иметь возможность передавать управление программам, находящимся в сегментах, расположенных на разных уровнях привилегий. Например, при выполнении пользовательских программ, которые размещаются на наименее привилегированном уровне (PL3 –программы), процессор должен всегда иметь доступ к процедурам обслуживания, располагающихся на уровне PL1. Даже операционная система MS-DOS через прерывание INT21h предоставляет программам пользователя более 150 разнообразных функций обслуживания.

Поэтому в процессорах семейства Х86 предусматриваются два различных способа передачи управления к сегментам кода, находящихся на другом уровне привилегий. Первый заключается в использовании возможности перевода сегментов кода в режим подчиненности, а второй – в использовании для передачи управления специальных дескрипторов – шлюзов вызова.