【问题标题】:How kernel threaduse memory descriptor(mm_struct) of last ran process in Linux?内核线程如何使用 Linux 中最后运行的进程的内存描述符(mm_struct)?
【发布时间】:2014-12-17 04:31:16
【问题描述】:

Linux 内核开发中提到的一些要点(作者 Robert 爱)关于 mm_struct 和内核线程的书是:

“内核线程没有进程地址空间,因此没有 有一个关联的内存描述符。因此,内核的 mm 域 线程的进程描述符为 NULL。 "

"因为内核线程在用户空间中没有任何页面,所以它们没有 真的值得拥有自己的内存描述符和页表(页表是 本章后面讨论)。尽管如此,内核线程需要一些 数据,例如页表,甚至访问内核内存。”

"内核线程没有地址空间,mm为NULL。因此,当 一个内核线程被调度,内核注意到 mm 为 NULL 并保持 加载了前一个进程的地址空间。然后内核更新 内核线程的进程描述符的 active_mm 字段来引用 前一个进程的内存描述符。然后内核线程可以使用 根据需要前一个进程的页表。”

现在我的查询是: 1.首先提到内核线程在用户中没有任何页面 空间,因此他们不值得内存描述符和页表和 下一行它说它需要一些数据,例如页表来访问 内核内存。它在这里指的是什么页表?每个过程都有它的 自己的页表,用于将虚拟地址映射到物理地址,为什么内核 线程需要那个?

内核线程如何使用页表?

【问题讨论】:

    标签: linux linux-kernel


    【解决方案1】:

    每个线程,无论是用户空间还是内核空间进程,都需要一个页表。内核地址空间(虚拟内存地址空间)直接映射到物理地址空间,而用户空间地址空间没有直接映射。此外,用户空间应用程序地址空间映射随着新进程的创建、终止、交换而不断变化,而内核空间映射保持不变。 要了解更多信息,您可以访问以下链接:-

    Process address Space

    或在此处发布查询。

    【讨论】:

      【解决方案2】:

      您的系统中有一些使用空间应用程序和内核线程。每个虚拟地址空间都由内核和用户部分组成。所有进程的内核都相同,用户部分不同。

      每个进程都有自己的页表,用于将虚拟映射到 物理地址,为什么内核线程需要这个?

      内核线程在访问内存时需要页表来进行从虚拟地址到物理地址的转换。

      内核线程如何使用页表?

      想象一个简单的情况,内存写入如 a[i] = 5;在内核空间。这通常通过 MMU,它使用页表根据虚拟地址(在本例中为 &a[i])获取物理地址。所以内核线程没有什么特别之处,不同的是在上下文切换时它们不会更改 pgd(页面全局目录),它们使用最后一个进程的 pgd,因为所有进程都有相同的内核部分,你可以选择最后一个一个(见 actime_mm)就可以了。

      【讨论】:

      • “在上下文切换时,他们不改变 pgd,他们使用最后一个进程的 pgd”,这意味着所有进程 pgd 也将内核空间映射到自己的 pgd(mm->pgd),“进程自己的 pgd + 内核 pgd= mm->pgd" 对吗?请解释一下,如果有任何在线文章请发送链接,我对此感到很困惑:
      • 地址空间由内核和用户部分组成,而不仅仅是用户部分。每个进程实际上都映射内核空间,原理是进程只能在系统模式下访问内核内存。 mm->pgd 是指向页全局目录(页表)的指针。每个过程都有它。并且您可以使用此页表从虚拟地址获取内核物理地址,与您使用哪个进程 pgd 无关。1.) 关于虚拟内存 alexhoppus.com/2014/07/21/virtual-memory 2.) 关于 active_mm Wolfgang Mauerer Professional Linux Kernel page 78跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 2017-09-19
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多