在 Linux 内核中,内存管理是系统稳定性和性能的核心支柱之一。本文将系统性回顾并总结今天学习的关键内容,涵盖从物理内存模型、页表机制、memblock 初始化、内存节点与管理区、页面管理结构等多个方面,帮助你从架构视角把握 Linux 内存管理的本质。最后也会附上常见的面试关键问题及其高质量解答。
一、内存体系结构:UMA 与 NUMA
1.1 UMA(Uniform Memory Access)
- 所有 CPU 核心访问物理内存的速度一致。
- 常见于单路 CPU 平台(如树莓派、嵌入式平台)。
- 简化了内存调度,但在多核场景下性能不理想。
1.2 NUMA(Non-Uniform Memory Access)
- 每个 CPU 拥有本地内存,访问远程内存存在延迟。
- 常用于服务器与多路 CPU 架构。
- 涉及调度器优化、页迁移等复杂策略。
面试问题:
- Q:NUMA 架构下,内核如何优化本地内存访问?
- A:通过页分配优先使用本地节点、自动页迁移机制、cpuset 等方式。
二、物理内存模型:FLATMEM、DISCONTIGMEM、SPARSEMEM
| 模型名称 | 宏定义 | 特点描述 | 典型平台 |
|---|---|---|---|
| Flat Memory Model | CONFIG_FLATMEM | 所有内存连续,mem_map[]为连续数组,访问简洁 | ARM嵌入式 |
| Discontiguous Memory | CONFIG_DISCONTIGMEM | 多个 bank,中间有洞,每个 Node 有独立 mem_map[],适合早期 NUMA | 早期 x86 NUMA |
| Sparse Memory Model | CONFIG_SPARSEMEM | 以 section 管理,支持大内存与热插拔,适配 VMEMMAP 优化 | 现代服务器 |
面试问题:
- Q:SPARSEMEM 与 FLATMEM 在内存管理策略上的最大区别是什么?
- A:FLATMEM 假设物理内存连续,SPARSEMEM 则允许以 section 为单位分段管理,节省空间。
三、memblock 概念与内存初始化
3.1 memblock 是什么?
- 用于管理系统早期内存分配(替代 bootmem)。
- 数据结构:memblock.memory 表示可用物理内存区域,memblock.reserved 表示已占用。
3.2 初始化路径
- 从设备树 memory 节点解析物理内存区间。
- setup_machine_fdt() 调用 early_init_dt_scan_nodes() 完成 memblock 的填充。
memory@40000000 {
device_type = "memory";
reg = <0x0 0x40000000 0 0x80000000>,
<0x0 0xc0000000 0 0x80000000>;
};
面试问题:
- Q:memblock 的生命周期是什么?什么时候会销毁?
- A:仅用于内核早期,paging_init 后释放掉临时页表和 memblock 本身。
四、页表机制与地址映射
4.1 多级页表结构(ARM64 为例)
- PGD → PUD → PMD → PTE → Page
- 每级页表负责不同范围虚拟地址空间的映射。
4.2 页表核心函数
create_mapping()__map_kernel()cpu_replace_ttbr1()用于替换 TTBR1 映射,启用最终页表。
面试问题:
- Q:页表在早期内核初始化中的构建依赖哪些结构?
- A:swapper_pg_dir、init_pg_dir,借助 fixmap 映射和 memblock 分配。
五、管理单元:pglist_data、zone、page
5.1 pglist_data(每个 Node 一份)
- 管理一个 NUMA 节点内的内存。
- 包含 zone[]、node_zones、bdata、nr_zones 等字段。
5.2 zone(每种类型的内存区域)
- DMA、DMA32、Normal、Movable 等类型。
- 管理水线、高低水位、free_area[] 等分配策略。

5.3 page(管理每一页内存)
- 每一页的抽象表示,结构体大小约 64 字节(依配置)。
- 包含 refcount、flags、mapping、private、lru 等。
struct page {
unsigned long flags;
struct address_space *mapping;
atomic_t _refcount;
...
};
面试问题:
- Q:如何根据物理地址得到 page 结构体?
- A:通过
virt_to_page()/pfn_to_page(),依赖 mem_map 基址。
六、总结
Linux 内存管理涉及从早期 memblock 初始化、页表映射、物理模型布局,到运行时的 zone 管理与页分配控制,构成了从引导到运行的完整体系。理解结构体之间的调用关系、层次映射机制和平台适配差异,是深入掌握内核内存管理的关键。
附录:今日高频核心面试问题汇总
| 问题 | 参考答案 |
|---|---|
| UMA 与 NUMA 有何差异? | UMA 访问内存延迟一致,NUMA 有本地/远程访问差异。 |
| memblock 主要作用? | 管理早期物理内存分配,供页表初始化与内核结构使用。 |
| 三种内存模型区别? | 是否支持不连续区域、是否节省 mem_map[] 空间等。 |
| 页表构建顺序? | PGD → PUD → PMD → PTE → Page。 |
| struct page 在系统中如何获取? | pfn_to_page / virt_to_page,依赖 mem_map。 |
| zone 有哪些类型? | DMA、DMA32、Normal、Movable,用于页分配控制。 |
视频教程请关注 B 站:“嵌入式 Jerry”
1204

被折叠的 条评论
为什么被折叠?



