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