gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:18:04 26 4
gpt4 key购买 nike

我已经读到有些寄存器在用户模式下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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com