写在前面

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初始化)