有些指令使CPU永远无法在用户模式下执行(例如:HLT
指令)。
有些指令表明CPU将始终能够在用户模式下执行(例如:MOV
指令)。
有些指令允许CPU在用户模式下执行或禁止执行(例如:IN
和OUT
指令)。
我的问题是:在用户模式下可以允许执行或禁止执行的其他指令(IN
和OUT
除外)是什么?
答案 0 :(得分:3)
最初有三组:
可以在任何特权级别执行的指令
指令,分别是IN
(及其变体-字节,字,dword,字符串),OUT
(及其变体) ),HLT
,CLI
和STI
。如果IOPL(在eflags中)设置为3,则这些指令可用于用户代码(CPL = 3);如果IOPL被设置这些指令的数值较低时,不能在用户代码中使用。
主管指令(例如LGDT
,WRMSR
,INVD
,...,MOV to/from debug registers
)。这些绝对不能在CPL = 3上执行。
此后,他们(CPU制造商-Intel,AMD,VIA等)添加了(按“按时间顺序排列”):
“对齐检查”功能,不允许以CPL = 3进行未对齐的读取和写入
RDTSC指令和一个标志(在CR4中)在CPL = 3时禁止使用它。
“保护模式虚拟中断”功能会影响CPL = 3时CLI
和STI
的行为(主要用于virtual8086,但不仅限于此)。
MSR中的一个标志,该标志允许CPL = 0代码禁用CPUID leaves > 2
(使CPU假装这些叶子不存在),这最初是一种错误的解决方法(“软件是软的,硬件是硬的”)),这是旧版本WindowsNT中的一个错误,但仍然在20多年后挂起,根本没有理智的原因。
各种虚拟化内容(例如VMENTER
,VMEXIT
等)
RDTSCP指令(对CPL = 3的访问仍由CR4中的较早标志控制)
RDPMC
指令
SWAPGS
指令
SWAPGS
(RDFSBASE
,RDGSBASE
,WRFSBASE
等)的扩展名
一个名为“ UMIP”(用户模式指令防护)的扩展,(如果启用)大多数情况下会阻止用户代码使用指令来查找内核数据结构的虚拟地址(因此“ KASR”要少一些)笑话)。SGDT
,SIDT
,SLDT
,SMSW
和STR
是禁止的指令。
MSR中的一个隐藏/未记录的标志,该标志允许某些内核(如果它们是由能够找到它的开发人员编写的)禁止访问更多用户代码不应该被访问的指令能够执行(CPUID
,我不知道还能做什么)。
答案 1 :(得分:1)
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中相应指令的执行。