三 页的alloc与free、Buddy算法以及CMA

整体目录

一 linux虚拟内存、MMU、分页的基本原理
二 OOM打分因子、oom_adj以及oom_score
三 页的alloc与free、Buddy算法以及CMA
四 page_fault、内存IO交互、VSS、LRU
五 DMA及Cache一致性

=================================================================================

页的alloc与free

转载自深入浅出内存管理–alloc_pages与free_page分析(框图)
alloc_pages用于连续物理内存的分配,它的实现如下图所示
在这里插入图片描述
从这个流程图来分析,函数是一步一步调用到buffered_rmqueue的,alloc_pages是页分配器的对外接口,系统中很多模块和驱动可以直接调用它申请到内存,而buffered_rmqueue是底层伙伴系统算法的实现。它的流程图如下所示:
在这里插入图片描述
这里框图介绍了buffered_rmqueue的实现,从它的命名可以看出,它是带有buffer功能的,为什么要这么操作呢,我们知道伙伴系统这一套算法是有一定复杂度的,如果每次申请都要执行算法扫描一下系统中的内存,那么将会比较耗时,所以加上per cpu高速缓存,当我们申请单个page时,优先从缓存中获取,这样就提升了效率,同时作为per cpu的缓冲,也将提升CPU效率,因为不用频繁进行cache的切换,提升cache命中的概率。
free page是释放page的接口,它的实现如下图:
在这里插入图片描述
释放过程是申请的逆过程,当释放单个page时,优先释放给per cpu高速缓冲区管理,如果高速缓存内的内存大小超出一个设定值,那么高速缓存也会释放一部分给到伙伴系统,而伙伴系统通过循环执行__free_one_page来释放内存到对应的空闲free_area。

=============================================================

Buddy算法

在这里插入图片描述
在这里插入图片描述
buddy算法的具体内容可以查看Linux内存管理—buddy算法

=============================================================

连续内存分配器(CMA)

CMA,Contiguous Memory Allocator,是内存管理子系统中的一个模块,负责物理地址连续的内存分配。一般系统会在启动过程中,从整个memory中配置一段连续内存用于CMA,然后内核其他的模块可以通过CMA的接口API进行连续内存的分配。CMA的核心并不是设计精巧的算法来管理地址连续的内存块,实际上它的底层还是依赖内核伙伴系统这样的内存管理机制,或者说CMA是处于需要连续内存块的其他内核模块(例如DMA mapping framework)和内存管理模块之间的一个中间层模块,主要功能包括:
1、解析DTS或者命令行中的参数,确定CMA内存的区域,这样的区域我们定义为CMA area。
2、提供cma_alloc和cma_release两个接口函数用于分配和释放CMA pages
3、记录和跟踪CMA area中各个pages的状态
4、调用伙伴系统接口,进行真正的内存分配。
CMA时平时将内存分配给应用层使用,当DMA申请连续内存时,则进行页面拷贝,在内存中寻找空闲页面,将DMA zone中应用层申请的页拷贝至其它空闲页,然后就可以整理出一片连续的物理内存。
可以查看蜗窝科技的CMA模块学习笔记

发布了6 篇原创文章 · 获赞 1 · 访问量 7736
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章