0

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

来自 VMWare 的演示文稿

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

在第 20 页上说:

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

    • EMT64T 也缺少分段

    我们如何保护 VMM?

    • 64 位来宾支持需要额外的硬件协助
    • 在较新的 AMD 处理器上以 64 位模式提供段限制检查

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

4

3 回答 3

5

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

于 2011-10-22T17:36:53.170 回答
3

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

于 2011-10-22T17:32:21.830 回答
1

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

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

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

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

于 2020-04-29T21:53:56.197 回答