Глава 2. Использование уровней привилегий.
2.1. Уровни привилегий.
Механизм защиты использует 4 уровня привилегий - от 0 до 3. Большее значение соответствует меньшим привилегиям. На рис. 2-1 показано, как эти уровни привилегий могут быть интерпретированы как кольца защиты. Центр, предназначенный для наиболее привилегированного кода, данных и стека, используется для сегментов, содержащих наиболее важные компоненты системы, такие, как ядро операционной системы. Внешние кольца используются для менее важных частей системы. Для систем, использующих только два из четырёх уровней привилегий, рекомендуется использовать уровни 0 и 3.
1. | "PL" означает "уровень привилегий" (сокращение от англ. Privilege Level). |
2. | Синим цветом выделено рекомендуемое расположение компонентов операционной системы |
Когда процессор обнаруживает нарушение использования уровней привилегий, он генерирует исключение общей защиты. Процессор использует три обозначения уровней привилегий:
Текущий уровень привилегий - CPL (Current privilege level). CPL - это уровень привилегий текущего исполняемого кода. Он хранится в битах 0 и 1 регистров CS и SS. Обычно, CPL равен уровню привилегий сегмента кода, из которого выбираются команды. Процессор меняет CPL, когда управление передаётся сегменту кода с другим уровнем привилегий. CPL интерпретируется немного иначе, когда управление передаётся подчинённому сегменту кода. Подчинённый сегмент кода доступен с тех уровней привилегий, которые численно не меньше, чем DPL подчинённого сегмента кода. CPL не меняется, когда происходит передача управления на подчинённый сегмент кода, имеющий уровень привилегий, отличный от CPL.
| Запрашиваемый уровень привилегий - RPL (Requested privilege level). RPL - это уровень привилегий, назначаемый селекторам сегментов. Он хранится в битах 0 и 1 селектора сегмента. Процессор проверяет RPL совместно с CPL, определяя возможность доступа к сегменту. Даже если программа или задача, запрашивающая доступ к сегменту, имеет достаточные привилегии для доступа, доступ будет запрещён, если RPL не имеет достаточных привилегий. Таким образом, если RPL селектора сегмента численно превосходит CPL, то значение RPL будет решающим и наоборот. RPL можно использовать для обеспечения того, что привелигерованный код не обратится к сегменту от имени прикладной программы, пока эта программа не получит достаточных на то привилегий.
| Уровень привилегий дескриптора - DPL (Descriptor privilege level). DPL - это уровень привилегий сегмента или шлюза. Он хранится в поле DPL дескриптора сегмента или шлюза. При попытке доступа из текущего сегмента кода к другому сегменту кода или шлюзу, DPL целевого дескриптора сравнивается с CPL и RPL. В зависимости от типа сегмента или шлюза, DPL интерпретируется следующим образом:
|
|
Уровни привилегий проверяются, когда селектор дескриптора сегмента загружается в сегментный регистр. Проверки, используемые для доступа к данным отличаются от проверок, используемых для передачи управления другим сегментам кода. Эти два типа проверок рассматриваются далее отдельно.
2.2. Проверка уровня привилегий при доступе к сегментам данных.
Для доступа к операнду в сегменте данных, необходимо загрузить в сегментный регистр (DS, ES, FS или GS) селектор дескриптора сегмента данных. Для этого предназначены команды MOV, POP, LDS, LES, LFS и LGS.
Перед тем, как загрузить селектор в сегментный регистр, процессор проверяет уровень привилегий, сравнивая уровень привилегий текущего кода (CPL), RPL селектора и DPL дескриптора. Загрузка селектора производится, когда DPL больше либо равен CPL или RPL, иначе загрузка не произойдёт и процессор сгенерирует исключение общей защиты.
Адресное пространство процедуры или задачи зависит от значения её CPL. Когда CPL = 0, доступны сегменты данных на всех уровнях привилегий, при CPL = 1 - на уровнях 1, 2 и 3, при CPL = 3 - только на 3-м уровне.
Прикладная программа может изменить RPL селектора, например, установить его в 0, и тогда проверка доступа будет осуществляться только по CPL.
2.3. Доступ к данным в сегменте кода.
В некоторых случаях может понадобиться доступ к данным (точнее - чтение), содержащимся в сегменте кода; для этого возможны следующие способы:
Загрузить в сегментный регистр данных селектор сегмента кода, разрешённого для чтения.
| Использовать префикс замены сегмента (CS) для чтения сегмента кода, разрешённого для чтения, чей селектор уже загружен в регистр CS.
| |
2.4. Проверка уровня привилегий при загрузке регистра SS.
Уровень привилегий стека должен быть таким же, как и у кода, т.е. RPL селектора сегмента стека должен быть равен его DPL и CPL сегмента кода. В противном случае, генерируется исключение общей защиты.
Следующая глава | Оглавление | Вопросы? Замечания? Пишите: sasm@narod.ru |
Copyright © Александр Семенко. |