2月前
[linux内存管理] 第000篇 Linux内存管理系列开篇
系列深入剖析Linux内存管理在ARM64架构下的原理与实现,覆盖物理内存初始化流程、核心分配器机制(如buddy、slab、vmalloc、CMA等)、缺页异常处理、页面回收、内存节点解析等关键环节,结合Kernel 5.15源码与丰富补充资料,帮助读者系统理解底层架构与内存管理优化要点
3日前
[linux内存管理] 第035篇 vmalloc详解
内核启动的内存初始化分为Fixmap、线性映射、Buddy分配器和Slab分配器四大阶段,逐步实现高效的物理与虚拟内存管理。vmalloc通过vmap机制,将非连续物理内存映射为连续虚拟地址,极大提升内存分配灵活性。文中详解vmalloc区域管理与关键数据结构,介绍空闲及已分配管理策略,并列举常用分配释放API,并解释代码流程
1月前
[linux内存管理] 第034篇 slab内存分配器之kmalloc全面详解
深入解析Linux内核中kmalloc的内存池体系,详解其在高效分配小至中等连续物理内存块中的核心作用。文章重点说明kmalloc通过预先创建多种尺寸的slab内存池,有效应对频繁的通用及专属内存分配需求,并结合源码分析创建流程、类型划分及对应场景,帮助开发者理解内核内存分配机制的高效性与灵活性。
1月前
[linux内存管理] 第033篇 深度解析 slab 内存池回收内存以及销毁全流程
copyright_author: bin的技术小屋 copyright_author_href:
1月前
[linux内存管理] 第031篇 内核启动早期的slab分配器的自举
梳理Linux内核启动早期内存管理的四个阶段,文章深入分析了slab分配器自举的“鸡生蛋”难题:分配器本身依赖尚未初始化的自身结构体。详细解读slab分配器如何通过静态变量及多层自举逻辑,巧妙解决这一循环依赖困境,进而实现对象级缓存的高效分配与初始化,为内核后续稳定运行打下坚实基础。
2月前
[linux内存管理] 第030篇 深入理解 slab cache 内存分配全链路实现
通过内核源码深入解析slab cache的内存分配机制,文章以task_struct为例详解fastpath和slowpath的分配流程,阐释了kmem_cache在多CPU和NUMA架构下的高效对象分配策略,以及如何通过本地CPU缓存、空闲对象链和慢速路径保证性能和并发安全。
5月前
[linux内存管理] 第029篇 谁把folio的函数定义“藏”起来了?
这篇文章探讨了在阅读Linux内核代码时,如何解决一些函数定义难以找到的问题。作者遇到了folio_test_active()等函数无法找到定义的困惑,通过搜索发现这些函数是通过特殊的宏定义在page-flags.h文件中创建的。文章详细解释了PAGE_TYPE_OPS()和FOLIO_FLAG()宏的工作原理,以及如何通过这些宏定义函数。最终,作者成功理解了这些函数的定义方式,并总结说这种方法虽然特殊,但探索和理解的过程非常有意思。
5月前
[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不为空,因此不会被该函数处理。
7月前
[linux内存管理] 第027篇 Linux ARM64 虚拟地址布局
本文讨论了ARM64架构下Linux内核的虚拟地址布局。文章指出,尽管ARM64地址宽度为64位,但最大支持的物理地址为48位,即256T。虚拟地址宽度可以选择36位、39位、42位、47位、48位或52位,以39位为例,用户空间和内核空间大小均为512G。文章还详细介绍了内核虚拟地址空间分布,包括线性映射区域、模块区域、内核镜像区域、VMEMMAP区域、PCI I/O区域、固定映射区域等。最后,文章解释了线性空间下移的原因,并展示了虚拟地址空间总体分布图。
7月前
[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内存池内存分配的深入探讨。