作者:1500799277_a9483d_353 | 来源:互联网 | 2022-11-01 12:16
我读到有些寄存器在用户模式下x86 CPU无法修改(我相信这些寄存器称为“特权寄存器”)。
但是,x86 CPU可以在用户模式下读取这些寄存器的值,还是不允许读取?
1> Hadi Brais..:
您通常用于计算的所有寄存器都可以在任何模式下读取/写入(GP整数,x87 / MMX,XMM / YMM / ZMM和AVX512 k0-7
掩码寄存器),但是实际上有许多寄存器是模式/控制设置。某些“特殊”寄存器可以写在用户空间中,例如段寄存器,MPX bnd
寄存器。
以下寄存器无法在用户模式(特权级别> 0)中读取或写入:
所有MSR寄存器。这些包括MTRR。可以使用WRMSR
/ 以外的指令来访问某些寄存器RDMSR
。这样的寄存器可以在用户模式下访问。例如,内核可以允许用户代码使用WRPMC
和RDPMC
指令访问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)。