 Уровень привилегий запроса RPL задается битами 0,1 селектора, загруженного в сегментный регистр при обращении к соответствующему сегменту. Этот уровень устанавливается выполняемой программой, которая с помощью данного селектора обращается к памяти системы.
Текущий уровень привилегий CPL задается битами 0, 1 селектора, размещенного в регистре сегмента программ CS. Определяет уровень привилегий выполняемого в настоящий момент сегмента программы.
Напомним, что меньшее значение DPL, RPL, CPL соответствует более высокому уровню привилегий (защиты). Наиболее защищенный сегмент имеет значение DPL = 0, наименее защищенный - DPL = 3. Для наименее привилегированных программ пользователя CPL = 3, наиболее привилегированные программы ядра ОС имеют CPL = 0.
Процессор имеет специальную команду ARPL, используемую для коррекции значения RPL селектора. Данная команда выполняет сравнение двух младших битов селекторов, предварительно загруженных в адресуемые командой регистры или ячейку памяти. Результатом команды является селектор, в котором эти биты имеют максимальное из значений, заданных в исходных селекторах.
Обращение к сегментам программ и данных в защищенном режиме производится с учетом описанной выше системы привилегий. При этом правила обращения зависят от типа сегмента.
Обращение к сегментам данных производится с помощью селекторов, загружаемых в регистры DS, ES, FS, GS. При обращении анализируются значения RPL селектора и CPL текущей программы. Эффективный уровень привилегий для запроса данных в этом случае определяется как максимальное из значений RPL и CPL. Обращение к запрашиваемому сегменту данных разрешается, если его уровень защиты DPL >= max(RPL, CPL). Нарушение этого правила при обращении вызывает исключение типа #GP («нарушение общей защиты»).
Таким образом, задавая определенное значение RPL в селекторе, можно управлять доступом текущей программы к сегментам данных, имеющим различный уровень защиты. Например, при RPL = 0 доступ к данным будет определяться значением CPL текущей программы. Если задать RPL = 3, то при любом CPL программа может обратиться только к наименее защищенным сегментам данных, относящимся к кольцу 3.
Обращение к сегменту стека выполняется путем загрузки селектора в регистр SS. Этот селектор должен выбирать дескриптор сегмента с разрешенной записью, т. е. бит 1 в байте доступа должен иметь значение W = 1 (см. рис. 2.43, б). Значения RPL и DPL должны быть равны CPL. Нарушение этих правил (обращение к сегменту, для которого W = 0; использование селекторов и дескрипторов, имеющих значения RPL и DPL, не равные CPL) приводит к исключению типа #GP. При обращении к дескриптору, имеющему значение бита присутствия Р = 0 (отсутствующий сегмент) возникает исключение типа #SS («ошибка обращения к стеку»).
Обращение к сегментам программ (передача управления) реализуется при выполнении команд межсегментного перехода JMP, вызова подпрограммы CALL и возврата из подпрограммы RET, прерывания INT и возврата из прерывания IRET. Правила обращения к сегментам программ зависят от значения бита подчиненности С в байте доступа дескриптора (см. рис. 2.43, а).
|