Assembly 在用户模式下允许执行或禁止执行哪些指令?

Assembly 在用户模式下允许执行或禁止执行哪些指令?,assembly,x86,osdev,Assembly,X86,Osdev,有些指令是CPU永远无法在用户模式下执行的(例如:HLT指令) CPU总是能够在用户模式下执行一些指令(例如:MOV指令) 还有一些指令可以允许CPU在用户模式下执行或禁止CPU在用户模式下执行(例如,in和OUT指令) 我的问题是:在用户模式下允许执行或禁止执行的其他指令(除了IN和OUT)是什么?cr4中有几个标志控制用户模式下特定指令的可用性: TSD(位2):RDTSC和RDTSCP PCE(位8):RDPMC OSFXSR(位9)*:FXSAVE、FXRSTOR和SSE指令 UMIP

有些指令是CPU永远无法在用户模式下执行的(例如:
HLT
指令)

CPU总是能够在用户模式下执行一些指令(例如:
MOV
指令)

还有一些指令可以允许CPU在用户模式下执行或禁止CPU在用户模式下执行(例如,
in
OUT
指令)


我的问题是:在用户模式下允许执行或禁止执行的其他指令(除了
IN
OUT
)是什么?

cr4中有几个标志控制用户模式下特定指令的可用性:

  • TSD(位2):RDTSC和RDTSCP

  • PCE(位8):RDPMC

  • OSFXSR(位9)*:FXSAVE、FXRSTOR和SSE指令

  • UMIP(第11位):SGDT、SIDT、SLDT、SMSW、STR

  • FSGSBASE(位16)*:RDFSBASE、RDGSBASE、WRFSBASE、WRGSBASE


标记为*的标志也会影响环0中相应指令的执行。

最初有三组:

  • 可以在任何特权级别执行的指令

  • 对“IOPL”(IO特权级别)敏感的指令。这些指令是
    IN
    (和变体-字节、字、dword、字符串)、
    OUT
    (及其变体)、
    HLT
    CLI
    STI
    。如果IOPL(在eflags中)设置为3,则这些指令可以在用户代码中使用(CPL=3);如果IOPL设置为数值较低的值,则这些指令不能在用户代码中使用

  • 监控指令(例如,
    LGDT
    WRMSR
    INVD
    ,…,
    MOV到/从调试寄存器
    )。这些指令永远不能在CPL=3时执行

从那时起,他们(CPU制造商-英特尔、AMD、VIA等)增加了(按“大致时间顺序”):

  • “对齐检查”功能,不允许在CPL=3时进行未对齐的读写

  • RDTSC指令和一个标志(在CR4中)在CPL=3时禁止它

  • “受保护模式虚拟中断”功能,在CPL=3时影响
    CLI
    STI
    的行为(主要用于virtual8086,但不限于此)

  • MSR中的一个标志,允许CPL=0代码禁用
    CPUID leaves>2
    (使CPU假装这些leave不存在),这本来是一种错误的解决方法(“软件是软的,硬件是硬的”)因为WindowsNT旧版本中的一个bug,但在20多年后仍然因为毫无理智的原因而挂起

  • 各种虚拟化工具(例如,
    VMENTER
    VMEXIT
    ,…)

  • RDTSCP指令(CPL=3时的访问仍由CR4中较早的标志控制)

  • RDPMC
    指令

  • SWAPGS
    指令

  • SWAPGS
    RDFSBASE
    RDGSBASE
    WRFSBASE
    等)的替代/扩展

  • 一种称为“UMIP”(用户模式指令预防)的扩展,它(如果启用)主要防止用户代码使用指令来查找内核数据结构的虚拟地址(因此“KASR”不那么好笑)。这不允许的指令有
    SGDT
    SIDT
    SLDT
    SMSW
    STR

  • MSR中的隐藏/未记录标志,允许某些内核(如果它们是由能够了解它的开发人员编写的)禁用对用户代码永远无法执行的更多指令的访问(
    CPUID
    ,我不知道还有什么)


MOV
如果违反段或页保护,可能无法执行。然后有
MOV
指令在控制寄存器之间移动。无论如何,对于指令和条件的详尽列表(某些指令可能被禁止,如
RDTSC
),您应该查阅CPU文档,而不是在此询问。要回答(部分)最后一个问题,IOPL敏感指令是
in
INS
OUT
OUT
CLI
STI
请注意,
IN
OUT
也受TSS中权限位图的约束。