![[linux内存管理] 第020篇 Linux内核slab内存的越界检查SLUB_DEBUG的原理剖析](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/25/2/cover_linux_memory_management_020.png)
[linux内存管理] 第020篇 Linux内核slab内存的越界检查SLUB_DEBUG的原理剖析
copyright_author: 蜗窝科技 copyright_author_href: http://www.wowotech.net copyright_url: http://www.wowotech.net/memory_management/427.html copyright_info
![[linux内存管理] 第019篇 buddy分配器基础知识以及分配器api接口](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/25/1/cover_linux_memory_management_019.png)
[linux内存管理] 第019篇 buddy分配器基础知识以及分配器api接口
本文主要介绍了Linux内存管理中的伙伴系统,它是Linux内核中基本的内存分配系统,涉及页面分配、页面回收、页面规整等机制。文章详细剖析了快速分配之前的一些基础知识,包括分配掩码、分配标志、分配的API接口以及Linux对于伙伴系统的设计思路。伙伴系统将空闲页面分成11个块链表,每个块链表管理着2的幂次方个连续页面,内存管理框图展示了其组织结构。同时,文章还解释了内存块是如何连接的,以及伙伴系统的合并机制。
![[linux内存管理] 第018篇 buddy系统的简介以及初始化](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/25/1/cover_linux_memory_management_018.png)
[linux内存管理] 第018篇 buddy系统的简介以及初始化
本文深入剖析了Linux内存管理中伙伴系统的初始化流程。伙伴系统是Linux内核用于管理和分配物理内存页面的核心算法,它将内存分成大小为2的幂次方的内存块,并通过“伙伴”机制进行分配和回收。文章详细介绍了伙伴系统的数据结构,包括`struct free_area`和`struct zone`,以及迁移类型`migratetype`和区域请求标志`__GFP区域请求标志`。此外,文章还分析了fallbacks机制和`pageblock_order`的定义。最后,文章通过分析`mm_init`函数和`memblock_free_all`函数,揭示了伙伴系统初始化的详细过程,包括释放未使用的内存、重置zone的`managed_pages`、将内存块添加到伙伴系统等操作。通过本文的解析,读者可以更好地理解Linux内存管理中伙伴系统的工作原理和初始化过程。
![[linux内存管理] 第017篇 zonelist的初始化](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/25/1/cover_linux_memory_management_017.png)
[linux内存管理] 第017篇 zonelist的初始化
本文主要分析了Linux内核中zonelist的初始化过程。首先介绍了两个关键数据结构:`pglist_data`和`zonelist`,其中`pglist_data`包含了一个`node_zonelists`数组,用于管理内存节点的zone信息;`zonelist`结构体则包含了一个`zoneref`数组,用于描述一个node的各个zone的信息。接着详细阐述了zonelist的初始化过程,包括`build_all_zonelists`、`build_zonelists`和`build_zonerefs_node`三个关键函数。最后,总结了zonelist的初始化过程,并附上了初始化过程的示意图。
![[linux内存管理] 第016篇 /proc/iomem的详细解析](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/25/1/cover_linux_memory_management_016.png)
[linux内存管理] 第016篇 /proc/iomem的详细解析
本文详细介绍了Linux内核中`/proc/iomem`节点的构建与显示过程。文章首先指出`/proc/iomem`展示的是物理内存的使用情况,并通过`request_standard_resources`函数将内存区域挂载到资源树。文章进一步解析了`/proc/iomem`的注册过程,包括`ioresources_init`函数和`iomem_resource`资源树,以及数据来源和显示逻辑。最后总结,`/proc/iomem`通过遍历资源树和格式化输出,提供了系统物理内存布局的详细视图,对资源管理和调试具有重要作用。
![[linux内存管理] 第015篇 理解Linux内核中的memblock和ioremap机制](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/25/1/cover_linux_memory_management_015.png)
[linux内存管理] 第015篇 理解Linux内核中的memblock和ioremap机制
Linux内核中,设备寄存器的物理地址管理涉及`memblock`和`ioremap`两个关键机制。`memblock`在内核启动阶段负责物理内存的分布记录和地址保留,确保设备寄存器不被误用。`ioremap`则将物理地址映射到内核虚拟地址空间,便于驱动程序访问寄存器。设备寄存器映射流程包括设备描述、物理地址保留、驱动加载和地址映射,最终驱动通过虚拟地址访问寄存器。这两者共同确保了设备寄存器的正确管理和高效访问。
![[linux内存管理] 第014篇 /proc/zoneinfo的详细解析](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/12/cover_linux_memory_management_014.png)
[linux内存管理] 第014篇 /proc/zoneinfo的详细解析
你好,根据您提供的文档内容,我总结如下: 内存管理是Linux内核中一个复杂的模块,涉及多种数据结构和逻辑。为了帮助开发者了解内存使用情况,内核在核心数据结构中提供了计数统计。初始化时,会进行一系列操作,包括设置架构、构建zonelist、初始化页分配器和内存管理模块等。 `/proc/zoneinfo` 是一个虚拟文件节点,用于展示内存管理区的详细统计信息。通过 `zoneinfo_show` 函数,可以遍历每个内存管理区,并打印相关信息。 `zoneinfo_show_print` 函数负责打印每个内存管理区的详细信息,包括: 1. 当前节点的内存统计信息,例如匿名页面、文件页面、脏页面、写回页面等数量。 2. 当前内存管理区的总信息,例如空闲页面数、最低/高/高水位线、覆盖的页面数、实际存在的页面数、受内核管理的页面数、CMA预留页面数等。 3. 当前内存管理区的详细页面信息,例如空闲页面数、非活跃/活跃的匿名/文件页面数、无法回收的页面数、待写回的页面数、mlock锁定的页面数、页表页面数、中转页面数、压缩页数、CMA空闲页面数等。 4. 当前内存管理区的pageset信息,即每个CPU内存分配器信息,包括可用的页面数、高水位线、批量分配大小等。 5. 其他信息,例如节点是否不可回收、节点的起始页帧号等。 这些信息可以帮助开发者了解内存使用情况,并进行相应的优化和调整。
![[linux内存管理] 第013篇 zone的初始化](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/12/cover_linux_memory_management_013.png)
[linux内存管理] 第013篇 zone的初始化
**摘要**: 本文深入剖析了 Linux 内核中物理内存管理的关键函数 `zone_sizes_init` 和 `free_area_init`,揭示了内存区域(zone)初始化的详细过程。 **主要内容**: 1. **zone_sizes_init** 函数: * 计算每种类型 zone 的最大页帧号(PFN)。 * 调用 `free_area_init` 函数进行后续初始化。 2. **free_area_init** 函数: * 记录区域边界并计算起始 PFN。 * 遍历所有区域,设置边界并初始化 `zone` 结构。 * 计算 `ZONE_MOVABLE` 的边界。 * 打印区域信息。 * 初始化每个 NUMA 节点,包括分配 `mem_map` 空间和设置伙伴系统数据结构。 * 初始化 `struct page` 结构。 3. **free_area_init_node** 函数: * 获取节点信息并计算页帧范围。 * 设置节点 ID、起始 PFN 和节点状态。 * 计算节点的总页数和可用页数。 * 分配 `mem_map` 空间。 * 初始化节点的核心管理结构,包括 `zone` 的范围和伙伴系统数据结构。 4. **zone_init_internals** 函数: * 设置 `zone` 的 `managed_pages` 和 `name`。 * 初始化 `zone` 的锁和 PGP 数据结构。 5. **init_currently_empty_zone** 函数: * 初始化 `zone` 的 `free_area` 数据结构,包括空闲列表和空闲页数。 **关键点**: * `zone_sizes_init` 函数计算区域边界,为后续初始化做准备。 * `free_area_init` 函数是内存区域初始化的核心,负责划分区域、初始化节点和设置伙伴系统。 * `free_area_init_node` 函数负责初始化每个 NUMA 节点的内存管理结构。 * `zone_init_internals` 函数初始化 `zone` 的核心管理结构。 * `init_currently_empty_zone` 函数初始化 `zone` 的 `free_area` 数据结构。 **总结**: Linux 内核通过 `zone_sizes_init` 和 `free_area_init` 等函数,实现了对物理内存的精细化管理,确保了内存分配的高效性和安全性。
![[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 内存模型**。
![[linux内存管理] 第012章 物理内存管理三大结构体之zone](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/12/image_01a394592c615a3e79014ebf60d0709c.png)
[linux内存管理] 第012章 物理内存管理三大结构体之zone
本文探讨了Linux内存管理中的内存域(Zone)概念。内存域是内核内存管理机制的重要组成部分,它根据内存区域的特点对物理内存进行划分,以满足不同类型的内存分配需求。本文详细介绍了Zone的类型、数据结构以及其在内存管理中的作用,并解释了Zone的统计信息、冷热页与Per-CPU上的页面高速缓存等相关概念。最后,通过关系结构图和架构层次图,直观展示了Zone与其他内存管理结构之间的关系。