Текст лекции. С самого начала следует отметить, что понятие привилегии относятся только к защищенному режиму процессора

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

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

Привилегии задач (Task Privilege) оказывают влияние на выполнение инструкций и использование дескрипторов. Текущий уровень привилегий задачи CPL (Current Privilege Level) определяется двумя младшими битами регистра CS (в котором находится соответствующий селектор кодового сегмента). CPL задачи может изменяться только при передаче управления новому сегменту через дескриптор вентиля. Задача начинает выполняться с уровня CPL, указанного селектором кодового сегмента внутри TSS, когда задача инициируется с помощью операции переключения задач. Задача, выполняемая на нулевом уровне привилегий, имеет доступ ко всем сегментам, описанным в GDT, и является самой привилегированной. Задача, выполняемая на уровне привилегий 3, имеет самые ограниченные права доступа. Текущий уровень привилегий может изменяться только при передаче управления через вентили.

Привилегии дескриптора (Descriptor Privilege) задаются полем DPL байта управления доступом. DPL определяет наибольший номер уровня привилегий (наименьшие привилегии), с которыми возможен доступ к данному дескриптору. Самый защищенный дескриптор имеет DPL= 0, к нему имеют доступ только задачи с CPL= 0. Самый беззащитный дескриптор имеет DPL= 3, его могут использовать задачи с CPL= 0, 1, 2, 3. Это правило применимо ко всем дескрипторам, за исключением дескриптора LDT.

Привилегии селектора (Selector Privilege) задаются полем RPL (Requested Privilege Level) – двумя младшими битами селектора. С помощью RPL можно редуцировать эффективный уровень привилегий EPL (Effective Privilege Level), который определяется, как максимальное из значение CPL и RPL. Селектор с RPL = 0 не вводит дополнительных ограничений. 18.11.14

Контроль доступа к сегментам данных производится при выполнении команд, загружающих селекторы SS, DS, ES, FS и GS. Команды загрузки DS, ES, FS и GS должны ссылаться на дескрипторы сегментов данных или сегментов кодов, допускающих чтение. Для получения доступа эффективный уровень привилегий EPL должен быть равным или меньшим (по значению) уровня привилегий DPL дескриптора. Исключением из этого правила является читаемый подчиненный сегмент кода, который может быть прочитан с любым CPL. Если эффективный уровень привилегий не разрешает доступ, или ссылка производится на некорректный тип дескриптора (на дескриптор вентиля или на дескриптор только выполняемого сегмента), генерируется исключение #GP. При ссылке на несуществующий дескриптор вырабатывается исключение #NP.

Контроль типов и привилегий при передаче управления производится при загрузке селектора в регистр CS. Тип селектора, на который ссылается данный селектор, должен соответствовать выполняемой инструкции. Нарушение типа (например, ссылка инструкции JMP на вентиль вызова) порождает исключение #GP. При передаче управления действуют следующие правила привилегий, нарушение которых также приводит к исключению #GP:

- команды JMP или CALL могут ссылаться либо на подчиненный сегмент кода с DPL, большим или равным CPL, либо на неподчиненный сегмент с DPL равным CPL,

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

- инструкции возврата, которые не переключают задачи, могут передать управление только кодовому сегменту с таким же или меньшим уровнем привилегий,

- переключение задач может выполняться с помощью вызова, перехода или прерывания, которые ссылаются на вентиль задач или сегмент состояния задачи (TSS) с тем же или меньшим уровнем привилегий.

Смена уровня привилегий, происходящая при передаче управления, автоматически вызывает переопределение стека. Начальное значение указателя стека SS:SP для уровня привилегий 0, 1, 2 содержится в TSS. При передаче управления по командам JMP или CALL в SS:SP загружается новое значение указателя стека, а старые значения помещаются в новый стек. При возврате на прежний уровень привилегий его стек восстанавливается (как часть инструкции RET или IRET). Для вызовов подпрограмм с передачей параметров через стек и сменой уровня привилегий из предыдущего стека в новый копируется фиксированное число слов, заданное в вентиле. Команда межсегментного возврата RET с выравниванием указателя стека при возврате корректно восстановит значение предыдущего указателя.

Привилегии и битовая карта разрешения ввода/вывода контролируют возможность выполнения операций ввода/вывода и управления флагом разрешения прерываний IF. Уровень привилегий ввода/вывода определяется полем IOPL (Input/Output Privilege Level) регистра флагов. Значение IOPL можно изменять только при CPL= 0.

При CPL £ IOPL на операции ввода/вывода и управление флагом разрешения прерываний IF никаких ограничений не накладывается. При CPL > IOPL попытка ввода/вывода, выполненная с TSS класса 80286, вызывает исключение #GP (отказ). Если CPL > IOPL, а с задачей связан TSS класса 386+, инструкции ввода/вывода могут выполняться только по адресам портов, для которых установлены нулевые биты в карте разрешения ввода/вывода, имеющейся в TSS. Попытки обращения к портам, которым соответствуют единичные биты карты или которые не попали в карту (ее размер может усекаться), вызывают исключение #GP.

При CPL £ IOPL попытка выполнения команд CLI или STI вызывает исключение #GP. Неявное управление флагом разрешения прерываний инструкциями загрузки или восстановления регистра флагов блокируется без генерации исключений.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: