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

Kernel 页面错误异常处理程序和更新页面表,kernel,virtual-memory,page-fault,Kernel,Virtual Memory,Page Fault,在阅读页面错误异常处理程序如何处理页面错误和页面点击时,有一件事我并不清楚。如果某个进程正在使用共享页面,并且发生页面错误,则当页面错误异常处理程序为导致页面错误的进程更新页面表中的页面表条目时,它是否也会更新共享同一页面的所有其他进程中的页面表条目?从我对该主题的阅读来看,它似乎只更新了页面表中的页面表条目,用于出错进程,但其他进程如何知道该页面已被分页?提前谢谢 这是内存管理器设计中必须解决的问题之一。一种可能的设计是为每个可以共享的页面都提供一个影子PTE。当共享页上的进程出现故障时,内存

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

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

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