【问题标题】:x86 Switching to protected mode from real mode CPL (Current Privilege Level)x86 从实模式 CPL(当前权限级别)切换到保护模式
【发布时间】:2016-01-18 16:45:00
【问题描述】:

在 x86 中,在我们设置 PE 位 CR0 后,我们会执行一次远 JMP 以确保更改 CS/EIP。当我查看 x86 程序员手册中的逻辑流程时,对应于这条 far JMP 指令(保护模式),我看到如下内容:

Set RPL field of CS register to CPL;

我要确保特权级别为0。假设描述符中的DPL也是0,远JMP中的选择器中的RPL也是0。描述符中的C位为0,所以它是nonconforming-code-segment案子。手册说 CPL 是 CS 中的最后两位。这意味着,在远 JMP 之前,CS 应该包含一个最后两位为 00 的值。所以,当我最初处于实模式时,我是否应该确保 CS 在我之前具有符合此条件的某个值执行远 JMP? 如果换个说法,当我们从实模式切换到保护模式时,CPL 是什么?

【问题讨论】:

  • 好问题,顺便说一句。当我开始使用这些东西时,我想知道几个月来完全一样。
  • 谢谢,cad。不过,我的头在旋转,您的回复中嵌入了如此多的嵌套信息。我想我可能需要几个月的时间才能吸收他们。但在那之前我需要了解很多,因为我很快就会登上老师的讲台。

标签: x86 privileges protected-mode setjmp real-mode


【解决方案1】:

[...] 当我们从实模式切换到保护模式时,CPL 是什么?

当实模式处于活动状态时,CPL 设置为适合实模式“需要”的某个值(我猜它为零)。当跳转到保护模式时,它被分配了段选择器的最低有效两位的值。

[...] 我应该确保 CS 有一些符合这个的值吗 执行远 JMP 之前的条件?

不,这无关紧要。从技术上讲,CPU 对来自段寄存器的值不感兴趣,而是它们的影子寄存器 "segment descriptor caches." 这些影子寄存器包含 RPL、DPL、CPL、基地址以及段描述符中的其他内容。实模式中不需要的值(如 RPL)设置为适合实模式的值。当从实模式切换到保护模式时,实模式中不需要的值变为必需值,并使用从 GDT 获得的值进行初始化。当切换回实模式时,保护模式中相关的值再次变得无关紧要,从而获得特定的值1。

毕竟,CPU 直接从段描述符缓存中读取,而不是从段寄存器中读取。

有关此主题的更多信息,请阅读this 以及其中链接的论文。


1 实际上,这并不完全正确。阅读Unreal Mode。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多