![[linux内存管理] 第011篇 内存模型之Sparse Memory Model](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/12/cover_linux_memory_management_011.png)
[linux内存管理] 第011篇 内存模型之Sparse Memory Model
**本文对 Linux 内核中 SPARSEMEM 内存模型的初始化过程进行了深入剖析**。 **1. `bootmem_init()` 函数** * 调用 `memblocks_present()` 对 `SPARSEMEM` 模型的关键变量 `mem_section` 进行内存分配和初始化。 * 调用 `sparse_init()` 进一步对 `SPARSEMEM` 进行初始化,包括对其管理的每个 `page` 进行映射。 * 调用 `zone_sizes_init()` 初始化 `zone` 数据结构。 * 调用 `memblock_dump_all()` 在 `memblock_debug` 使能的情况下,`dump` 当前 `memblock` 分布。 **2. `memblocks_present()` 函数** * 遍历 `memblock.memory` 中所有的内存块,获取起始地址、结束地址和节点编号。 * 对每个内存块,调用 `memory_present()` 函数进行初始化。 **3. `memory_present()` 函数** * 创建 `mem_section` 结构体,并标记为 `present` 状态。 * 将内存块划分成多个 `section`,每个 `section` 对应一个 `mem_section` 结构体。 * 为每个 `section` 分配 `struct page` 描述符数组。 **4. `sparse_init()` 函数** * 调用 `memblocks_present()` 初始化 `mem_section` 结构体。 * 遍历所有存在的 `mem_section`,并调用 `sparse_init_nid()` 函数进行初始化。 **5. `sparse_init_nid()` 函数** * 为每个节点分配 `mem_section_usage` 结构体,用于存储每个 `section` 的使用情况。 * 为每个 `section` 分配 `struct page` 描述符数组。 * 初始化 `mem_section` 结构体,并设置其 `section_mem_map` 和 `mem_map` 成员变量。 **总结** 通过以上分析,我们可以看到 SPARSEMEM 内存模型的初始化过程相对复杂,涉及到多个数据结构和函数。但是,只要我们理解了其核心思想,就能够更好地理解 Linux 内核的内存管理机制。 **此外,本文还简要介绍了 SPARSEMEM 模型中的一些关键数据结构,例如 `struct mem_section` 和 `struct page`,以及它们之间的关系**。 **希望本文能够帮助您更好地理解 Linux 内核中的 SPARSEMEM 内存模型**。