CMA簡介【轉】

轉自:https://blog.csdn.net/jasonactions/article/details/123085907?spm=1001.2014.3001.5502

kernel: 5.10
arch: arm64

1. 前言
CMA是一段連續的內存區域,它的所有頁面都是可遷移類型,平時在不需要大塊連續內存的時候,這段CMA區域可供系統或其它驅動使用,在驅動需要大塊內存的時候,已佔用的部分需要遷移出去,空閒出大塊連續內存以供分配。

2. 配置CMA區域
有三種方式可以配置CMA區域大小,dts,commdline, 內核的配置項,優先級分別是dts > commandline > 內核配置項,分別舉例如下:

In the device tree:
linux,cma {
compatible = "shared-dma-pool";
reusable;
size = <0 0x3c000000>;
alloc-ranges = <0 0x96000000 0 0x3c000000>;
linux,cma-default;
};

On the kernel command line:
cma=256MB
1
In the kernel configuration:
CONFIG_CMA_SIZE_MBYTES=960
CONFIG_CMA_SIZE_PERCENTAGE=25
# CONFIG_CMA_SIZE_SEL_MBYTES is not set
# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
CONFIG_CMA_SIZE_SEL_MIN=y
# CONFIG_CMA_SIZE_SEL_MAX is not set

3. CMA API
對於用戶來講,使用cma仍然會採用原有的dma接口來調用,這對用戶是感知不到的,接口可參考DMA-API.txt

4. CMA的工作機制
首先必須在cmdline或dts或內核配置項中爲cma預留區域;

arm64_memblock_init中會解析預留區域,將這部分區域添加到memlbok.reserved,這其中包含了CMA定義的區域,這部分區域會被初始化給cma;

bootmem_init->sparse_init會爲所有的物理內存bank創建page;

初始化時cma_init_reserved_areas->cma_activate_area->init_cma_reserved_pageblock 將cma區域的空閒page給buddy,並標註這些pageblock的屬性爲MIGRATE_CMA;

mm_init->mem_init->memblock_free_all->free_low_memory_core_early 只是釋放>memblock.memory的空閒空間給buddy,且排除所有的memblock.reserved區域

通過dma接口申請連續物理內存,就可能會從CMA中申請,如果發現CMA區域已經被其它用戶申請則需要將這些頁面進行遷移
參考文檔
A deep dive into CMA
CMA模塊學習筆記
Contiguous Memory Allocator - CMA (Linux)
DMA-API.txt
DMA-API-HOWTO.txt
————————————————
版權聲明:本文爲CSDN博主「HZero.chen」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/jasonactions/article/details/123085907

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章