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