§ Уровни привилегий

Защищённый режим (protected mode или P-Mode) обладает некоторыми особенностями, о которых нужно знать прежде, чем вы будете его использовать.
При работе в защищённом режиме процессор следит за правильным выполнением текущей программой ряда условий, например, программа не должна обращаться по определённым адресам портов ввода/вывода, запрещённых для неё. Если всё же происходит нарушение какого-либо условия, то процессор генерирует специальный тип прерывания, так называемое исключение, снабжает это прерывание информацией, описывающей где произошло нарушение и как оно произошло. Далее, специальная процедура обрабатывает это прерывание и решает, что дальше делать с "виноватой" программой (например, прекратить её выполнение).
Определением условий должна заниматься операционная система. Когда программа переводит процессор в защищённый режим, то ей, как говорится, "можно всё". Сразу после входа в защищённый режим процессор позволяет программе устанавливать свои условия для самой себя и для других программ. Для того, чтобы эти условия не могла переопределить другая программа, в процессоре введена система уровней привилегий. Благодаря этому, операционная система, например, может разрешить работу с дисковыми накопителями только для себя и тогда вирусы будут бессильны – они не смогут обратиться к дискам через порты ввода/вывода (разве что, только через "дыры" в самой операционной системе).
Основой защищённого режима являются уровни привилегий. Уровень привилегий – это степень использования ресурсов процессора. Всего таких уровней четыре и они имеют номера от 0 до 3. Уровень номер 0 – самый привелигерованный. Когда программа работает на этом уровне привилегий, ей "можно всё". Уровень 1 – менее привелигерованный и запреты, установленные на уровне 0 действуют для уровня 1. Уровень 2 – ещё менее привелигерованный, а 3-й – имеет самый низкий приоритет. Таким образом, оптимальная схема работы программ по уровням привилегий будет следующая:
  • уровень 0: ядро операционной системы
  • уровень 1: драйвера ОС
  • уровень 2: интерфейс ОС
  • уровень 3: прикладные программы
Разумеется, это не единственный способ. Можно определить всю работу процессора в нулевом уровне – и ядро ОС, и драйвера и прикладные программы; можно, например, не разделять драйвера от ядра и т.п., но тогда в такой системе не будет реализован встроенный в процессор механизм защиты программ и данных друг от друга и система будет неустойчивой.
Уровни привилегий 1, 2 и 3 подчиняются условиям, установленным на уровне 0, поэтому функционально эти четыре уровня можно разделить на 2 группы: уровень привилегий системы (0) и уровни пользователя (1, 2 и 3). На первый взгляд кажется, что проще было бы реализовать всего два уровня привилегий – системный и пользовательский, но со временем вы обнаружите, что четыре уровня привилегий – это очень удобно и гораздо лучше двух.
Программы и данные ограничены внутри своих уровней привилегий. Например, если программа работает на уровне привилегий 2, то она не сможет передать управление процедуре, работающей на любом другом уровне (0, 1 и 3), также, она не сможет обратиться к данным, определённым для использования на других уровнях привилегий. Процессор не допустит этого и в случае нарушений привилегий при доступе к данным и коду сгенерирует исключение общей защиты (general-protection exception) и передаст управление операционной системе, чтобы она приняла меры к нарушителю.
Сам по себе уровень привилегий ещё ничего не значит, его нельзя "установить в процессоре". Уровень привилегий применяется как одно их свойств при описании различных объектов, например, сегмента кода и действует при работе только с этим объектом.
Уровень привилегий обозначается как "PL" (от Privilege Level) и применяется в сочетаниях, например, IOPL – Input/Output Privilege Level – уровень привилегий ввода/вывода.
Когда процессор переходит в защищённый режим, то подразумевается, что программа будет работать в нулевом уровне привилегий.