Какой уровень привилегий в защищенном режиме предназначен для выполнения кода ядра ос
Обновлено: 02.07.2024
В защищенном режиме процессор имеет четырехуровневую систему привилегий, которая управляет использованием привилегированных инструкций и доступом к сегментам памяти. Уровень привилегии сегмента указывается в его дескрипторе. Нумерация уровней происходит от 0 до 3, высшие привилегии соответствуют нулевому уровню. Для наглядности их принято изображать в виде колец.
Привилегии задач оказывают влияние на выполнение инструкций и использование дескрипторов. Текущий уровень привилегии задачи CPL ( Current Privilege Level ) определяется двумя младшими битами регистра CS .
CPL задачи может изменяться только при передаче управления к новому сегменту через дескриптор шлюза (см. главу 5). Задача начинает выполняться с уровня CPL, указанного селектором кодового сегмента внутри TSS , когда задача инициируется посредством операции переключения задач. Задача, выполняемая на нулевом уровне привилегий, имеет доступ ко всем сегментам, описанным в GDT , и является самой привилегированной. Задача, выполняемая на уровне 3, имеет самые ограниченные права доступа. Текущий уровень привилегии задачи может изменяться только при передаче управления через шлюзы.
Привилегии сегмента задаются полем DPL байта управления доступом.
DPL определяет наибольший номер уровня привилегий (фактически, наименьшие привилегии), с которым возможен доступ к данному дескриптору. Самый защищенный (привилегированный) дескриптор имеет DPL =0, к нему имеют доступ только задачи с CPL =0 . Самый общедоступный дескриптор имеет DPL =3 , его могут использовать задачи с CPL =0, 1, 2, 3. Это правило применимо ко всем дескрипторам, за исключением дескриптора LDT .
Привилегии селектора задаются полем RPL ( Requested Privilege Level ) — двумя младшими битами селектора.
При обращении в сегмент данных с помощью RPL можно ограничить привилегии (относительно CPL ), вводится понятие эффективный уровень привилегий EPL ( Effective Privilege Level ), который определяется как максимальное из значений CPL и RPL, Селектор с RPL =0 не вводит дополнительных ограничений.
EPL = MAX ( CPL , RPL )
Контроль доступа к сегментам данных производится при исполнении команд, загружающих селекторы в SS , DS , ES , FS и GS . Команды загрузки DS , ES , FS и GS должны ссылаться на дескрипторы сегментов данных или сегментов кодов, допускающих чтение. Для получения доступа эффективный уровень привилегий EPL должен быть равным или меньшим (арифметически) уровня привилегий DPL дескриптора.
EPL £ DPL
· Команды JMP или CALL могут ссылаться либо на подчиненный сегмент кода с DPL, большим или равным CPL, либо на неподчиненный сегмент с DPL равным CPL;
· Прерывания внутри задачи или вызовы, которые могут изменить уровень привилегий, могут передавать управление кодовому сегменту с уровнем привилегий, равным или большим уровня привилегий CPL, только через шлюзы с тем же или меньшим уровнем привилегий, чем CPL;
· Инструкции возврата, которые не переключают задачи, могут передать управление только кодовому сегменту с таким же или меньшим уровнем привилегий;
· Переключение задач может выполняться с помощью вызова, перехода или прерывания, которые ссылаются на шлюзы задачи или сегмент состояния задачи ( TSS ) с тем же или меньшим уровнем привилегий .
Смена уровня привилегий, происходящая при передаче управления, автоматически вызывает переопределение стека. Начальное значение указателя стека SS : SP для уровня привилегий 0, 1, 2 содержится в TSS. При передаче управления по командам JMP или CALL в CS : SP загружается новое значение указателя стека, а старые значения помещаются в новый стек. При возврате на прежний уровень привилегий его стек восстанавливается (как часть инструкции RЕТ или IRЕТ). Для вызовов подпрограмм с передачей параметров через стек и сменой уровня привилегий из предыдущего стека в новый копируется фиксированное число слов, заданное в шлюзе. Команда межсегментного возврата RET с выравниванием указателя стека при возврате корректно восстановит значение предыдущего указателя.
Привилегии и битовая карта разрешения ввода/вывода контролируют возможность выполнения операций ввода/вывода и управления флагом прерываний IF . Уровень привилегий ввода/вывода определяется полем IOPL ( Input / Output Privilege Level ) регистра флагов. Значение IOPL можно изменить только при CPL =0 (только для операционной системы).
3.2 Защита по функциональному назначению.
Для надежной работы многозадачных систем необходима защита задач друг от друга. Защита предназначена для предотвращения несанкционированного доступа к памяти и выполнения критических инструкций — команды HLT , которая останавливает процессор, команд ввода/вывода, управления флагом разрешения прерываний и команд, влияющих на сегменты кода и данных. Механизмы защиты вводят следующие ограничения:
· Ограничение использования сегментов (например, запрет записи в только читаемые сегменты данных или попытки исполнения данных как кода). Для использования доступны только сегменты, дескрипторы которых описаны в GDT и LDT ;
· Ограничение доступа к сегментам через правила привилегий;
· Ограничение набора инструкций — выделение привилегированных инструкций или операций, которые можно выполнять только при определенных уровнях CPL и IOPL ;
· Ограничение возможности межсегментных вызовов и передачи управления.
В защищенном режиме при исполнении инструкций процессор выполняет проверки условий, порождающих исключения:
Проверка при загрузке сегментных регистров
§ загрузка в SS сегмента кода или сегмента данных только для чтения;
§ загрузка управляющих дескрипторов в DS , ES или SS;
§ загрузка только исполняемых сегментов в DS , ES или SS;
§ загрузка сегмента данных в CS .
Проверка ссылок операндов
Проверка привилегий инструкций
При выполнении команд IRET и POPF с недостаточным уровнем привилегий биты IF и IOPL в регистре флагов не изменяются, исключения не порождаются:
· IF не меняется, при CPL > IOPL;
· IOPL не меняется, если CPL > 0.
· ARPL — выравнивание RPL. При ее исполнении RPL селектора приравнивается максимальному значению из текущего RPL селектора и поля RPL в указанном регистре. Если при этом RPL изменился, устанавливается ZF =1;
· VERR — проверка возможности чтения: если сегмент, на который указывает селектор, допускает чтение, устанавливается ZF =1;
· VERW — проверка возможности записи: если сегмент, на который указывает селектор, допускает запись, устанавливается ZF =1;
· LSL — чтение лимита сегмента в регистр, если позволяют привилегии. При успехе устанавливается ZF =1;
· LAR — чтение байта доступа дескриптора в регистр, если позволяют привилегии. При успехе устанавливается ZF =1.
Читайте также: