Linux内核 内存管理(2)物理内存初始化
一. 内存节点(Node)、内存区域(Zone)
1.每个 内存节点(Node) 对应一组 本地物理内存,与特定 CPU 核心组关联(如 ARM big.LITTLE 架构中的大小核分组)。本例子是单节点系统
2.每个 内存节点(Node) 进一步划分为多个 内存区域(Zone),用于区分内存的 物理属性 或 用途
DMA | 用于支持 DMA 设备(如 USB、网卡)的内存区域,通常位于物理内存低地址(≤16MB)。 | 手机 SoC 中,摄像头、基带等外设通过 DMA 访问此区域内存。 |
DMA32 | 支持 32 位地址空间的 DMA 设备(寻址范围 ≤4GB),ARM 32 位系统常用。 | 传统 ARMv7 架构设备(如早期树莓派)使用此区域。 |
Normal | 普通内存区域,用于内核和用户空间常规分配(如堆、栈),无特殊硬件限制。 | ARM64 位系统(如 AArch64)的主流内存区域。 |
Movable | 可移动内存区域 | 用于避免碎片化 |
二. 页(Page)
- 定义:操作系统将物理内存划分为固定大小的块,称为 页(Page),是内存分配和回收的最小单位。
- ARM 中的页大小:常规页大小为 4KB(由 MMU 配置决定),但支持 大页(Large Page,如 16KB、64KB) 以减少页表条目,提升地址转换效率。大页常用于虚拟机、图形渲染等需要大块连续内存的场景(如 ARM Mali GPU 的显存管理)。
页面管理的维度
(1)页的类型
从cat /proc/pagetypeinfo观察
Unmovable | 69 | 29 | 33 | 6 | 4 | 1 | 1 | 1 | 0 | 0 | 0 |
Movable | 64 | 7 | 1 | 1 | 1 | 17 | 30 | 23 | 6 | 1 | 135 |
Reclaimable | 1 | 5 | 11 | 6 | 3 | 4 | 1 | 1 | 0 | 1 | 0 |
HighAtomic | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Isolate | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1.纵向来看:按阶数统计的空闲页数量
- Page Block Order:内存块的阶数(order=9),表示每个块由 29=512 个页组成。若页大小为 4KB,则每个块大小为 512×4KB=2MB。
2.横向来看:按迁移类型统计的内存块数量
- 迁移类型(Migration Type):
- Unmovable:不可移动的页(如内核代码、数据结构)。
- Movable:可移动的页(如用户空间进程的内存)。
- Reclaimable:可回收的页(如文件系统缓存)。
3.总体来看
- 横向看迁移类型:
- Movable 在高阶数(如 order=10)有 135 个页块,说明系统保留了大量连续大页用于可移动分配(如用户进程)。
- Unmovable 在低阶数(如 order=0~2)较多,符合内核小内存分配的特点。
- 纵向看阶数:
- 低阶数(0~3) 页块多表示系统擅长分配小内存(如栈、堆)。
- 高阶数(≥5) 页块多表示系统有连续大内存可用(如 DMA 设备、大文件映射)。
4.关键指标
高阶数(order≥5)页块 | 各迁移类型均有分布 | 某类型高阶数为 0 → 大内存分配失败 |
Movable 块占比 | 越高越好(通常 > 80%) | 过低 → 内存碎片化风险 |
Unmovable 块占比 | 越低越好(通常 < 10%) | 过高 → 内核占用过多连续内存 |
Reclaimable 块数量 | 适中(根据缓存需求调整) | 过高 → 可能导致内存回收频繁 |
(2)页帧号(Page Frame Number, PFN)
- 物理页的唯一标识,用于映射虚拟地址与物理地址(如通过页表实现 VA → PA 转换)。
- 在 ARM 的 MMU 架构(如 TTBR0/TTBR1 寄存器)中,PFN 是页表项的核心字段。
三者关系
物理内存整体 ├─ 内存节点(Node 0) ── 对应一组 CPU 可直接访问的物理内存(如 NUMA 节点 0 的本地内存) │ ├─ Zone(DMA) ── 低端物理内存,用于 DMA 设备,地址范围 0 ~ 1GB │ │ ├─ Page(4KB) ── 具体物理页,如空闲页、可移动页、不可移动页等 │ │ └─ Page(4KB) ── ... │ ├─ Zone(Normal) ── 常规物理内存(若存在,地址范围 1GB ~ 更高) │ │ └─ Page(4KB) ── ... │ └─ Zone(Movable) ── 可移动页的集合,属于 Normal 或独立 Zone └─ 内存节点(Node 1) ── 另一组 CPU 可访问的物理内存(如 NUMA 节点 1 的本地内存) └─ Zone(DMA) ── ...
三.mem_map / pageblock
管理粒度 | 单个物理页(4KB) | 连续页块(如 4MB) |
核心作用 | 记录页状态,支持页级分配与回收 | 支持大页分配、内存规整,管理连续页块 |
数据结构 |
数组 | 基于
的逻辑分组(无独立结构体) |
关联方式 | 每个页块由连续的
组成 | 通过 PFN 计算页块起始位置,依赖页状态 |