为什么在非特权环(用户模式)中 运行 时不能更改 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 处理器上通过 POPMOV 修改 CS