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

时间:2013-05-08 17:00:40

标签: kernel virtual-memory page-fault

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

1 个答案:

答案 0 :(得分:0)

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

在此模型中,如果您具有异步页面错误处理,则需要一些聪明才能,因为您需要处理页面上其他进程在出现故障时出现故障的情况。您还需要处理分页情况。在这种情况下,您需要遍历其工作集中包含页面的每个进程并将其删除,这可能需要一些IPI和一些簿记。