Сделай Сам Свою Работу на 5

Уровни привилегий и кольца защиты защищенного режима.

Концепция уровней привилегий.

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

Уровни привилегий обычно изображаются в виде колец защиты, показанных на рис. 5. Внешние кольца защиты соответствуют более высокому логическому уровню управления, но наименьшему уровню защиты.

Механизм защиты МП х86 поддерживает до четырех уровней привилегий. Количество реализованных уровней привилегий определяется используемой операционной системой. Операционная система необязательно должна поддерживать все четыре уровня привилегий.

Четыре уровня привилегий МП iх86 обозначаются номерами: 0, 1, 2 и 3. Чем меньше номер уровня, тем меньше его логический уровень управления, но тем более он привилегирован и имеет большую степень защиты. Уровень 0 является наиболее, а уровень 3 - наименее привилегированными.

На рис. 5 нулевой уровень привилегий присвоен ядру операционной системы. Первый уровень предназначен для драйверов устройств и утилит. Второй уровень - для программ разработчиков комплексных систем. Третий уровень - для программ пользователей.

Проверка защиты по уровням привилегий осуществляется при выполнении почти каждой машинной команды во время работы МП в защищенном режиме (Р-режиме). МП в Р-режиме постоянно следит за тем, чтобы текущая программа была достаточно привилегированна для:

· выполнения некоторых (привилегированных) команд;

· обращения к данным других программ;

· передачи управления внешнему (по отношению к самой программе) коду командами передачи управления типа FAR.

Строго говоря, в МП iх86 реализованы две системы защиты по уровням привилегий. Вторая (дополнительная) система реализована в рамках механизма трансляции страниц и рассматривается в разд. 4.2.3.



….

Привилегированные команды

Привилегированные команды — это команды, которые могут быть выполнены только при определенном уровне привилегий текущего кода CPL (Current Privilege Level). В процессорах Pentium поддерживается четыре уровня привилегий, от самого привилегированного нулевого, до наименее привилегированного третьего. С помощью привилегированных команд осуществляется защита структур операционной системы от некорректного поведения пользовательских процессов, а также взаимная защита ресурсов этих процессов. (Механизм задания привилегий более детально рассмотрен ниже, в разделах, посвященных средствам управления памятью, так как уровни привилегий используются для определения не только допустимости выполнения той или иной команды, но и возможности доступа исполняемого кода к сегментам данных и кодов, включенным в виртуальное адресное пространство процесса.)

 

В процессоре Pentium к привилегированным командам относятся:

· команды для работы с управляющими регистрами CRn, а также для загрузки регистров системных адресов GDTR, LDTR, IDTR и TR;

· команда останова процессора HALT;

· команды запрета/разрешения маскируемых аппаратных прерываний CLI/SLI;

· команды ввода-вывода IN, INS, OUT, OUTS.

Первые две группы команд могут выполняться только при самом высшем уровне привилегий кода, то есть при CPL=0. Для двух последних групп команд, иногда называемых чувствительными, условия выполнения не требуют высшего уровня привилегий кода, а связаны с соотношением уровня привилегий ввода-вывода IOPL и уровня привилегий кода CPL — выполнение этих команд разрешено в том случае, если CPL <= IOPL.

В процессоре Pentium используется мандатный способ определения прав доступа к сегментам памяти (называемый также механизмом колец защиты), при котором имеется несколько уровней привилегий и объекты каждого уровня имеют доступ ко всем объектам равного уровня или более низких уровней, но не имеют доступа к объектам более высоких уровней. В процессоре Pentium существует четыре уровня привилегий — от нулевого, который является самым высоким, до третьего — самого низкого (рис. 6.7). Очевидно, что операционная система может использовать механизм колец защиты по своему усмотрению. Однако предполагается, что нулевой уровень доступен для ядра операционной системы, третий уровень — для прикладных программ, а промежуточные уровни — для утилит и подсистем операционной системы, менее привилегированных, чем ядро.

Рис. 6.7. Кольца защиты

Система защиты манипулирует несколькими переменными, характеризующими уровень привилегий:

· DPL (Descriptor Privilege Level) — уровень привилегий дескриптора, задается полем DPL в дескрипторе сегмента;

· RPL (Requested Privilege Level) — запрашиваемый уровень привилегий, задается полем RPL селектора сегмента;

· CPL (Current Privilege Level) — текущий уровень привилегий выполняемого кода, задается полем RPL селектора кодового сегмента;

· EPL (Effective Privilege Level) — эффективный уровень привилегий запроса.

Под запросом здесь понимается любое обращение к памяти независимо от того, произошло ли оно при выполнении кода, оформленного в виде процесса, или вне рамок процесса, как это бывает при выполнении кодов операционной системы.

Поле уровня привилегий является частью двух информационных структур — дескриптора и селектора. В том и другом случае оно задается двумя битами: 00, 01, 10 и 11, характеризуя четыре степени привилегированности, от самой низкой 11 до самой высокой 00.

Уровни привилегий назначаются дескрипторам и селекторам. Во время загрузки операционной системы в память, а также при создании новых процессов операционная система назначает процессу сегменты кода и данных, генерирует дескрипторы этих сегментов и помещает их в таблицы GDT или LDT. Конкретные значения уровней привилегий DPL и RPL задаются операционной системой и транслятором либо по умолчанию, либо на основании указаний программиста. Значения DPL и RPL определяют возможности создаваемого процесса.

Уровень привилегий дескриптора DPL является в некотором смысле первичной характеристикой, которая «переносится» на соответствующие сегменты и запросы. Сегмент обладает тем уровнем привилегий, который записан в поле DPL его дескриптора. DPL определяет степень защищенности сегмента. Уровень привилегий сегмента данных учитывается системой защиты, когда она принимает решения о возможности выполнения для этого сегмента чтения или записи. Уровень привилегий кодового сегмента используется системой защиты при проверке возможности чтения или выполнения кода для данного сегмента.

Уровень привилегий кодового сегмента определяет не только степень защищенности этого сегмента, но и текущий уровень привилегий CPL всех запросов к памяти (на чтение, запись или выполнение), которые возникнут при выполнении этого кодового сегмента. Другими словами, уровень привилегий кодового сегмента DPL характеризует текущий уровень привилегий GPL выполняемого кода1. При запуске кода на выполнение значение DPL из дескриптора копируется в поле RPL селектора кодового сегмента, загружаемого в регистр сегмента команд CS. Значение поля RPL кодового сегмента, собственно, и является текущим уровнем привилегий выполняемого кода, то есть уровнем CPL.

1 В литературе, посвященной этому вопросу, уровни привилегий CPL и EPL часто называют уровнями привилегий задачи (Task Privilege). Но поскольку понятие «задача» имеет совершенно конкретный смысл, являясь синонимом понятия «процесс», использование его в данном контексте сужает область действия механизма защиты. Как уже было сказано, контроль доступа осуществляется не только для кодов, оформленных в виде процесса, но и для кодов, выполняющихся вне рамок процесса, например процедур обработки прерываний.

От того, какой уровень привилегий имеет выполняемый код, зависят не только возможности его доступа к сегментам и дескрипторам, но и разрешенный ему набор инструкций.

Во время приостановки процесса его текущий уровень привилегий сохраняется в контексте, роль которого в процессоре Pentium играет системный сегмент состояния задачи (Task State Segment, TSS). Если какой-либо процесс имеет несколько кодовых сегментов с разными уровнями привилегий, то поле RPL регистра CS позволяет узнать значение текущего уровня привилегий процесса. Заметим, что пользовательский процесс не может изменить значение поля привилегий в дескрипторе, так как необходимые для этого инструкции ему недоступны. В дальнейшем уровень привилегий процесса может измениться только в случае передачи управления другому кодовому сегменту путем использования особого дескриптора — шлюза.

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

EPL=max{CPL.RPL}

Выполняемый код может получить доступ к сегменту данных для операций чтения или записи, если его эффективный уровень привилегий не ниже (а в арифметическом смысле «не больше») уровня привилегий дескриптора этого сегмента:

max{CPL.RPL) <= DPL

Уровень привилегий дескриптора DPL определяет степень защищенности сегмента. Значение DPL говорит о том, каким эффективным уровнем привилегий должен обладать запрос, чтобы получить доступ к данному сегменту. Например, если дескриптор имеет DPL=2, то к нему разрешено обращаться всем процессам, имеющим уровень привилегий EPL, равный О, 1 или 2, а для процессов с EPL, равным 3, доступ запрещен.



©2015- 2017 stydopedia.ru Все материалы защищены законодательством РФ.