在非特权环(用户模式)下运行时,为什么不能更改CPL?

时间:2019-09-02 16:21:46

标签: x86 x86-64 cpu-architecture protected-mode

如果当前特权级别以CS编码(可由用户模式代码修改),那么为什么用户模式代码不能修改CS来更改CPL

1 个答案:

答案 0 :(得分:2)

这个问题很广泛,但是我可以提供一些一般信息和引用Instruction Set architecture(ISA)的链接,这些链接描述了所有说明。

您不能将值MOVPOP放入 CS (在286+ 1 上),因此无法修改 CS 。例如,对于POP,有一条规则:

  

POP指令无法将值弹出到CS寄存器中。要从堆栈加载CS寄存器,请使用RET指令。

MOV的规则与此类似:

  

不能使用MOV指令加载CS寄存器。

您可以通过syscallsysenterFAR jmp(通过呼叫网关),FAR call(通过呼叫网关)间接修改 CS iretretf(FAR返回)或int。您可以查看每个说明的ISA以及应用了哪些特权级别检查。如果您没有特权和访问权限,则不能随意更改CPL。

在大多数情况下,如果您有权影响对CPL的更改,它将被更改。如果您没有所需的特权,则会获得异常(特权级别检查通常涉及RPL, CPL, DPL)。如果使用conforming code segments(另一个主题),则可以请求使用具有更高特权DPL的代码段执行代码,但CPL将保持不变。在某些情况下,代码执行时 CS 的CPL和DPL(描述符特权级别)可能会有所不同。


脚语

1 您被允许在8088/8086处理器上通过POPMOV修改 CS