代码之家  ›  专栏  ›  技术社区  ›  Tom

当CS寄存器的CPL值等于0时,x86 CPU是否处于内核模式?

  •  0
  • Tom  · 技术社区  · 7 年前

    CS寄存器的最后两位包含当前特权级别(CPL),它可以包含 0 1 2 3 .

    如果cpl的值是 ,这是否意味着CPU处于内核模式(因此可以执行所有操作)?或者,为了使cpu处于内核模式,还必须应用其他一些东西吗?

    0 回复  |  直到 7 年前
        1
  •  2
  •   Alexey Frunze    7 年前

    是的,cpl=0表示内核/管理器模式。然而,在实模式下,cpl也是0,但没有在cs中反映出来。同样,在虚拟8086模式中,cpl是3,而不是在cs中反映。

    在某种程度上相关,您也可以使用SMSW指令检查CR0的位0(它返回CR0的16个低位)来检查保护模式。在虚拟8086模式下,位将被设置为1,因为CPU只能通过保护模式(您可以将前者视为后者的子模式)才能到达。

        2
  •  1
  •   Hadi Brais    7 年前

    cpl值为0称为内核模式。另外,小于3的cpl值称为supervisor模式,小于3的cpl值称为user模式。

    这个 ENCLU 指令(英特尔SGX指令集的一部分)只能在用户模式下执行。这是我知道的唯一只能在用户模式下执行的指令。如果cpl<3,执行 恩克鲁 导致无效的操作码异常。

    有一些事情是主管模式代码可以阻止自己做的 但仍然允许用户模式代码执行它们 :

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

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

    推荐文章