前言
为了支持 NUMA 模型,也即 CPU 对不同内存单元的访问时间可能不同,此时系统的物理内存被划分为几个节点,一个节点对应一个内存簇 bank,即每个内存簇被认为是一个节点。接着各个节点又被划分为内存管理区域,接下来将对内存管理区域进行讨论。
非一致内存访问(Non-Uniform MemoryAccess,NUMA)模型,是一种内存架构模型,用于多处理器系统中的内存访问。在 NUMA 系统中,每个处理器或处理器组件(如核心)都有自己的本地内存,并且可以访问其他处理器的远程内存。
一、x86 上的内存区域划分
在一个理想的计算机体系结构中,一个页框就是一个内存存储单元,可用于任何事情:存放内核数据和用户数据、缓冲磁盘数据等等。任何种类的数据页都可以存放在任何页框中,没有什么限制。
但是,实际的计算机体系结构有硬件的制约,这限制了页框可以使用的方式。尤其是 Linux 内核必须处理 80x86 体系结构的两种硬件约束:
- ISA 总线的直接内存存取(DMA)处理器有一个严格的限制:它们只能对 RAM 的前 16MB 寻址。
- 在具有大容量 RAM 的现代 32 位计算机中,CPU 不能直接访问所有的物理内存,因为线性地址空间太小。
为了应对这两种限制,Linux 2.6 把每个内存节点的物理内在划分为 3 个管理区(zone)在 80x86 UMA 体系结构中的管理区为:
- ZONE DMA:包含低于 16 MB 的内存页框。
- ZONE NORMAL:包含高于 16MB 且低于 896MB 的内存页框。
- ZONE HIGHMEM:包含从 896MB 开始高于 896MB 的内存页框。
内存区域类型结构定义在 include/linux/mmzone.h,其基本信息如下所示: - #define ZONE_DMA 0
- #define ZONE_NORMAL 1
- #define ZONE_HIGHMEM 2
复制代码
不同的管理区的用途是不一样的,ZONE_DMA 类型的内存区域在物理内存的低端,主要是 ISA 设备只能用低端的地址做 DMA 操作。ZONE_NORMAL 类型的内存区域直接被内核映射到线性地址空间上面的区域,ZONE_HIGHMEM 将保留给系统使用,是系统中预留的可用内存空间,不能被内核直接映射。
二、管理区结构
1、struct zone
一个管理区(zone)由 struct zone 结构体来描述,zone 对象用于跟踪诸如页面使用情况的统计数、空闲区域信息和锁信息。里面保存着内存使用状态信息,如 page 使用统计,未使用的内存区域,互斥访问的锁等。
该结构体定义在 include/linux/mmzone.h 中,而其中各个字段的含义如下:
- free pages:管理区中空闲页的数目。
- pages_min:管理区中保留页的数目。
- pages_low:回收页框使用的下界,同时也被管理区分配器作为阈值使用。
- pages_high:回收页框使用的上界,同时也被管理区分配器作为阈值使用。
- lowmem_res
|