【问题标题】:Is an x86 CPU in kernel mode when the CPL value of the CS register is equal to 0?当 CS 寄存器的 CPL 值等于 0 时,x86 CPU 是否处于内核模式?
【发布时间】:2019-08-25 16:06:40
【问题描述】:

CS 寄存器的最后两位包含当前特权级别 (CPL),它可以包含值 0123

如果 CPL 的值为0,这是否意味着 CPU 处于内核模式(因此可以做任何事情)?或者为了使 CPU 处于内核模式,还有其他必须应用的东西吗?

【问题讨论】:

  • 如果您处于 32 位保护模式或 64 位长模式(或 32 位或 16 位兼容模式),可以通过查看寄存器 CR0 的位 0 和CS 中的 RPL 位为零,然后您处于 ring 0 内核模式。在实模式下,段选择器实际上是不同含义的段寄存器。

标签: x86 operating-system kernel-mode


【解决方案1】:

是的,CPL=0 表示内核/主管模式。但是,在实模式下,CPL 也为 0,但在 CS 中没有体现。同样,在虚拟 8086 模式下,CPL 为 3,不会反映在 CS 中。

有些相关,您还可以通过使用 SMSW 指令检查 CR0 的位 0 来检查保护模式(它返回 CR0 的低 16 位)。在虚拟 8086 模式下,该位将设置为 1,因为 CPU 只能通过保护模式到达那里(您可以将前者视为后者的子模式)。

【讨论】:

    【解决方案2】:

    CPL 值为 0 称为内核模式。顺便提一下,CPL 值小于 3 的称为主管模式,CPL 值小于 3 的称为用户模式。

    ENCLU 指令(英特尔 SGX 指令集的一部分)只能在用户模式下执行。这是我所知道的唯一一条只能在用户模式下执行的指令。如果 CPL ENCLU 会导致操作码无效异常。

    监督模式代码可以阻止自己执行某些操作但仍允许用户模式代码执行它们

    • 如果设置了CR4.SMEP,如果管理员模式代码尝试从用户页面获取指令,则会发生页面错误。
    • 如果设置了CR4.SMAP,如果主管模式代码尝试从用户页面访问数据,则会发生页面错误。

    值得注意的是,性能事件选择寄存器包含称为用户模式标志和操作系统模式标志的标志。在此上下文中,“用户”模式包括权限级别 1、2 和 3,“操作系统”模式包括权限级别 0。

    【讨论】:

      猜你喜欢
      • 2014-10-16
      • 2019-12-10
      • 1970-01-01
      • 2011-12-31
      • 2018-04-12
      • 2019-03-05
      • 1970-01-01
      • 2012-02-17
      • 2019-08-23
      相关资源
      最近更新 更多