每个进程有2个内存区域:用户空间(高内存)和内核空间(低内存)。在内核空间中,前 896 MB 是否用于映射内核代码(不是完全 1 GB)?这意味着,当用户空间应用程序执行系统调用或与内核相关的任何操作时,内核将引用内核空间来执行系统调用,是吗?
内核空间中保留的128MB(用于高端内存(用户空间)访问),是不是都是用户空间内存区域的引用?那么,内核进程可以通过引用该区域来访问任何用户空间,这是真的吗?
这就是为什么这个区域在内核空间中被称为highmem,不是吗?
答案1
“高内存”和“低内存”不适用于进程的虚拟地址空间,而是涉及物理内存。
在进程的虚拟地址空间中,用户空间占据该线性地址空间的前3GB,内核空间占据该线性地址空间的第四GB。
内核空间的前 896MB(不仅是内核代码,还有其数据)“直接”映射到物理内存的前 896MB。它是“直接”的,因为虚拟内核空间的 896MB 部分的任何线性地址与其在物理内存中的相应地址之间始终存在 0xc0000000 的偏移量(但请注意,MMU 已启用,并且页表条目实际上是用于此)。
虚拟内核空间的最后128MB部分是映射物理“高端内存”的一些部分(> 896MB):因此它一次只能映射不超过128MB的“高端内存”。
参考:“理解 Linux 内核”,第三版 - “8.1.3. 内存区域”和“8.1.6. 高内存页帧的内核映射”部分。
答案2
注意:-内存分割仅发生在较旧的 Linux 系统中(32位)有关更多详细信息,请参阅下面的评论。
高内存和低内存:
- 记忆不足 :逻辑地址存在于内核空间中的内存。在您可能遇到的几乎每个系统上,所有内存都是低内存。
- 高内存:不存在逻辑地址的内存,因为它超出了为内核虚拟地址预留的地址范围。这意味着内核需要开始使用它想要访问的物理内存片段的临时映射。
内核将虚拟地址分成两部分用户地址空间和核心地址空间。内核的代码和数据结构必须适合该空间,但内核地址空间的最大消耗者是物理内存的虚拟映射。因此,内核需要它自己的虚拟地址来存储它必须直接接触的任何内存。因此,内核可以处理的最大物理内存量是可以映射到虚拟地址空间的内核部分的量,减去内核代码使用的空间。