2025-12-16
[linux内存管理] 第033篇 深度解析 slab 内存池回收内存以及销毁全流程
copyright_author: bin的技术小屋 copyright_author_href:
2025-12-09
[linux内存管理] 第031篇 内核启动早期的slab分配器的自举
梳理Linux内核启动早期内存管理的四个阶段,文章深入分析了slab分配器自举的“鸡生蛋”难题:分配器本身依赖尚未初始化的自身结构体。详细解读slab分配器如何通过静态变量及多层自举逻辑,巧妙解决这一循环依赖困境,进而实现对象级缓存的高效分配与初始化,为内核后续稳定运行打下坚实基础。
2025-11-17
[linux内存管理] 第030篇 深入理解 slab cache 内存分配全链路实现
通过内核源码深入解析slab cache的内存分配机制,文章以task_struct为例详解fastpath和slowpath的分配流程,阐释了kmem_cache在多CPU和NUMA架构下的高效对象分配策略,以及如何通过本地CPU缓存、空闲对象链和慢速路径保证性能和并发安全。
2025-08-23
[linux内存管理] 第029篇 谁把folio的函数定义“藏”起来了?
这篇文章探讨了在阅读Linux内核代码时,如何解决一些函数定义难以找到的问题。作者遇到了folio_test_active()等函数无法找到定义的困惑,通过搜索发现这些函数是通过特殊的宏定义在page-flags.h文件中创建的。文章详细解释了PAGE_TYPE_OPS()和FOLIO_FLAG()宏的工作原理,以及如何通过这些宏定义函数。最终,作者成功理解了这些函数的定义方式,并总结说这种方法虽然特殊,但探索和理解的过程非常有意思。
2025-08-04
[linux内存管理] 第028篇 do_anonymous_page只处理私有映射吗?
文章摘要:本文探讨了Linux内核中do_anonymous_page()函数的作用,解释了它为什么只处理私有匿名映射。通过分析do_pte_missing()、vma_is_anonymous()、vma_set_anonymous()等函数,以及mmap_region()函数中的逻辑,文章得出结论:在mmap()流程中,只有私有匿名映射的vm_ops会被设置为NULL,从而被do_anonymous_page()处理。其他类型的映射,如共享匿名映射和文件映射,其vm_ops不为空,因此不会被该函数处理。
2025-06-18
[linux内存管理] 第027篇 Linux ARM64 虚拟地址布局
本文讨论了ARM64架构下Linux内核的虚拟地址布局。文章指出,尽管ARM64地址宽度为64位,但最大支持的物理地址为48位,即256T。虚拟地址宽度可以选择36位、39位、42位、47位、48位或52位,以39位为例,用户空间和内核空间大小均为512G。文章还详细介绍了内核虚拟地址空间分布,包括线性映射区域、模块区域、内核镜像区域、VMEMMAP区域、PCI I/O区域、固定映射区域等。最后,文章解释了线性空间下移的原因,并展示了虚拟地址空间总体分布图。
2025-06-18
[linux内存管理] 第026篇 从内核源码看 slab 内存池的创建初始化流程
本文详细介绍了Linux内核中slab内存池的创建过程,从源码层面解释了slab cache的架构设计和实现。文章首先介绍了slab cache的创建接口函数kmem_cache_create,并解释了其参数与slab cache结构体属性的对应关系。接着,文章深入分析了slab cache创建的详细流程,包括获取锁、参数校验、查找可复用的slab cache、计算slab对象的内存布局、初始化slab cache的重要属性、创建本地cpu缓存和NUMA节点缓存等步骤。此外,文章还介绍了slab allocator体系的初始化过程,解释了如何解决先有鸡还是先有蛋的问题,并详细说明了slab对象的内存布局和计算slab所需物理内存页个数的逻辑。最后,文章总结了slab cache的创建流程和架构,并展望了后续对slab内存池内存分配的深入探讨。
2025-06-17
[linux内存管理] 第025篇 细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现
本文介绍了 Linux 内核中的 slab 内存池,用于高效地分配和释放小内存块。作者首先回顾了 Linux 内存分配的宏观流程,然后引出 slab 内存池的产生背景和优势。slab 内存池将频繁使用的小内存块池化,避免了频繁的内存分配和释放带来的性能开销。文章详细介绍了 slab 对象池的内存布局,包括对齐、red zone、freepointer 和状态信息等。接着,文章分析了 slab 的总体架构设计,包括 kmem_cache、kmem_cache_cpu 和 kmem_cache_node 等数据结构。最后,文章详细介绍了 slab 内存分配和释放的原理,包括从本地 cpu 缓存、partial 列表、NUMA 节点缓存和伙伴系统中分配和释放内存的场景。
2025-06-17
[linux内存管理] 第024篇 slab内存分配器概述
Buddy系统以页为单位分配内存,导致浪费和效率低下。Solaris的Slab分配器通过对象类型专属仓库和缓存复用,极大提升命中率和访问速度。Linux随后演化出SLUB和SLOB,其中SLUB采用批量、无锁和本地CPU缓存等机制,大幅降低元数据开销与碎片化,优化了性能。