【问题标题】:Why can't CPL be changed when running in an unprivileged ring (user mode)? [closed]为什么在非特权环(用户模式)中运行时不能更改 CPL? [关闭]
【发布时间】:2020-01-05 16:19:58
【问题描述】:

如果当前权限级别编码为CS,可以通过用户模式代码修改,为什么用户模式代码不能修改CS来更改CPL

【问题讨论】:

  • 它可以:只需执行syscallint3 ;)
  • @Ruslan SYSCALL 在权限级别 0 调用操作系统系统调用处理程序,但在这种情况下,操作系统是将地址放入 CS 的人(CS 指向处理程序的地址),不是用户
  • 不,这不是直接的操作系统:它是 syscall 指令改变了cs,以及一堆其他寄存器。中断处理程序也是如此(尽管它们不使用 MSR 来查找目标,而是使用 IDT 中的中断门)。
  • 关于每条可能改变 CPL(JMP/CALL/IRET/RETF 等)的指令会发生什么的真正答案在每条指令的指令集架构参考中。 felixcloutier.com/x86
  • 我有一种预感,问你这个问题的人很/困惑,虽然我不能说,因为我不能直接问他们这些问题。

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


【解决方案1】:

这个问题很笼统,但我可以提供一些一般信息和链接,参考描述所有说明的Instruction Set architecture (ISA)。

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

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

MOV 的规则类似:

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

您可以通过syscallsysenterFAR jmp(通过调用门)、FAR call(通过调用门)、iretretf(远回报)或int。您可以查看每条指令的 ISA 以及应用了哪些权限级别检查。如果您没有权限和访问权限,则不能随意更改 CPL。

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


脚注

1您可以在 8088/8086 处理器上通过 POPMOV 修改 CS

【讨论】:

    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    相关资源
    最近更新 更多