可以在用户模式下执行或禁止执行哪些指令?

时间:2019-04-04 04:13:37

标签: assembly x86 osdev

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

有些指令表明CPU将始终能够在用户模式下执行(例如:MOV指令)。

有些指令允许CPU在用户模式下执行或禁止执行(例如:INOUT指令)。

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

2 个答案:

答案 0 :(得分:3)

最初有三组:

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

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

  • 主管指令(例如LGDTWRMSRINVD,...,MOV to/from debug registers)。这些绝对不能在CPL = 3上执行。

此后,他们(CPU制造商-Intel,AMD,VIA等)添加了(按“按时间顺序排列”):

  • “对齐检查”功能,不允许以CPL = 3进行未对齐的读取和写入

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

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

  • MSR中的一个标志,该标志允许CPL = 0代码禁用CPUID leaves > 2(使CPU假装这些叶子不存在),这最初是一种错误的解决方法(“软件是软的,硬件是硬的”)),这是旧版本WindowsNT中的一个错误,但仍然在20多年后挂起,根本没有理智的原因。

  • 各种虚拟化内容(例如VMENTERVMEXIT等)

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

  • RDPMC指令

  • SWAPGS指令

  • SWAPGSRDFSBASERDGSBASEWRFSBASE等)的扩展名

  • 一个名为“ UMIP”(用户模式指令防护)的扩展,(如果启用)大多数情况下会阻止用户代码使用指令来查找内核数据结构的虚拟地址(因此“ KASR”要少一些)笑话)。SGDTSIDTSLDTSMSWSTR是禁止的指令。

  • 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中相应指令的执行。