如果当前特权级别以CS
编码(可由用户模式代码修改),那么为什么用户模式代码不能修改CS
来更改CPL
?
答案 0 :(得分:2)
这个问题很广泛,但是我可以提供一些一般信息和引用Instruction Set architecture(ISA)的链接,这些链接描述了所有说明。
您不能将值MOV
或POP
放入 CS (在286+ 1 上),因此无法修改 CS 。例如,对于POP
,有一条规则:
POP指令无法将值弹出到CS寄存器中。要从堆栈加载CS寄存器,请使用RET指令。
MOV
的规则与此类似:
不能使用MOV指令加载CS寄存器。
您可以通过syscall
,sysenter
,FAR jmp
(通过呼叫网关),FAR call
(通过呼叫网关)间接修改 CS , iret
,retf
(FAR返回)或int
。您可以查看每个说明的ISA以及应用了哪些特权级别检查。如果您没有特权和访问权限,则不能随意更改CPL。
在大多数情况下,如果您有权影响对CPL的更改,它将被更改。如果您没有所需的特权,则会获得异常(特权级别检查通常涉及RPL, CPL, DPL)。如果使用conforming code segments(另一个主题),则可以请求使用具有更高特权DPL的代码段执行代码,但CPL将保持不变。在某些情况下,代码执行时 CS 的CPL和DPL(描述符特权级别)可能会有所不同。
1 您被允许在8088/8086处理器上通过POP
和MOV
修改 CS 。