Linux内存从0到1学习笔记(6.7,物理内存初始化之CMA初始化)

Posted 高桐@BILL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内存从0到1学习笔记(6.7,物理内存初始化之CMA初始化)相关的知识,希望对你有一定的参考价值。

写在前面

CMA (contiguous memory allocator)连续内存分配器,被开发用于分配大的、物理连续的内存块,其底层还是依赖内核伙伴系统这样的内存管理机制。通过这套机制,在设备驱动不用时,内存管理系统将该区域用于分配和管理可移动类型页面;设备驱动使用时,用于连续内存分配,此时已经分配的页面需要进行迁移;只有当需要的时候才会被分配给Camera,HDMI等设备。CMA常常和DMA子系统集成在一起使用,对上呈现的接口是标准的DMA,也是一致性缓冲区API(dma_alloc_coherent())。实际上,设备驱动永远不会直接调用CMA API,因为CMA代替了总线地址和内核映射,直接操作页和页框号,而且没有提供管理一致性缓冲区的机制。

 

CMA初始化包括解析DTS,确定可用CMA内存区域。但CMA并不直接开放给driver的开发者,而是提供cma_alloc和cma_release两个接口函数用于分配和释放cma内存。开发者只需要在需要分配dma缓冲区的时候,调用dma相关函数就可以了,例如dma_alloc_coherent。最终dma相关的分配函数会到达cma的分配函数:dma_alloc_from_contiguous() ---> cma_alloc()

linux_mainline-5.17.0/arch/arm64/mm/init.c

321  void __init bootmem_init(void)
322  
......
334  
335  	/*
336  

以上是关于Linux内存从0到1学习笔记(6.7,物理内存初始化之CMA初始化)的主要内容,如果未能解决你的问题,请参考以下文章

Linux内存从0到1学习笔记(6.4,物理内存初始化之预留内存)

Linux内存从0到1学习笔记(6.8,物理内存初始化之buddy伙伴系统)

Linux内存从0到1学习笔记(六,物理内存初始化之四 --- 内存分配器)---持续更新

Linux内存从0到1学习笔记(六,物理内存初始化) --- 更新中

Linux内存从0到1学习笔记(6.10 物理内存初始化之vmalloc分配器)

Linux内存从0到1学习笔记(六,物理内存初始化之三 --- 物理内存管理数据结构)