【问题标题】:segment limit check in AMD 64-bit modeAMD 64 位模式下的段限制检查
【发布时间】:2011-12-13 06:15:51
【问题描述】:

我正在为 64 位处理器编写自己的操作系统,但遇到了一般保护问题。我的操作系统不会依赖页面错误来实现用户空间保护机制,所以我发现有一种方法可以通过段限制检查来做到这一点:

来自 VMWare 的演示文稿

http://download3.vmware.com/vmworld/2005/pac346.pdf

第 20 页说:

  • 最初的 AMD64 架构不包括 64 位模式下的分段

    • EMT64T 也缺少分段

    我们如何保护 VMM?

    • 64 位来宾支持需要额外的硬件协助
    • 在 64 位模式下可在较新的 AMD 处理器上进行分段限制检查

现在,我有较新的 AMD 处理器型号,我的问题是如何在 64 位(长)模式下对 AMD 处理器进行限制段限制检查?我已下载 2011 年 9 月版(最新)的开发者手册,但在任何地方都找不到如何执行此操作,请帮助。

【问题讨论】:

    标签: assembly operating-system x86-64 memory-segmentation


    【解决方案1】:

    我认为他们可能正在谈论Volume 2 3.1.7 pg. 55 中“扩展功能启用寄存器”(EFER)中的长模式段限制启用位(LMSLE 第 13 位)。在第 114 页上的“4.12.2 64 位模式下的数据限制检查”中有更详细的描述。请注意,EFER 是一个特定于模型的寄存器(更多信息请参见“6.2.5 访问特定于模型的寄存器”第 156 页也在第 2 卷中)。

    【讨论】:

    • 谢谢。这正是它的特点。但不幸的是我不能使用它,因为它只检查前 4GB 内存的限制。我需要检查每个进程的段限制,它应该适用于 4GB 以上的地址。
    • 不幸的是,正如@PaulBetts 的回答还指出的那样,如果您尝试在 64 位操作系统上施加分段内存访问,那么您正在与机器对抗(并且您很快就会大发雷霆)。限制检查可能是为了响应 VMWare 和其他人的需要而添加的,而不是操作系统编写者。
    【解决方案2】:

    分段是实现内存保护的一种古老且非常缓慢的方法。即使它问世,也没有人使用它,因为它太慢了——英特尔发明了这个,但实际上并没有与操作系统供应商交谈,看看他们首先想要什么。您确实需要像其他现代操作系统一样使用页面错误。

    【讨论】:

    • 我认为当页面遍历完成时使用分页会带来更多的性能损失。最好有一个段并检查其限制,这可以在 1 个周期内完成。页面遍历将导致更糟糕的 DRAM 访问,并且可以从缓存中驱逐数据
    • @Nulik:并非所有的周期都是一样的。虽然段检查可能发生在您的使用程序中的“一个周期”中,但该周期可能比不执行相同操作的其他 30 个(或数千个)时钟周期长得多。就像mov eax, [addr] 一样,可能只需要 N 个用户时钟周期,但需要数百万个内核周期来分页。(这一切都归结为权衡。通过分段,如果您想移动代码/数据,则必须修复指针周围)。
    • Nulik:当您必须在每次上下文切换时不断切换段时,性能损失就会发生,this 是缓慢的部分
    • @PaulBetts 但据我了解,在上下文切换期间,内核必须保存任务的所有寄存器,包括 DS。或者,这是否意味着它只保存了一些寄存器?如果是这样,如果我的汇编程序使用 DS 来存储一些辅助数据,而不是作为数据指针呢?程序会在第一次上下文切换时崩溃。
    • @Paul Betts osdev 论坛上的一些人指出,上下文切换意味着 TLB 切换,但分段时你不这样做,所以我怀疑分页是否比分段更快。
    【解决方案3】:

    虽然这不能回答问题,但这与删除 64 位模式下的段限制检查有关,据说在没有硬件虚拟化的情况下“不可能”保护管理程序陷阱处理程序,这是人们可能希望看到的讨论问题标题。我同意“打破一些现有的实现”,但不是“不可能”。

    x86-64 (AMD64) 的初始版本由于缺少长模式下的分段支持而不允许纯软件全虚拟化,这使得管理程序的内存无法保护,特别是对在来宾内核地址空间中运行的陷阱处理程序。

    我看到这一切,但我不相信。您不需要分段来保护管理程序陷阱处理程序或 IDT。你可以通过分页来做到这一点。

    使 SPT 中的某个虚拟地址范围始终映射虚拟机管理程序陷阱处理程序,并将 IDT 映射到它在主机上的虚拟地址。 IDT 需要 1 个 4KiB 页面。 SPT 中的这些页面被设置为主管,这意味着 ring 1 中的客户内核无法写入它们,因为它会导致一个陷阱直接进入映射到客户的 IDT。现在响0,代码可以执行了。当客户确实读/写这些保留的虚拟地址范围时,它需要不知道它是保留的,即管理程序驱动程序静默地将具有某些 CR3 的访问重定向到一个干净的页面。来自 ring 1 来宾内核的读/写将导致 GPF,并且 CR2 将包含尝试写入的地址。通常,页面出错,然后推送的 RIP 是要重新尝试的指令,但在这种情况下它不能这样做。它需要在陷阱帧中的 RIP 上自行解码并执行读/写到新的主机物理页面,方法是使用一个特殊的内部表来转换它,纯粹是为来宾修改 PTE 时构建的那些保留区域,然后增加 RIP .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多