当为进程创建页面(将映射到进程地址空间)时,该页面是否会映射到内核地址空间?
如果没有,那么它将没有内核虚拟地址。那么如果需要,交换器将如何找到页面并将其交换出去?
当为进程创建页面(将映射到进程地址空间)时,该页面是否会映射到内核地址空间?
如果没有,那么它将没有内核虚拟地址。那么如果需要,交换器将如何找到页面并将其交换出去?
如果我们谈论的是 x86 或类似(就页面转换而言)架构,那么在任何给定时间都有一个虚拟地址空间,通常其中一部分保留给内核,另一部分保留给用户模式进程。
在两个进程之间的上下文切换中,只有虚拟地址空间的用户模式部分会发生变化。
有了这样的组织,内核总是可以完全访问当前的用户模式进程,因为在任何时候内核和用户模式进程都只有一个当前虚拟地址空间,不是两个,而是一个. 因此,内核实际上不必为用户模式页面提供另一个额外的映射。但这不是重点。
要点是内核为每个页面保留某种统计信息,如果需要,可以将其保存到磁盘并在其他地方重复使用。CPU 将每个页面标记page table entry (PTE)
为accessed
第一次读取或写入页面的时间以及dirty
首次写入的时间。
内核定期扫描 PTE,读取accessed
和dirty
标记以更新所述统计信息并清除accessed
,dirty
因此它可以稍后检测它们的变化(当然,如果有的话)。基于此统计信息,它确定哪些页面很少使用或长期未使用并且可以重新利用。
如果“交换器”在当前进程的上下文中运行并且如果它在内核中运行,那么理论上它有足够的来自内核的信息(很少使用或长时间未使用的页面列表来保存和取消映射 ifdirty
或只是 unmap if不是dirty
)和足够的访问感兴趣的页面。
如果“交换器”本身作为用户模式进程运行,事情会变得更加复杂,因为默认情况下它无法访问另一个进程的页面,并且必须创建映射或要求内核为它做一些额外的工作感兴趣的过程的上下文。
因此,在内核中查找很少使用和长期未使用的页面及其地址。CPU 通过自动将 PTE 标记为accessed
和来提供帮助dirty
。dirty
如果将它们保存到磁盘而不是拥有它们的进程的上下文中,则可能需要对页面进行额外的映射。