当页面从交换区换入时,pte 的标志如何恢复?

当页面从交换区换入时,pte 的标志如何恢复?

我想正确理解交换过程,但是,无法找到完整的解释,一旦页面交换回内存,页面的 pte 标志如何恢复,因为交换出时它的信息“丢失”并且相应的磁盘区域的地址被插入到换出页的pte条目中。我确实了解虚拟地址的标志存储在vm_area_struct但无法跟踪在换入过程中使用它时的阶段。

另一个潜在的问题是 - 如果父进程forked,并且父进程和子进程都被换出,会发生什么:据我考虑,在两个页表中 - 标志read_only都打开,但vm_area_struct允许写入,因为两者都有VM_MAYWRITE某些内存区域的权限但是一旦换出,read_only相应 pte 中的标志就会被“擦除”。一旦页面被换入且子进程想要写入,COW 技术是否仍然适用于它们都指向的页面?

答案1

就像你说的,它vm_area_struct告诉在哪个内存区域发生了故障,并且保护标志包含在这个结构中。该函数__do_page_fault调用find_vma以获取指向 的指针vm_area_struct。然后,该结构体handle_pte_fault一路传递到do_swap_page(在vm_fault *vmf参数中),该结构mk_pte以保护位作为参数进行调用。

您的另一个问题:如果 COW 页面被换出并且进程想要写入它。在这种情况下,您会遇到页面错误,因为页面已被换出。处理程序会处理这种情况,并且进程会进入睡眠状态,直到从磁盘读入页面为止。当该进程计划再次运行时,它会重新执行错误的写入指令,然后砰! — 我们遇到了一个新的错误,这次是因为该页面由于写时复制而变为只读。

相关内容