据我了解,“每个进程的地址空间分为用户空间/内核空间的3G / 1G,而1G(少一点)与物理地址一一映射,称为内核逻辑地址”。现在,我的问题是,系统上运行着多个进程,所有进程如何与物理地址进行一对一的映射?例如,当内核在进程 A 的上下文中访问内核逻辑地址时,现在发生了抢占,当内核访问进程 B 的上下文中的逻辑地址时会发生什么?
在类似的情况下,只有 512MB RAM 的 PC 会发生什么?这些 PC 的 1G 内核空间的一对一映射是如何发生的?
据我了解,“每个进程的地址空间分为用户空间/内核空间的3G / 1G,而1G(少一点)与物理地址一一映射,称为内核逻辑地址”。现在,我的问题是,系统上运行着多个进程,所有进程如何与物理地址进行一对一的映射?例如,当内核在进程 A 的上下文中访问内核逻辑地址时,现在发生了抢占,当内核访问进程 B 的上下文中的逻辑地址时会发生什么?
在类似的情况下,只有 512MB RAM 的 PC 会发生什么?这些 PC 的 1G 内核空间的一对一映射是如何发生的?
这是一个链接,它为我的问题提供了很好的说明。
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 拆分,这不是硬性规定。
首先考虑总虚拟地址空间的内核部分(比如说 1GB)并没有全部被使用可能会有所帮助。并且总的物理内存并没有全部映射到内核空间。
内核空间将具有它使用的物理 RAM 的虚拟内存映射,以及定义的任何内存映射外围设备。那些没有分页。
用户空间中的每个进程可以为其代码+数据拥有多达 3 GB 的虚拟内存。对于物理内存,有两个极端,看看每一个都可能会有所启发。
大物理内存:如果处理器支持大物理寻址,例如 36 位,则可能有 64 GB 的物理内存。您可以有多个进程,每个进程都有 3 GB 代码+数据,它们甚至不必将页面交换到辅助存储。每个上下文切换都会设置 MMU 以将新执行进程的物理内存映射回用户空间。
小物理内存:假设有 512 MB,内核使用其中的 128 MB。剩余的 384 MB 将保存用户进程的代码+数据。如果用户进程需要更多,页面将根据需要在辅助存储和 RAM 之间交换。
好吧,在传统的多核系统中,所有处理器都可以访问所有 RAM。在 Linux 中,每个进程在 3GB 端都有自己的地址空间,而 1GB 端保持不变(我认为)因为内核在某种程度上是一个始终存在的进程。因为虚拟内存的内核部分保持不变(因此,有一个内核地址空间),所以当它抢占一个进程时,内核地址空间不会改变。
很简单,内核只映射那些 512 MB。其他 512 MB 的虚拟地址空间只是映射到空页面条目,它只是告诉 CPU 在该地址不应访问任何内存,并在访问时引发 CPU 异常。