当为进程创建页面(将被映射到进程地址空间)时,该页面会被映射到内核地址空间吗?
如果没有,那么它将没有内核虚拟地址。那么交换器如何找到该页面并在需要时将其交换出来?
最佳答案
如果我们谈论 x86 或类似的(就页面转换而言)架构,在任何给定时间都有一个虚拟地址空间,通常其中一部分为内核保留,另一部分为用户模式进程保留.
在两个进程之间进行上下文切换时,只有虚拟地址空间的用户模式部分发生变化。
通过这样的组织,内核始终可以完全访问当前用户模式进程,因为,同样,在任何时刻内核和用户模式进程都只有一个当前虚拟地址空间,而不是两个,是一个。因此,内核实际上不需要为用户模式页面提供另一个额外的映射。但这不是重点。
要点是内核为每个页面保留某种统计信息,如果需要可以将其保存到磁盘并在其他地方重用。当第一次读取或写入页面时,CPU 将每个页面的页表条目 (PTE)
标记为已访问
,并在第一次读取或写入页面时将其标记为脏
写给。
内核定期扫描 PTE,读取accessed
和 dirty
标记以更新所述统计信息并清除accessed
和dirty
这样它就可以稍后检测到它们的更改(当然,如果有的话)。根据此统计数据,它可以确定哪些页面很少使用或长期未使用并且可以重新利用。
如果“交换器”在当前进程的上下文中运行并且在内核中运行,那么理论上它从内核中获得了足够的信息(很少使用或长期未使用的页面列表,如果 dirty
或仅取消映射(如果不是 dirty
))以及对感兴趣页面的足够访问权限。
如果“交换器”本身作为用户模式进程运行,事情会变得更加复杂,因为默认情况下它无法访问另一个进程的页面,并且必须创建映射或要求内核做一些额外的工作在感兴趣的过程的背景下进行它。
因此,查找很少使用和长期未使用的页面及其地址是在内核中进行的。 CPU 通过自动将 PTE 标记为已访问
和脏
来提供帮助。如果将脏页保存到磁盘而不是在拥有它们的进程的上下文中,则可能需要对脏页进行额外的映射。
关于memory-management - 分配给用户进程的Page在内核虚拟地址空间中的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10043498/