設定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
沒有留言:
張貼留言