1月前
[linux内存管理] 第037篇 LRU链表详解
聚焦Linux内存管理的核心机制——内存回收,文章详细解析了内核如何通过LRU(最近最少使用)链表,实现对“冷”页面的精准识别和高效回收,保障系统在物理内存受限下的稳定运行。深入讲解了LRU链表的多层架构、页面在不同链表间的切换逻辑,并系统梳理了五类核心链表的数据结构,为理解和后续拓展如MGLRU机制奠定了扎实基础。
1月前
[linux内存管理] 第036篇 CMA内存分配器
面对硬件DMA需求和内存碎片化问题,CMA机制通过“保留但共享”的设计,动态预留物理连续内存并允许系统共享使用,按需自动迁移页面确保设备可获取大块连续空间。CMA通过struct cma等核心数据结构灵活配置,可支持多块物理区域,极大提升连续内存的分配效率。
1月前
[linux内存管理] 第035篇 vmalloc详解
内核启动的内存初始化分为Fixmap、线性映射、Buddy分配器和Slab分配器四大阶段,逐步实现高效的物理与虚拟内存管理。vmalloc通过vmap机制,将非连续物理内存映射为连续虚拟地址,极大提升内存分配灵活性。文中详解vmalloc区域管理与关键数据结构,介绍空闲及已分配管理策略,并列举常用分配释放API,并解释代码流程
2月前
[linux内存管理] 第034篇 slab内存分配器之kmalloc全面详解
深入解析Linux内核中kmalloc的内存池体系,详解其在高效分配小至中等连续物理内存块中的核心作用。文章重点说明kmalloc通过预先创建多种尺寸的slab内存池,有效应对频繁的通用及专属内存分配需求,并结合源码分析创建流程、类型划分及对应场景,帮助开发者理解内核内存分配机制的高效性与灵活性。
2月前
[linux内存管理] 第033篇 深度解析 slab 内存池回收内存以及销毁全流程
copyright_author: bin的技术小屋 copyright_author_href:
3月前
[linux内存管理] 第031篇 内核启动早期的slab分配器的自举
梳理Linux内核启动早期内存管理的四个阶段,文章深入分析了slab分配器自举的“鸡生蛋”难题:分配器本身依赖尚未初始化的自身结构体。详细解读slab分配器如何通过静态变量及多层自举逻辑,巧妙解决这一循环依赖困境,进而实现对象级缓存的高效分配与初始化,为内核后续稳定运行打下坚实基础。
3月前
[linux内存管理] 第030篇 深入理解 slab cache 内存分配全链路实现
通过内核源码深入解析slab cache的内存分配机制,文章以task_struct为例详解fastpath和slowpath的分配流程,阐释了kmem_cache在多CPU和NUMA架构下的高效对象分配策略,以及如何通过本地CPU缓存、空闲对象链和慢速路径保证性能和并发安全。
6月前
[linux内存管理] 第029篇 谁把folio的函数定义“藏”起来了?
这篇文章探讨了在阅读Linux内核代码时,如何解决一些函数定义难以找到的问题。作者遇到了folio_test_active()等函数无法找到定义的困惑,通过搜索发现这些函数是通过特殊的宏定义在page-flags.h文件中创建的。文章详细解释了PAGE_TYPE_OPS()和FOLIO_FLAG()宏的工作原理,以及如何通过这些宏定义函数。最终,作者成功理解了这些函数的定义方式,并总结说这种方法虽然特殊,但探索和理解的过程非常有意思。
7月前
[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不为空,因此不会被该函数处理。