Assembly 在用户模式下允许执行或禁止执行哪些指令?
有些指令是CPU永远无法在用户模式下执行的(例如: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
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特权级别)敏感的指令。这些指令是
(和变体-字节、字、dword、字符串)、IN
(及其变体)、OUT
、HLT
和CLI
。如果IOPL(在eflags中)设置为3,则这些指令可以在用户代码中使用(CPL=3);如果IOPL设置为数值较低的值,则这些指令不能在用户代码中使用STI
- 监控指令(例如,
,LGDT
,WRMSR
,…,INVD
)。这些指令永远不能在CPL=3时执行MOV到/从调试寄存器
- “对齐检查”功能,不允许在CPL=3时进行未对齐的读写
- RDTSC指令和一个标志(在CR4中)在CPL=3时禁止它
- “受保护模式虚拟中断”功能,在CPL=3时影响
和CLI
的行为(主要用于virtual8086,但不限于此)STI
- MSR中的一个标志,允许CPL=0代码禁用
(使CPU假装这些leave不存在),这本来是一种错误的解决方法(“软件是软的,硬件是硬的”)因为WindowsNT旧版本中的一个bug,但在20多年后仍然因为毫无理智的原因而挂起CPUID leaves>2
- 各种虚拟化工具(例如,
,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中权限位图的约束。