【问题标题】:Page Fault Exception Handlers and Updating Page Tables页面错误异常处理程序和更新页表
【发布时间】:2013-05-03 00:17:48
【问题描述】:
在阅读页面错误异常处理程序如何处理页面错误和页面命中时,我不清楚一件事。如果一个进程正在使用共享页并且发生了页错误,那么当页错误异常处理程序为导致该页错误的进程更新页表中的页表条目时,它是否也会更新所有共享页中的页表条目?共享同一页面的其他进程?从我对该主题的阅读来看,它似乎只更新页表中的页表条目以用于故障进程,但是其他进程如何知道该页面已被分页?提前致谢!
【问题讨论】:
标签:
kernel
virtual-memory
page-fault
【解决方案1】:
这是您在设计内存管理器时必须解决的问题之一。一种可能的设计是为每个可以共享的页面设置一个影子 PTE。当共享页面上的进程出现故障时,内存管理器会检查影子 PTE。如果影子 PTE 不是常驻的,它会以正常方式处理页面错误,当页面可用时更新错误进程 PTE 和影子 PTE。如果影子 PTE 是常驻的,那么它只是将影子 PTE 复制到进程 PTE。这样,进程 PTE 仅在进程实际接触到页面时才会更新。这就是我认为 Windows 的做法——我对 Linux 的了解有限,但由于几乎 Linux 进程中的每个页面都可以随时共享(由于分叉),我希望他们有不同的处理方式来处理无需为系统中的每个页面都设置影子 PTE。
在此模型中,如果您有异步页面错误处理,则需要一些技巧,因为您需要处理另一个进程在页面错误进入时发生错误的情况。您还需要处理分页情况。在这种情况下,您需要检查在其工作集中包含该页面的每个进程并将其删除,这可能需要一些 IPI 和一些簿记。