Assembly x86 CPU在用户模式下是否可以读取任何寄存器的值?
我读过一些x86CPU在用户模式下无法修改的寄存器(我相信这些寄存器称为“特权寄存器”)Assembly x86 CPU在用户模式下是否可以读取任何寄存器的值?,assembly,x86,cpu-registers,elevated-privileges,instruction-set,Assembly,X86,Cpu Registers,Elevated Privileges,Instruction Set,我读过一些x86CPU在用户模式下无法修改的寄存器(我相信这些寄存器称为“特权寄存器”) 但是x86 CPU是否可以在用户模式下读取这些寄存器的值,或者甚至不允许读取这些值?当前版本的第3.2节和第3.4节介绍了可用的寄存器 一般来说,并非所有寄存器都可以从用户模式读取,甚至更少的寄存器可以从用户模式写入 例如,可以从用户模式完全读取EFLAGS寄存器,但无法从用户模式写入第3.4.3.3节中的所有系统标志和IOPL字段。可以在任何模式下读取/写入通常用于计算的所有寄存器(GP integer、
但是x86 CPU是否可以在用户模式下读取这些寄存器的值,或者甚至不允许读取这些值?当前版本的第3.2节和第3.4节介绍了可用的寄存器 一般来说,并非所有寄存器都可以从用户模式读取,甚至更少的寄存器可以从用户模式写入
例如,可以从用户模式完全读取
EFLAGS
寄存器,但无法从用户模式写入第3.4.3.3节中的所有系统标志和IOPL字段。可以在任何模式下读取/写入通常用于计算的所有寄存器(GP integer、x87/MMX、XMM/YMM/ZMM和AVX512k0-7
mask寄存器),但有许多寄存器基本上是模式/控制设置。一些“特殊”寄存器可以写入用户空间,如段寄存器、MPXbnd
寄存器
无法在用户模式下读取或写入以下寄存器(权限级别>0):
- 所有MSR寄存器。这些寄存器包括MTRR。可以使用
/WRMSR
以外的指令访问某些寄存器。这些寄存器可以在用户模式下访问。例如,内核可能允许用户代码使用RDMSR
和WRPMC
指令访问PMC寄存器RDPMC
- GDTR、IDTR、LDTR和TR
- 控制寄存器CR0-15。但是,在英特尔处理器上,如果
=0,则可以使用CR4.UMIP
读取SMSW
。在AMD处理器上,CR0
不可用,CR4.UMIP
可以在任何特权级别无条件执行SMSW
- 调试寄存器DR0-15
- 测试80486上的寄存器TR3-7和80386上的寄存器TR6-7
EFLAGS
寄存器进行的修改有点复杂,如《英特尔手册》第2卷所述:
在受保护、兼容或64位模式下使用
权限级别大于0,但小于或等于IOPL,全部
除了IOPL字段和RF、IF、VIP、VIF和
VM;这些保持不变。只能修改AC和ID标志
如果操作数大小属性为32,则中断标志(if)为
仅当在至少与
IOPL。如果执行POPF/POPFD指令时没有足够的
特权,则不会发生异常,但特权位不会发生异常
改变
在虚拟-8086模式(EFLAGS.VM=1)下运行时,无需
虚拟8086模式扩展(CR4.VME=0),POPF/POPFD
只有当IOPL=3时,才能使用指令;否则
发生一般保护异常(#GP)。如果虚拟8086模式
扩展已启用(CR4.VME=1),可以使用POPF(但不是POPFD)
在IOPL<3的虚拟8086模式下执行
作为例外,可以使用
rmsw
从用户空间读取cr0
的下半部分。