【问题标题】:Linux Kernel logical address for multiple processes多个进程的Linux内核逻辑地址
【发布时间】:2012-10-11 08:23:09
【问题描述】:

据我了解,“每个进程的地址空间分为 3G/1G 用于用户空间/内核空间,1G(少一点)与物理地址一一映射,称为内核逻辑地址”。 现在,我的问题是,系统上运行着多个进程,所有进程如何与物理地址进行一对一的映射? 例如,当内核在进程 A 的上下文中访问内核逻辑地址时,现在发生了抢占,当内核访问进程 B 的上下文中的逻辑地址时会发生什么?

在类似的情况下,只有 512MB RAM 的 PC 会发生什么?对于这些 PC,1G 内核空间的一对一映射是如何发生的?

【问题讨论】:

  • 仅在 32 位系统上应注意。顺便说一句,在 32 位 ARM 系统上,拆分通常是 2GB/2GB。

标签: linux memory-management linux-kernel embedded-linux


【解决方案1】:

首先考虑总虚拟地址空间的内核部分(比如说 1GB)并没有全部被使用可能会有所帮助。而且总的物理内存并没有全部映射到内核空间。

内核空间将具有其使用的物理 RAM 的虚拟内存映射,以及定义的任何内存映射外围设备。那些没有分页。

用户空间中的每个进程最多可以有 3 GB 的虚拟内存用于其代码+数据。对于物理内存,有两个极端,看一下它们可能会有所启发。

大物理内存:如果处理器支持大物理寻址,例如36 位,可能有 64 GB 的物理内存。您可以有多个进程,每个进程都有 3 GB 代码+数据,它们甚至不必将页面交换到辅助存储。每个上下文切换都会设置 MMU 以将新执行进程的物理内存映射回用户空间。

小物理内存:假设有 512 MB,内核使用其中的 128 MB。剩余的 384 MB 将保存用户进程的代码+数据。如果用户进程需要更多,页面将根据需要在辅助存储和 RAM 之间交换。

【讨论】:

    【解决方案2】:

    这是一个链接,它为我的问题提供了很好的说明。

    http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory

    “在 Linux 中,内核空间一直存在,并在所有进程中映射相同的物理内存。内核代码和数据始终是可寻址的,随时准备处理中断或系统调用。相比之下,用户的映射 -每当进程切换发生时,地址空间的模式部分就会改变:"

    回答问题的第一部分:Linux 内核空间在所有进程中保持相同,并且进程上下文切换无关紧要。内核空间在所有进程上下文中保持映射到相同的 RAM 页面。

    回答问题的第二部分:物理 RAM 大小(512 MB 或 2GB)的大小与内核地址空间无关。与规则一样,内核有 1G 的内核地址空间可用,无论它进行什么分配,都使用这些地址。将这些地址映射到可用 RAM(512MB 或 2GB)是 MMU 的工作。 在 1G 或更多 RAM 的情况下,整个 1G 将被映射为内核地址空间,而在 512 MB RAM 的情况下,它将是 512MB。它不会损害用户空间地址,因为一切都是虚拟地址,它们会根据需要被换出,包括内核空间页面的那些。

    注意:这里我假设 1G/3G 拆分,这不是硬性规定。

    【讨论】:

      【解决方案3】:

      嗯,在传统的多核系统中,所有处理器都可以访问所有 RAM。在 Linux 中,每个进程在 3GB 端都有自己的地址空间,而 1GB 端保持不变(我认为)因为内核在某种程度上是一个始终存在的进程。因为虚拟内存的内核部分保持不变(因此,有一个内核地址空间),所以当它抢占一个进程时,内核地址空间不会改变。

      很简单,内核只映射这 512 MB。其他 512 MB 的虚拟地址空间只是映射到空页面条目,它只是告诉 CPU 在该地址不应访问任何内存,并在访问时引发 CPU 异常。

      【讨论】:

      • 感谢Linuxios的回答。它有助于。我找到了一个链接,它提供了额外的清晰度。我也基于该链接发布了答案
      猜你喜欢
      • 2012-02-01
      • 1970-01-01
      • 2011-09-09
      • 2018-07-06
      • 1970-01-01
      • 2021-10-26
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多