[linux内存管理] 第011篇 内存模型之Sparse Memory Model 8月前查看 评论
[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 内存模型**。

[linux内存管理] 第004章 内存架构和内存模型 9月前查看 评论
[linux内存管理] 第004章 内存架构和内存模型

您好!根据您提供的文档内容,我为您总结出以下要点: **架构概述**: * 服务器架构主要分为三类:SMP、NUMA、MPP。 * 共享存储型多处理机有UMA和NUMA两种模型。 **基本概念**: * PFN:物理内存页帧编号,用于标识每个物理页。 * PF:线性地址被分成固定长度的页,例如4K。 * Page Frame:内存被分成固定长度的存储区域,包含一个页。 * UMA:所有CPU访问内存的时间相同,共享同一块物理内存。 * NUMA:CPU访问本地内存速度快于远端内存,有多个内存节点和CPU簇。 * COMA:NUMA的一种特例,只用高速缓存访问架构。 **内存架构总结**: | 概念 | 描述 | 特点 | |---|---|---| | SMP | 共享存储型多处理机 | 可伸缩性有限 | | UMA | 均匀存储器存取 | 所有处理器对所有存储字具有相同的存取时间 | | NUMA | 非均匀存储器存取 | 访问时间随存储字的位置不同而变化 | | COMA | 只用高速缓存的存储器结构 | 每个处理机结点上没有存储器层次结构 | **内存模型**: * FLATMEM:适用于具有连续或大部分连续物理内存的非NUMA系统,使用全局数组mem_map组织物理页。 * DISCONTIGMEM:适用于管理多块非连续的物理内存,通过node节点管理连续物理内存页,避免内存空洞造成的空间浪费。 * SPARSEMEM:适用于内存热拔插场景,使用section对粒度更小的连续内存块进行精细管理。 **内存模型转换逻辑**: * FLATMEM:基于mem_map数组进行偏移操作。 * DISCONTIGMEM:先定位page所在node,再通过node_mem_map定位PFN。 * SPARSEMEM:先定位page或PFN所在section,再通过section_mem_map定位page或PFN。 **总结**: 文档详细介绍了计算机系统中以内存为研究对象的两种架构:NUMA和UMA,以及对应的内存模型:FLATMEM、DISCONTIGMEM、SPARSEMEM。并对内存管理发展过程中,与UMA和NUMA对应的三种内存模型进行了简述。 希望以上总结对您有所帮助!如有任何疑问,请随时提出。