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

标签 assembly x86 cpu-registers elevated-privileges isa

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

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

最佳答案

您通常用于计算的所有寄存器都可以在任何模式下读取/写入(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。

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

    When operating in protected, compatibility, or 64-bit mode with a privilege level greater than 0, but less than or equal to IOPL, all flags can be modified except the IOPL field and RF, IF, VIP, VIF, and VM; these remain unaffected. The AC and ID flags can only be modified if the operand-size attribute is 32. The interrupt flag (IF) is altered only when executing at a level at least as privileged as the IOPL. If a POPF/POPFD instruction is executed with insufficient privilege, an exception does not occur but privileged bits do not change.

    When operating in virtual-8086 mode (EFLAGS.VM = 1) without the virtual-8086 mode extensions (CR4.VME = 0), the POPF/POPFD instructions can be used only if IOPL = 3; otherwise, a general-protection exception (#GP) occurs. If the virtual-8086 mode extensions are enabled (CR4.VME = 1), POPF (but not POPFD) can be executed in virtual-8086 mode with IOPL < 3.

    关于assembly - 在用户模式下,x86 CPU可以读取任何寄存器的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55464162/

    相关文章:

    linux - 制作一个Linux操作系统

    c - 为什么在将 C 向下转换从 unsigned int 转换为 unsigned char 时,movl 比 movb 更受欢迎?

    assembly - 为什么汇编程序有单独的段?

    c - 汇编维吉尼亚密码程序

    程序集 x86 : I have to program the Ackermann function

    c# - 如何将寄存器值加载到变量C#

    assembly - 从 x86 中的寄存器加载值所花费的时间

    linux - wrsmr 命令没有在 MSR 中注册我的输入

    gcc - Apple AS 和 ARM/Thumb ADDS 指令

    c - 随机排列 AVX 寄存器中的元素