深入理解 Linux 内存管理:架构、机制与核心概念复盘

支持作者新书,点击京东购买《Yocto项目实战教程:高效定制嵌入式Linux系统》



在 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 ModelCONFIG_FLATMEM所有内存连续,mem_map[]为连续数组,访问简洁ARM嵌入式
Discontiguous MemoryCONFIG_DISCONTIGMEM多个 bank,中间有洞,每个 Node 有独立 mem_map[],适合早期 NUMA早期 x86 NUMA
Sparse Memory ModelCONFIG_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”

支持作者新书,点击京东购买《Yocto项目实战教程:高效定制嵌入式Linux系统》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值