我想正确理解交换过程,但是,无法找到完整的解释,一旦页面交换回内存,页面的 pte 标志如何恢复,因为交换出时它的信息“丢失”并且相应的磁盘区域的地址被插入到换出页的pte条目中。我确实了解虚拟地址的标志存储在vm_area_struct
但无法跟踪在换入过程中使用它时的阶段。
另一个潜在的问题是 - 如果父进程fork
ed,并且父进程和子进程都被换出,会发生什么:据我考虑,在两个页表中 - 标志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 页面被换出并且进程想要写入它。在这种情况下,您会遇到页面错误,因为页面已被换出。处理程序会处理这种情况,并且进程会进入睡眠状态,直到从磁盘读入页面为止。当该进程计划再次运行时,它会重新执行错误的写入指令,然后砰! — 我们遇到了一个新的错误,这次是因为该页面由于写时复制而变为只读。