在用户模式下,x86 CPU可以读取任何寄存器的值吗?

Joh*_*ohn 2 x86 assembly cpu-registers isa elevated-privileges

我读到有些寄存器在用户模式下x86 CPU无法修改(我相信这些寄存器称为“特权寄存器”)。

但是,x86 CPU可以在用户模式下读取这些寄存器的值,还是不允许读取?

Had*_*ais 5

您通常用于计算的所有寄存器都可以在任何模式下读取/写入(GP整数,x87 / MMX,XMM / YMM / ZMM和AVX512 k0-7掩码寄存器),但是实际上有许多寄存器是模式/控制设置。某些“特殊”寄存器可以写在用户空间中,例如段寄存器,MPX bnd寄存器。


以下寄存器无法在用户模式(特权级别> 0)中读取或写入:

  • 所有MSR寄存器。这些包括MTRR。可以使用WRMSR/ 以外的指令来访问某些寄存器RDMSR。这样的寄存器可以在用户模式下访问。例如,内核可以允许用户代码使用WRPMCRDPMC指令访问PMC寄存器。
  • GDTR,IDTR,LDTR和TR。
  • 控制寄存器CR0-15。但是,在Intel处理器上,如果CR4.UMIP= 0,CR0则可以使用读取SMSW。在AMD处理器CR4.UMIP上不可用,SMSW可以无条件地以任何特权级别执行。
  • 调试寄存器DR0-15。
  • 测试80486上的TR3-7和80386上的TR6-7。

EFLAGS英特尔手册第2卷中所述,允许对寄存器进行的修改有些复杂:

当在特权级大于0但小于或等于IOPL的受保护,兼容性或64位模式下运行时,可以修改所有标志,除了IOPL字段和RF,IF,VIP,VIF和VM;这些仍然不受影响。仅当操作数大小属性为32时,才可以修改AC和ID标志。仅当以至少与IOPL一样特权的级别执行时,才更改中断标志(IF)。如果在特权不足的情况下执行POPF / POPFD指令,则不会发生异常,但特权位不会改变。

在无虚拟8086模式扩展(CR4.VME = 0)的虚拟8086模式(EFLAGS.VM = 1)下运行时,仅当IOPL = 3时才可以使用POPF / POPFD指令;否则,将发生一般保护异常(#GP)。如果启用了虚拟8086模式扩展(CR4.VME = 1),则可以在IOPL <3的虚拟8086模式下执行POPF(但不能执行POPFD)。

  • 作为一个例外,可以使用“rmsw”从用户空间读取“cr0”的下半部分。 (2认同)