Глава 4. Работа механизма защиты.4.1. Проверки корректности использования команд.Привилегированные команды. К привилегированным командам относятся те, на выполнение которых влияет уровень привилегий программы или привилегии устройств ввода/вывода. МП iх86 имеет 3 группы привилегированных команд, степени привилегий которых различны:
PL0-команды. Это команды, выполнение которых разрешено только на уровне привилегий 0. При попытке выполнить их в Р-режиме на другом уровне привилегий генерируется сигнал нарушения общей защиты (прерывание 13). В некоторых литературных источниках только эти команды определяются как привилегированные. IOPL-"чувствительные" команды. Это команды, которые изменяют состояние флажка прерываний IF, выполняют захват шины или операцию ввода-вывода. Для выполнения этих команд программа необязательно должна иметь уровень привилегий 0. Привилегированность этих команд заключается в том, что их могут выполнять программы, уровень привилегий которых выше уровня, определяемого полем IOPL уровня привилегий ввода-вывода в регистре EFLAGS. Другими словами, для выполнения этих команд требуется, чтобы CPL был численно меньше или равен IOPL (CPL <= IOPL). При попытке выполнить их в Р-режиме при CPL > IOPL генерируется нарушение общей защиты (прерывание 13). Команды обращения к устройствам ввода/вывода (IN, INS, OUT, OUTS) являются особой подгруппой IOPL-"чувствительных" команд. На их выполнение, кроме соотношения уровней привилегий CPL <= IOPL, влияет содержимое битовой карты разрешения ввода/вывода в сегменте состояния задачи TSS. Выполнение команд ввода/вывода разрешено, если CPL <= IOPL. При CPL > IOPL производится проверка содержимого битовой таблицы разрешения ввода/вывода. Командами, модифицируемыми в соответствии с текущим уровнем привилегии, являются две команды:
Команды POPFD и POPF сами по себе не являются привилегированными, но их выполнение зависит от значения CPL, т.е. от уровня привилегий содержащего их кода. Здесь речь идет о защите по модификации полей регистра флагов IOPL и IF. Флаг IOPL может модифицироваться только PL0-программами. По сути дела IOPL является PL0-флагом. Флаг IF может модифицироваться IOPL-чувствительными командами при CPL <= IOPL. В этом смысле IF можно считать IOPL-чувствительным флагом. Любая программа может содержать команды POPFD и POPF. Эти команды могут изменять любые биты флагов, но биты IOPL могут быть изменены этими командами, только если выполняется PL0-программа, а флаг IF - если выполняется условие CPL <= IOPL. Процессор никак не сообщает об изменении действия этих команд. Это вполне штатная ситуация. Процессор просто не модифицирует биты IOPL и флаг IF, если это не разрешено.
|