页面错误异常处理程序和更新页表
问题描述:
在阅读页面错误和页面命中是如何由页面错误异常处理程序处理的时候,有一点我不清楚。如果进程正在使用共享页面并发生页面错误,那么当页面错误异常处理程序更新导致页面错误的进程的页表表项中的页表项时,它是否也会更新所有页面中的页表项共享相同页面的其他进程?从我对这个主题的阅读看来,它似乎只更新页表中错误进程的页表项,但其他进程怎么知道该页已被分页呢?提前致谢!页面错误异常处理程序和更新页表
答
这是您在设计内存管理器时必须解决的问题之一。一种可能的设计是为每个可以共享的页面设置一个影子PTE。当共享页面上的进程发生故障时,内存管理器会检查影子PTE。如果影子PTE不驻留,它将以正常方式处理页面错误,当页面可用时更新错误处理PTE和影子PTE。如果影子PTE是驻留的,那么它只是将影子PTE复制到进程PTE。当进程实际触及页面时,这种方式只会更新PTE。这就是我认为Windows的做法 - 我对Linux的了解有限,但由于几乎Linux进程中的每个页面都可以随时共享(由于分叉),所以我期望他们有不同的方式来处理共享,而不必为系统中的每个页面都设置影子PTE。
在这个模型中,如果你有异步页面错误处理,那么需要一些聪明才智,因为你需要处理页面上的另一个进程发生故障时的情况。你还需要处理页面输出的情况。在这种情况下,您需要浏览每个包含其工作集页面的进程并将其删除,这可能需要一些IPI和一些记录。