AMD 64位模式下的段限制检查

问题描述 投票:0回答:3

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

来自VMWare的此演示文稿

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

第20页说:

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

    • EMT64T中也缺少细分

    我们如何保护VMM?

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

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

assembly operating-system x86-64 memory-segmentation
3个回答
5
投票

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


3
投票

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


0
投票

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

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

我到处都看到了,但是我不相信。您不需要分段即可保护虚拟机监控程序陷阱处理程序或IDT。您可以通过分页来实现。

使SPT中的某个虚拟地址范围始终映射虚拟机监控程序陷阱处理程序,并将IDT映射到它在主机上的虚拟地址处。 IDT需要1个4KiB页面。 SPT中的这些页面被设置为主管,这意味着环1中的来宾内核无法向其写入,因为这将导致直接进入映射到来宾的IDT的陷阱。现在环0,可以执行代码。当访客确实对那些保留的虚拟地址范围进行读/写操作时,它不需要知道它是保留的,即,虚拟机监控程序驱动程序以静默方式将某些CR3的访问重定向到一个干净的页面。从Ring 1 guest虚拟机内核进行读/写将导致GPF,而CR2将包含尝试写入的地址。通常,页面有错误,然后推送的RIP是要重新尝试的指令,但是在这种情况下,它无法执行此操作。它需要对陷阱帧中的RIP本身进行解码并执行读/写操作,以通过使用专用于内部表的纯内部表将其转换为新的主机物理页,而该内部表仅用于来宾修改PTE时建立的保留区域,然后增加RIP 。

© www.soinside.com 2019 - 2024. All rights reserved.