Может ли процессор x86 считывать значение любого регистра в режиме пользователя? - PullRequest
2 голосов
/ 02 апреля 2019

Я прочитал, что есть некоторые регистры, которые процессор x86 не может изменить в режиме пользователя (я считаю, что эти регистры называются "привилегированными регистрами").

Но может ли процессор x86 считывать значения этих регистров в режиме пользователя или даже чтение не разрешено?

Ответы [ 2 ]

5 голосов
/ 02 апреля 2019

Все регистры, которые вы обычно используете для вычислений, могут быть прочитаны / записаны в любом режиме (целочисленные 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>

2 голосов
/ 02 апреля 2019

Доступные регистры описаны в Раздел 3.2 и Раздел 3.4 текущей Intel x64-x32-Architectures.Software.Developer.Manual .

Как правило, не все регистры могут быть прочитаны из Режим пользователя , а из Режим пользователя .

может быть записано еще меньше. Например,Регистр EFLAGS может быть полностью прочитан из Режим пользователя , но все Системные флаги и поля (и) IOPL из Раздел 3.4.3.3 не может быть записанс Режим пользователя .

...