分配给内核虚拟地址空间中用户进程的页面映射



为进程创建页面(将映射到进程地址空间)时,该页面是否会映射到内核地址空间?

如果没有,那么它将没有内核虚拟地址。那么,如果需要,交换器将如何找到页面并将其交换出来?

如果我们谈论的是 x86 或类似的(就页面翻译而言)架构,在任何给定时间都有一个虚拟地址空间,通常其中一部分保留给内核,另一部分保留给用户模式进程。

在两个进程之间的上下文切换中,只有虚拟地址空间的用户模式部分会更改。

对于这样的组织,内核始终具有对当前用户模式进程的完全访问权限,因为内核和用户模式进程在任何时候都只有一个当前虚拟地址空间,它不是两个,而是一个。因此,内核实际上不必为用户模式页面提供另一个额外的映射。但这不是重点。

重点是内核为每个页面保留某种统计信息,如果需要,可以将其保存到磁盘并在其他地方重用。CPU 将每个页面的page table entry (PTE)标记为首次读取或写入页面时accessed,首次写入页面时标记为dirty

内核定期扫描 PTE,读取accesseddirty标记以更新所述统计信息并清除accesseddirty以便以后可以检测到它们的变化(当然,如果有的话)。根据此统计信息,它确定哪些页面很少使用或长期未使用,并且可以重新利用。

如果

"swapper"在当前进程的上下文中运行并且如果在内核中运行,那么理论上它有足够的内核信息(很少使用或长时间未使用的页面列表,如果dirty保存和取消映射,或者如果不dirty,则只是取消映射)和足够的访问感兴趣的页面。

如果"交换器"本身作为用户模式进程运行,事情会变得更加复杂,因为它默认情况下无法访问另一个进程的页面,并且必须创建映射或要求内核在感兴趣的进程上下文中为其做一些额外的工作。

因此,查找很少使用和长时间未使用的页面及其地址发生在内核中。CPU 通过自动将 PTE 标记为 accesseddirty 来提供帮助。如果页面保存到磁盘而不是在拥有它们的进程上下文中,则可能需要额外的映射来dirty页面。

最新更新