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
.每个区域都有以下描述的类型之一.
CONFIG_ZONE_DMA
和 CONFIG_ZONE_DMA32
配置选项禁用这些区域类型中的任一个或两个.一些64位平台可能需要这两个区域,因为它们支持具有不同DMA寻址限制的外围设备.CONFIG_HIGHMEM
启用.kernelcore
、movablecore
和 movable_node
内核命令行参数填充.有关更多详细信息,请参见页面迁移和内存热(卸)插拔.struct page
和内存映射服务.ZONE_DEVICE通过配置选项 CONFIG_ZONE_DEVICE
启用.在Linux内存管理中,zone(区域)是物理内存管理的一个基本单位,用于表示内存中的特定范围.zone的概念使得内存管理能够更好地处理不同类型的内存需求和硬件限制.以下是对几种主要zone类型的详细解释:
struct page
和内存映射服务,支持设备驱动程序对特定物理地址范围的管理.通过zone的划分,Linux能够更有效地管理不同类型和用途的内存,确保系统的稳定性和性能.