少于 1 分钟阅读 次阅读

理解 Linux 内核如何管理物理内存是深入系统编程和性能调优的重要基础。其核心思想是将物理内存划分为更小的逻辑单元,并通过层次化的管理机制应对硬件和使用的多样性。

一、物理内存管理的基本单位:页

页是物理内存管理和虚拟地址转换的基本单元,由内存管理单元(MMU)处理,并用一个称为 struct page 的结构体来描述。

  1. 为什么是基本单元? 尽管 CPU 可以寻址到字节,但管理数 GB 乃至数 TB 的物理内存,如果以字节为单位,其元数据开销将是天文数字。因此,内核以“页”这个更大的块(通常为 4KB 或 8KB)为最小单位来管理物理内存。这极大地简化了管理结构和提升了效率。

  2. struct page 结构体 系统中的每一个物理页,都对应一个 struct page 结构体。你可以把它想象为物理页的“身份证”或“管理档案”。这个结构体并不包含页内的数据本身,而是记录了关于这个页的管理信息,例如:

    • flags: 用一个个二进制位记录页的状态(是否被占用、是否为脏页、是否可交换等)。
    • _count: 引用计数,表示有多少使用者正在使用这个页。当计数为 0 时,表示该页空闲可用。
    • virtual: 该物理页在内核虚拟地址空间中的地址(如果不是永久映射,则为 NULL)。
  3. 一个关键洞察 struct page 描述的是物理页本身,而不是其中的数据。数据可能因页面交换(Swap)而暂时离开物理内存,但物理页和它的 struct page 结构是稳定存在的,用于追踪“此刻谁在使用这个物理页框”。

开销大吗? 假设一个 struct page 占用 40 字节,对于一个拥有 4GB 物理内存、页大小为 8KB 的系统,总共需要大约 20MB 的内存来管理所有页。相对于 4GB 的总内存,这个管理开销(约 0.5%)是完全可以接受的,是“用空间换时间和管理便利”的典型设计。

二、应对硬件限制的逻辑分组:区

区是基于硬件寻址限制而对物理页进行的逻辑分组,目的是将具有相似特性的页(如能否用于直接内存访问 DMA)集中管理,形成不同的“内存池”。

  1. 为什么需要“区”? 硬件并非完美。内核无法对所有物理内存一视同仁,主要因为两个限制:

    • DMA 限制:一些老式硬件设备(如 ISA 设备)进行 DMA 操作时,只能访问物理内存最低的 16MB 地址空间。
    • 地址空间限制:在 32 位体系结构中,内核虚拟地址空间(通常为 1GB 或更低)可能小于物理内存总量,导致一部分物理内存无法被永久、直接地映射到内核地址空间。
  2. 主要的区及其作用 为了应对以上限制,Linux 内核定义了主要的三种区:

    • ZONE_DMA:包含可用于 DMA 操作的页。在 x86-32 上,这是物理地址低于 16MB 的内存。
    • ZONE_NORMAL:包含能被内核“正常”且永久映射到虚拟地址空间的页。在 x86-32 上,通常指 16MB 到 896MB 之间的内存,这部分内存内核可以随时、直接访问。
    • ZONE_HIGHMEM:包含“高端内存”,即那些无法被永久映射到内核有限地址空间的页。在 x86-32 上,指高于 896MB 的物理内存。当内核需要访问这些页时,必须临时建立映射,用完后解除。在 64 位系统上,由于虚拟地址空间极其巨大,通常不存在此区。
  3. 区的逻辑性与灵活性 区的划分是逻辑上的,目的是为了创建不同的内存“资源池”,以满足不同类型的分配请求。例如,当为 DMA 设备分配缓冲区时,内核会从 ZONE_DMA 池中取用;而一般的内核数据结构则优先从 ZONE_NORMAL 中分配。 每个区由一个 struct zone 结构体管理,其中包含了该区的空闲页列表、水位标记(用于触发内存回收)、自旋锁等管理信息。整个系统通常只有 2-3 个这样的区结构实例。

总结:

  1. 物理内存 被硬件和内核划分为固定大小的
  2. 每个物理页都由一个轻量级的 struct page 结构体跟踪其状态和归属。
  3. 由于硬件存在 DMA 和地址映射的局限,内核将所有页按特性归入不同的逻辑集合,即 (如 DMA, NORMAL, HIGHMEM)。
  4. 每个区由一个 struct zone 结构体管理,维护着该区内存池的分配状态和水位。
  5. 当内核或驱动需要分配内存时,它会根据用途(如“用于 DMA”、“用于普通内核对象”)向特定的区申请,该区的分配器从对应的空闲页列表中找出可用的 ,并更新其对应的 struct page 信息。

留下评论