5.4. Привилегированные команды
Привилегированные команды, которые влияют на системные структуры данных, могут использоваться, только когда СPL=0. Если процессор обнаруживает одну из этих команд в то время, когда уровень СPL больше нуля, то он вызывает обработку нарушения общей защиты (исключение #13). Такими командами являются:
- LGDT, LIDT, LLDT - загрузка значений в регистры дескрипторных таблиц;
- LTR - загрузка регистра задач;
- LMSW - загрузка младшего слова регистра CR0 (Machine Status Word);
- MOV CRn - загрузка и сохранение управляющих регистров;
- MOV DRn - загрузка и сохранение регистров отладки;
- CLTS - сброс флага переключения задачи;
- HLT - останов;
- команды управления кэшем;
- RDMSR/WRMSR (Pentium+), MOV TRn (386,486) - команды работы с машинно-зависимыми регистрами;
- RDTSC (Pentium+) - чтение счетчика времени (если CR4.TSD=0, то эту команду можно выполнять на любом уровне привилегий);
- RDPMC (P6+) - чтение счетчика производительности (если CR4.PCE=1, то эту команду можно выполнять на любом уровне привилегий).
Кроме привилегированных, существуют инструкции, результат выполнения которых зависит от поля IOPL в регистре флагов (I/O Privilege Level - уровень привилегий ввода-вывода): IN, INS, OUT, OUTS, CLI, STI. Механизм защиты процессора позволяет выполнять эти инструкции, только если задача обладает достаточными привилегиями, т.е.
В противном случае выполнение инструкций CLI и STI вызывает исключение #13, а возможность выполнения инструкций обращений к портам зависит от битовой карты разрешения ввода-вывода.
Следует отметить, что биты IF и IOPL не могут быть изменены с помощью команды POPF, если она выполняется на уровне привилегий отличном от нуля, но при этом нарушения общей защиты не возникает.