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

时间:2011-10-22 17:20:33

标签: assembly operating-system x86-64

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

来自VMWare的演示文稿

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

第20页

说:

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

         
        
    • EMT64T也缺少细分
    •   
         

    我们如何保护VMM?

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

现在,我有更新的AMD处理器型号,我的问题是如何在64位(长)模式下对AMD处理器进行限制段限制检查?我已经下载了2011年9月版(最新)的开发者手册,我无法在任何地方找到如何做到这一点,请帮忙。

3 个答案:

答案 0 :(得分:3)

分段是实现内存保护的一种古老且非常慢的方式。即使它出现了,没有人使用它,因为它太慢了 - 英特尔发明了这个,但实际上并没有与操作系统供应商谈论他们想要的东西。您确实需要像其他现代操作系统一样使用页面错误。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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

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

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