一个新手问题。我正在做一些内核研究并且对
ZONE_NORMAL 的大小限制为 896MB。我不明白为什么内核不能
将4G物理内存直接映射到内核空间。一些文件
提到了它的页面映射的大小限制。但考虑到4G内存
有 2^20 个页面,每个“结构页面”是 4 个字节,mem_map 会
只有 4MB。这应该不是问题。希望你能给我一些
光。

谢谢

最佳答案

当然,内核可以映射所有可用内存。

在 Linux 中,所有 bank 可用的内存被分类为“节点”。这些节点用于指示每个 bank 有多少内存。每个节点中的内存被划分为“区域”。当前定义的区域是 ZONE_DMAZONE_NORMALZONE_HIGHMEM
ZONE_DMA 被某些设备用于数据传输,并映射到较低的物理内存范围(最多 16 MB)。
ZONE_NORMAL 区域中的内存被内核映射到线性地址空间的上层区域。大多数操作只能在 ZONE_NORMAL 中进行;所以这是性能最关键的区域。 ZONE_NORMAL 从 16 MB 到 896 MB。

为什么?

部分内存是为内核数据结构保留的,这些数据结构存储有关内存映射和页表的信息。这在 x86 上是 128 MB。因此,在内核可以访问的 1 GB 物理内存中(在典型配置中,1GB 是为内核保留的),128MB 是保留的。因此,这 128 MB 中的内核虚拟地址不会直接映射到物理内存。这为 ZONE_NORMAL 留下了最多 896 MB 的空间。因此,即使有 1 GB 的物理 RAM,实际上也只有 896 MB 可供用户空间使用。

为了更好地理解这个主题,我建议你看看 Linux Device Drivers (pdf) 的第 15 章。

关于linux - 为什么 Linux 内核 ZONE_NORMAL 限制为 896 MB?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8252785/

10-16 11:22