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

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、

我读过一些x86CPU在用户模式下无法修改的寄存器(我相信这些寄存器称为“特权寄存器”)


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

当前版本的第3.2节和第3.4节介绍了可用的寄存器

一般来说,并非所有寄存器都可以从用户模式读取,甚至更少的寄存器可以从用户模式写入


例如,可以从用户模式完全读取
EFLAGS
寄存器,但无法从用户模式写入第3.4.3.3节中的所有系统标志和IOPL字段。

可以在任何模式下读取/写入通常用于计算的所有寄存器(GP integer、x87/MMX、XMM/YMM/ZMM和AVX512
k0-7
mask寄存器),但有许多寄存器基本上是模式/控制设置。一些“特殊”寄存器可以写入用户空间,如段寄存器、MPX
bnd
寄存器


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

  • 所有MSR寄存器。这些寄存器包括MTRR。可以使用
    WRMSR
    /
    RDMSR
    以外的指令访问某些寄存器。这些寄存器可以在用户模式下访问。例如,内核可能允许用户代码使用
    WRPMC
    RDPMC
    指令访问PMC寄存器
  • GDTR、IDTR、LDTR和TR
  • 控制寄存器CR0-15。但是,在英特尔处理器上,如果
    CR4.UMIP
    =0,则可以使用
    SMSW
    读取
    CR0
    。在AMD处理器上,
    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
的下半部分。