【问题标题】:What register in i386 stores the CPL?i386 中的哪个寄存器存储 CPL?
【发布时间】:2020-01-15 11:31:51
【问题描述】:

我在“INTEL 80386 程序员参考手册”(p112,S 6.3.1.3)中读到

一个内部处理器寄存器记录当前的特权级别 (CPL)。

我很好奇它指的是什么寄存器。它甚至有名字吗?寄存器的大小是多少?它还有其他用途吗?

【问题讨论】:

    标签: x86 x86-64 cpu-architecture cpu-registers i386


    【解决方案1】:

    当前特权级别 (CPL) 始终可以在代码段 (CS) 寄存器的低 2 位中找到。这 2 位可以是值 0b00(环 0)、0b01(环 1)、0b10(环 2)、0b11(环 3)。

    需要注意的是,旧文档使用“An internal processor register records the current privilege level (CPL)”有点欺骗性,引起了一些人的注意也为别人抓挠。 CS 总是在低 2 位包含 CPL,但显然它不是内部寄存器。

    微架构内部也可能有 CPL 的副本,但始终可以通过查看 CS 以编程方式访问它。

    与您的问题没有直接关系,但了解可能会有用。如果您在不同的环之间转换并且目标代码段选择器的描述符是conforming segment,则描述符特权级别(DPL)可能是!= CPL。这是因为对于符合要求的段,您将继续使用以前的特权级别运行。对于不合格的细分 DPL == CPL。

    【讨论】:

    • 感谢您的及时回复。但是我有点疑惑,既然CS会被用来存储一个段选择器,它的低2位就是RPL,那么同一个位置怎么能用来存储CPL呢?
    • @xtt:如果我理解正确:如果“请求”被允许,它就会变成当前的。否则它会出错,并且 CS 永远不会采用请求的值。即 RPL 是您尝试使当前的东西的低 2 位。
    • 我认为之所以区分是因为cpu导致一些独立于当前上下文的请求。这允许针对 int 指令保护中断和故障。例如,发出一个 int $14 可能会混淆内核,因为堆栈帧是错误的,并且可能会打开一个漏洞。
    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2017-09-19
    • 2011-01-14
    • 2021-02-20
    • 1970-01-01
    • 2016-10-28
    相关资源
    最近更新 更多