一文搞明白Linux内核《物理内存模型》,(成为大牛要收藏)
一、体系结构与内存模型
1、体系结构
目前多处理器系统当中,有两种体系结构:
非一致内存访问(NUMA),指内存划分成多个内存节点的多处理器系统,访问一个内存节点花费的时候取决于处理和内存节点的距离。NUMA是中高端服务器的主流体系结构。
对称多处理器(SMP),即一致内存访问(UMA),所有处理器访问内存花费的时间是相同。每个处理器的地位是平等的,仅在内核初始化的时候不平等:“0号处理器作为引导处理器负责初始化内核,其他处理器等待内核初始化完成。”
在实际应用中可以采用混合体系结构,在NUMA节点内部使用SMP体系结构。
2、内存模型
从处理器角度看到的物理内存分布,内核管理不同内存模型的方式存在差异。内存管理子系统当中有3种内存模型:
平坦内存(Flat Memory):内存的物理地址空间是连续的,没有空洞。
不连续内存(Discontiguous Memory):内存的物理地址空间存在空洞,这种模型可以高效地处理空洞。
稀疏内存(Sparse Memory):内存的物理地址空间存在空洞,如果需要支持内存热插拔,只能选择稀疏内存模型。
二、三级结构(Node/Zone/Page)
从内存管理子系统使用节点(node)、区域(zone)和页(page)三级结构描述物理内存。
1、内存节点
NUMA系统的内存节点,根据处理器和内存的距离划分; 在具有不连续内存的UMA系统中,表示比区域的级别理高的内存区域,根据物理地址是否连续划分,每块物理地址连续的内存是一个内存节点。内存节点使用一个pglist_data结构体数据类型描述内存布局。

成员node_mem_map指向页描述符数组,每个物理页对应一个页描述符。node_mem_map可能不是指向数组的第一个元素,因为页描述符数组的大小必须对齐到2的(MAX_ORDER-1)次方。(MAX_ORDER-1)是页分配器可分配的最大阶数。具体pglist_ddata对应内核源码分析如下:
三、Bootmem/Memblock分配器
在Linux内核初始化的时候需要分配内存,内核提供临时的引导内存分配器,在页分配器和块分配器初始化完成之后,把空闲的物理页交给页分配器管理,丢弃引导内存分配器。
1、bootmem分配器应用的数据结构源码如下:
在老版本里面有bootmem_data此结构体。新版本只有memblock结构体。
2、memblock分配器应用的数据结构如下:
