【问题标题】:Mapping of Page allocated to user process in Kernel virtual address space内核虚拟地址空间中分配给用户进程的页面的映射
【发布时间】:2012-04-06 12:29:12
【问题描述】:

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

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

【问题讨论】:

    标签: memory-management kernel virtual-address-space


    【解决方案1】:

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

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

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

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

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

    如果“swapper”在当前进程的上下文中运行并且如果它在内核中运行,那么理论上它有足够的来自内核的信息(很少使用或长时间未使用的页面列表,如果@ 987654329@ 或者如果不是 dirty 则直接取消映射)以及对感兴趣页面的足够访问权限。

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

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

    【讨论】:

    • 你是说内核(比如linux)将始终在进程上下文中运行(在x86架构中)?如果是这样,您对linux内核如何访问需要换出的页面(对于不在上下文中的进程)有任何想法吗?还有一个,如果没有进程在运行(理论上)怎么办?\
    • 它可以切换到该进程的上下文或创建映射而不切换。我不知道这两个中的哪一个。
    • 那为什么会有3种上下文呢? (内核上下文、中断上下文、进程上下文)http://www.learninglinuxkernel.com/Introduction_03.html
    • 您需要了解更多关于 CPU 和操作系统以及上下文一词在每个上下文中的含义(对于重言式感到抱歉)。找一些 Tanenbaum 的书(Minix 或现代操作系统)来填补空白。
    • 但是内核线程不会在进程上下文中运行。所以那时它只能访问内核虚拟内存。
    猜你喜欢
    • 1970-01-01
    • 2018-01-16
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多