页错误异常处理程序和更新页表



在阅读页面错误异常处理程序如何处理页面错误和页面点击时,有一件事我不太清楚。如果一个进程正在使用共享页面,并且发生了页面错误,那么当页面错误异常处理程序为导致页面错误的进程更新页表中的页表项时,它是否也会更新共享同一页面的所有其他进程中的页表项?从我对这个主题的阅读来看,它似乎只更新了页表中的页表条目,用于故障进程,但其他进程如何知道该页已被分页?提前感谢!

这是您在设计内存管理器时必须解决的问题之一。一种可能的设计是为每个可以共享的页面创建一个影子PTE。当共享页面上的进程出现故障时,内存管理器检查影子PTE,如果影子PTE不驻留,则按照正常方式处理页面故障,在页面可用时同时更新出现故障的进程PTE和影子PTE。如果影子PTE是常驻的,那么它只是将影子PTE复制到进程PTE,这样进程PTE只有在进程实际接触页面时才会更新。这是我认为Windows是这样做的——我对Linux的了解有限,但由于Linux进程中的几乎每个页面都可以随时共享(由于fork),我希望他们有不同的方式来处理共享,而不必为系统中的每个页面都有影子pte。

在此模型中,如果您有异步页面错误处理,则需要一些聪明的方法,因为您需要处理另一个进程在页面上出错的情况。您还需要处理分页出情况。在这种情况下,您将需要遍历在其工作集中拥有该页面的每个进程并删除它,这可能需要一些IPI和一些簿记。

最新更新