CMA記憶體分配

2021-08-18 04:38:16 字數 1491 閱讀 5928

在以前的驅動中,一般給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)

3驅動定義自己的cma記憶體

1. 在dts的reserved-memory結點中定義預留記憶體的起始位址和size.

size必須是(page_size)《起始位址也必須(page_size)2. 在驅動中定義reserved-memory處理函式

static int __init reserved_cma_test(struct reserved_mem *rmem)

return 0;

}reservedmem_of_declare(cma_test, "cma_test", reserved_cma_test);

3.分配cma記憶體

注意,這兩個分配函式可能會休眠,不能在原子上下文呼叫.

cma_alloc(cma_test,8,0);

cma_release(cma_test,8,pages);

4.如果需要把cma記憶體預留為dma操作,

首先需要把dma分配函式和cma關聯起來

arch_setup_dma_ops(dev, 0, 0, null, 1);//需要設定coherent=1

dev_set_cma_area(dev, cma_test);

然後進行分配dma分配,最終會呼叫cma_alloc來從我們預留的記憶體中分配

dma_alloc_coherent(dev,size,gfp_kernel)//必須要允許休眠

記憶體分配 Go記憶體管理 記憶體分配一

go作為乙個比較新晚 新 的語言,自然借鑑前輩們的優點,比如說語言本身負責記憶體管理 對協程和高併發的高優支援 簡單高效的語法等。本篇及後續的幾篇要講的就是還沒提到的比較複雜的記憶體管理。學習記憶體管理 分配 前,如果有jvm的記憶體管理的基礎,會變得非常簡單,如果是第一次接觸記憶體管理,在看完go...

記憶體分配 定長記憶體分配器

在各種記憶體分配演算法中,有一種很實用,實現起來也簡單 定長的記憶體分配器。即每次分配的記憶體大小是固定的。大概邏輯是 在一些區域性的單執行緒邏輯中,可以有效提高效率。很短,很容易看懂 fallocator.h pragma once 固定長度的記憶體分配器 include include incl...

靜態記憶體分配和 動態記憶體分配

1 靜態記憶體分配是在編譯時完成的,不需要占用cpu資源 動態分配記憶體是在執行時完成的,動態記憶體的分配與釋放需要占用cpu資源 2 靜態記憶體分配是在棧上分配的,動態記憶體是堆上分配的 3 動態記憶體分配需要指標或引用資料型別的支援,而靜態記憶體分配不需要 4 靜態分配記憶體需要在編譯前確定記憶...