Linux cma机制探究
cma的作用
cma,全称(contiguous memory allocation),在内存初始化时预留一块连续内存,可以在内存碎片化严重时通过调用dma_alloc_contiguous接口并且gfp指定为__GFP_DIRECT_RECLAIM从预留的那块连续内存中分配大块连续内存。
cma的使用和原理说明
Cma区域可以通过设备树、cmdline和menuconfig指定,并且可以通过设备树的phandle机制和单独的设备绑定,具体的实现和原理说明如下:
设备树指定
在设备树中添加reserved-memory节点,并且compatible属性指定为shared-dma-pool,并在设备节点中通过memory-region引用该节点,如下所示:
代码调用过程如下:
a) kernel/dma/contiguous.c文件,
声明RESERVEDMEM_OF_DECLARE(cma, "shared-dma-pool", rmem_cma_setup);添加struct of_device_id 类型的__reservedmem_of_table section到可执行镜像中。
b) arch/arm/kernel/setup.c文件,
setup_arch->
arm_memblock_init->
early_init_fdt_scan_reserved_mem->