2015-07-23 4 views
2

В пользовательской ОС, работающей в защищенном режиме x86, есть способ получить текущий уровень привилегий, кроме, например, выполнение привилегированной инструкции и просмотр, если она сработает?Текущий уровень привилегий x86 на пользовательской ОС

Например, регистр CR0 содержит бит PE, который указывает, работает ли он в реальном режиме или в защищенном режиме и может быть легко извлечен с использованием ассемблерного кода.

Есть ли что-то эквивалентное для уровня привилегий?

Intel architecture software developer manual упоминает, что регистр EFLAGS содержит два разряда IOPL, связанные с уровнями привилегий ввода-вывода. Это то же самое, что и текущий уровень привилегий (CPL)?

+0

Вы имеете в виду что-то вроде 'mov ax, cs/and al, 03h'? –

+0

Он не упомянул, что то, что он действительно пытается сделать, это включить SSE: http://stackoverflow.com/questions/31563078/how-do-i-enable-sse-for-my-freestanding-bootable-code/, но изменение «CR0» и «CR4» не работало. –

ответ

4

Нет, это не то же самое. Они представляют собой уровень привилегий io. Некоторые инструкции, такие как IN, OUT, CLI, требуют привилегий io, которые определяются с использованием IOPL и CPL.

Смотрите также:

IOPL I/O поля уровня привилегий (биты 12 и 13) - Указывает/O привилегия уровень I (IOPL) в настоящее время программы или задачи. CPL текущей программы или задачи должен быть меньше или равен IOPL до , чтобы получить доступ к адресному пространству ввода-вывода.

The CPL можно прочитать просто из селектора CS как два нижних бита:

mov ax, cs 
and ax, 3 

Это, конечно, работает только в защищенном режиме.

+1

Действительно, очень просто, как только вы это знаете, но не очевидны при поиске в руководстве по 360-страничной длине. – anol