Все регистры, которые вы обычно используете для вычислений, могут быть прочитаны / записаны в любом режиме (целочисленные GP, регистры x87 / MMX, XMM / YMM / ZMM и AVX512 k0-7
маски), но есть много регистров, которыев основном настройки режима / управления.Некоторые «специальные» регистры могут быть записаны в пользовательском пространстве, например сегментные регистры, регистры MPX bnd
.
Следующие регистры не могут быть считаны или записаны в пользовательском режиме (уровень привилегий> 0):
- Все регистры MSR.К ним относятся MTRR.К некоторым из регистров можно получить доступ, используя инструкции, отличные от
WRMSR
/ RDMSR
.Такие регистры могут быть доступны в пользовательском режиме.Например, ядро может разрешить пользовательскому коду получать доступ к регистрам PMC, используя инструкции WRPMC
и RDPMC
. - GDTR, IDTR, LDTR и TR.
- Управляющие регистры CR0-15.Однако на процессорах Intel, если
CR4.UMIP
= 0, CR0
можно прочитать с помощью SMSW
.На процессорах AMD CR4.UMIP
недоступен, а SMSW
может быть выполнен на любом уровне привилегий безоговорочно. - Отладочные регистры DR0-15.
- Тестовые регистры TR3-7 на 80486 иTR6-7 на 80386.
Изменения, которые разрешены в регистре EFLAGS
, немного сложны, как описано в руководстве по Intel, том 2:
Когдаработая в защищенном, совместимом или 64-битном режиме с уровнем привилегий больше 0, но меньше или равным IOPL, все флаги могут быть изменены, кроме поля IOPL и RF, IF, VIP, VIF и VM;они остаются неизменными.Флаги AC и ID могут быть изменены, только если атрибут размер-операнда равен 32. Флаг прерывания (IF) изменяется только при выполнении на уровне, по крайней мере столь же привилегированном, как IOPL.Если инструкция POPF / POPFD выполняется с недостаточными привилегиями, исключение не возникает, но привилегированные биты не изменяются.
При работе в режиме virtual-8086 (EFLAGS.VM = 1) без режима virtual-8086расширения (CR4.VME = 0), инструкции POPF / POPFD можно использовать только в том случае, если IOPL = 3;в противном случае возникает исключение общей защиты (#GP).Если включены расширения режима virtual-8086 (CR4.VME = 1), POPF (но не POPFD) может выполняться в режиме virtual-8086 с IOPL <3. </p>