为什么在非特权环(用户模式)中 运行 时不能更改 CPL?
Why can't CPL be changed when running in an unprivileged ring (user mode)?
如果当前权限级别编码在CS
中,可以被用户态代码修改,为什么用户态代码不能修改CS
来改变CPL
?
这个问题很宽泛,但我可以提供一些一般信息和参考描述所有说明的 Instruction Set architecture (ISA) 的链接。
你不能MOV
or POP
一个值到CS(在286+1)所以你不能修改CS 那样。例如 POP
有一个规则:
The POP instruction cannot pop a value into the CS register. To load the CS register from the stack, use the RET instruction.
MOV
的规则类似:
The MOV instruction cannot be used to load the CS register.
您可以通过 syscall
, sysenter
, FAR jmp
(via call gate), FAR call
(via call gate), iret
, retf
(FAR return) or int
. You can review the ISA 间接修改 CS 每条指令以及应用的特权级别检查。如果您没有特权和访问权限,则不能随意更改 CPL。
在大多数情况下,如果您有权影响对 CPL 的更改,它就会被更改。如果您没有所需的权限,则会出现异常(权限级别检查通常涉及 ). If using conforming code segments(另一个主题)您可以请求使用具有更高特权 DPL 的代码段执行代码,但 CPL 将保持不变. 代码执行时CS的CPL和DPL(描述符特权级别)可以不同的情况[=29=]
脚注
1您可以在 8088/8086 处理器上通过 POP
和 MOV
修改 CS。
如果当前权限级别编码在CS
中,可以被用户态代码修改,为什么用户态代码不能修改CS
来改变CPL
?
这个问题很宽泛,但我可以提供一些一般信息和参考描述所有说明的 Instruction Set architecture (ISA) 的链接。
你不能MOV
or POP
一个值到CS(在286+1)所以你不能修改CS 那样。例如 POP
有一个规则:
The POP instruction cannot pop a value into the CS register. To load the CS register from the stack, use the RET instruction.
MOV
的规则类似:
The MOV instruction cannot be used to load the CS register.
您可以通过 syscall
, sysenter
, FAR jmp
(via call gate), FAR call
(via call gate), iret
, retf
(FAR return) or int
. You can review the ISA 间接修改 CS 每条指令以及应用的特权级别检查。如果您没有特权和访问权限,则不能随意更改 CPL。
在大多数情况下,如果您有权影响对 CPL 的更改,它就会被更改。如果您没有所需的权限,则会出现异常(权限级别检查通常涉及 1您可以在 8088/8086 处理器上通过
脚注
POP
和 MOV
修改 CS。