11

在理解 highmem 需要处理超过 1GB 的 RAM 时,我遗漏了一些东西。有人可以指出我哪里出错了吗?谢谢!

我知道的:

  • 为内核操作保留 1 GB 的进程虚拟内存(高内存区域)。用户空间可以使用剩余的 3 GB。这是 3/1 拆分。

  • VM 的虚拟内存特性将(连续的)虚拟内存页面映射到物理页面 (RAM)。

我不知道的是:

  • 哪些操作使用内核虚拟内存?我想内核空间中的 kmalloc(...) 之类的东西会使用内核虚拟内存。

  • 我认为在这个方案下可以使用 4GB 的 RAM。我不明白为什么内核 1 GB 虚拟空间是寻址物理空间时的限制因素。这就是我的理解崩溃的地方。请指教。

我一直在阅读这篇文章(http://kerneltrap.org/node/2450),这很棒。但这并没有完全按照我的喜好解决我的问题。

4

3 回答 3

12

内核虚拟空间是可用物理内存的限制因素的原因是因为内核需要访问所有物理内存,并且它访问物理内存的方式是通过内核虚拟地址。内核不使用允许直接访问物理内存位置的特殊指令——它必须为它想要与之通信的任何物理范围设置页表条目。

在“旧式”方案中,内核进行了设置,以便每个进程的页表将虚拟地址从0xC0000000to0xFFFFFFFF直接映射到从 to 的物理地址0x000000000x3FFFFFFF这些页面被标记,以便它们只能在 ring 0 - 内核模式下访问)。这些是“内核虚拟地址”。在这种方案下,内核可以直接读取和写入任何物理内存位置,而无需摆弄 MMU 来更改映射。

在 HIGHMEM 方案下,从内核虚拟地址到物理地址的映射不是固定的——当内核需要访问该内存时,部分物理内存被映射进出内核虚拟地址空间。这允许使用更多的物理内存,但代价是必须不断更改虚拟到物理的映射,这是一项相当昂贵的操作。

于 2009-11-02T06:16:13.027 回答
6

在每个进程中将 1 GB 映射到内核允许进程切换到内核模式,而无需执行上下文切换。然后可以在调用进程的地址空间中适当地处理对系统调用(例如 和其他)的响应read()mmap()

如果每个进程都没有为内核保留空间,在执行用户空间代码之间切换到“内核模式”会更加昂贵,并且无法通过硬件 MMU(内存管理单元)使用虚拟地址映射进行系统调用被服务。

运行具有超过 1GB 物理内存的 32 位内核的系统能够分配物理内存位置ZONE_HIGHMEM(大约高于 1GB 标记),这可能需要内核跳过某些操作与它们交互。PAE(物理地址扩展)的添加通过允许高达 64GB 的物理内存扩展了这个问题,降低了 1GB 物理地址内存中的内存与ZONE_HIGHMEM.

于 2009-11-01T23:38:33.377 回答
-2
  1. 例如,系统调用使用内核空间。
  2. 您可以拥有 64GB 的物理内存,但在 32 位平台上,由于 32 位虚拟寻址,处理器只能访问 4GB。实际上,您可以拥有 1GB 的 RAM 和 3GB 的交换空间,而虚拟寻址会让您看起来像拥有 4GB。在 64 位平台上,虚拟寻址实际上是无限的。
于 2009-11-01T23:28:06.610 回答