2017年2月7日 星期二

kernel cma

設定cma大小,以及如何使用cma, cma機制
0:參考網址

1:設定cma大小,linux 4.4.21
CONFIG_CMA=y
CONFIG_CMA_AREAS=2
CONFIG_CMA_SIZE_MBYTES=8
CONFIG_CMA_SIZE_SEL_MBYTES=y
CONFIG_CMA_ALIGNMENT=11

The alignment is page order size, 4096 * 2^N. So an 8M alignment would be 4096 * 2^11.
也可以在開機參數中加入cma=512M 直接改變cma的大小

2: cma 機制
start_kernel()->setup_arch()->dma_contiguous_reserve()->dma_contiguous_reserve_area()->cma_declare_contiguous()->cma_init_reserved_mem()

dma_generic_alloc_coherent()可以看到這段註釋
/* CMA can be used only in the context which permits sleeping */

setup_arch()的函數中
initmem_init();
dma_contiguous_reserve(max_pfn_mapped << PAGE_SHIFT);
可以看到memory初始化後, 馬上做dma_contiguous_reserve(), 這樣可以解決連續記憶體這個問題.
此外從註解中可以看到一個特別的問題
 * max_low_pfn_mapped: highest direct mapped pfn under 4GB
 * max_pfn_mapped:     highest direct mapped pfn over 4GB
會是使用4GB上面的記憶體? 那麼在小於4GB的機器中, 怎麼處理? A: TODO

3:如何使用cma
dma_alloc_from_contiguous:拿到cma

dma_release_from_contiguous:釋放cma

沒有留言:

張貼留言