zone

Linux 支持多种体系结构,因此需要一种与体系结构无关的抽象来表示物理内存.本章描述了在运行系统中管理物理内存的结构.

内存管理中的第一个主要概念是非一致内存访问(NUMA).在多核和多插槽机器中,内存可以被安排成不同的银行,根据与处理器的"距离",访问这些银行的成本会有所不同.例如,每个CPU可能有一个分配的内存银行,或者有一个非常适合DMA(直接内存访问)的内存银行靠近外围设备.

每个内存银行称为一个节点,这一概念在Linux中通过结构体 pglist_data 来表示,即使在统一内存访问(UMA)体系结构中也是如此.这个结构体通常通过其类型定义 pg_data_t 引用.特定节点的 pg_data_t 结构可以通过 NODE_DATA(nid) 宏来引用,其中 nid 是该节点的ID.

对于NUMA架构,节点结构由特定架构代码在启动过程中早期分配.这些结构通常在它们代表的内存银行上本地分配.对于UMA架构,只有一个名为 contig_page_data 的静态 pg_data_t 结构被使用.节点将在"节点"部分进一步讨论.

整个物理地址空间被划分为一个或多个称为区域(zones)的块,表示内存中的范围.这些范围通常由访问物理内存的架构约束决定.节点内对应特定区域的内存范围由结构体 zone 描述,类型定义为 zone_t.每个区域都有以下描述的类型之一.

详细解释:Linux中的zone是什么

在Linux内存管理中,zone(区域)是物理内存管理的一个基本单位,用于表示内存中的特定范围.zone的概念使得内存管理能够更好地处理不同类型的内存需求和硬件限制.以下是对几种主要zone类型的详细解释:

  1. ZONE_DMAZONE_DMA32:
    • 这些区域专用于DMA操作,因为某些外围设备不能访问整个地址空间.
    • ZONE_DMA用于低于16MB的内存范围(主要是历史原因),而ZONE_DMA32用于低于4GB的内存范围.
  1. ZONE_NORMAL:
    • 这是内核正常操作中使用的主要内存区域.
    • 内核可以随时访问该区域内的所有内存,并且DMA操作可以在此区域内的页面上进行.
  1. ZONE_HIGHMEM:
    • 这个区域用于高于内核直接映射范围的物理内存(在32位体系结构中).
    • 内核需要通过临时映射来访问该区域的内存,因为这些内存不在内核页表的永久映射中.
  1. ZONE_MOVABLE:
    • 这个区域中的大部分内存内容是可移动的,允许内存内容在不同的物理页面之间移动.
    • 主要用于内存热插拔场景,以提高内存管理的灵活性.
  1. ZONE_DEVICE:
    • 用于设备内存,如非易失性内存(PMEM)和图形处理单元(GPU)内存.
    • 提供 struct page 和内存映射服务,支持设备驱动程序对特定物理地址范围的管理.

通过zone的划分,Linux能够更有效地管理不同类型和用途的内存,确保系统的稳定性和性能.

参考

zood