CMA内存分配

 在以前的驱动中,一般给LCD/GPU/camera预留部分内存,满足这些模块内存分配的同时,也能够提供物理地址连续内存.

但是,如果GPU/camera/LCD没有使用时,这部分内存就白白浪费了,所以就有了CMA机制.


CMA给驱动提供了一种分配连续内存的方法, 在驱动没有分配CMA内存时,这部分内存可以用于migrate type为moveable的内存分配,在驱动需要CMA内存时,先释放之前分配的CMA内存,然后重新给moveable内存进行映射.

DMA内存分配可以基于CMA提供的接口分配内存.

1. CMA内存的初始化:

setup_arch--->arm64_memblock_init->dma_contiguous_reserve->dma_contiguous_reserve_area->cma_declare_contiguous->cma_init_reserved_mem

定义一个全局的CMA内存,每个驱动程序也可以定制自己的CMA内存.

可以通过: cma_init_reserved_mem函数申请保留一段内存用于CMA操作。

当CMA 区域注册完成后,core_initcall(cma_init_reserved_areas); 把CMA内存释放到伙伴系统中.

2. CMA内存分配和释放

struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align)

bool cma_release(struct cma *cma, const struct page *pages, unsigned int count)


http://www.wowotech.net/memory_management/cma.html


猜你喜欢

转载自blog.csdn.net/bin_linux96/article/details/79814081