linux記憶體管理 之 DMA

2021-06-09 20:21:59 字數 1959 閱讀 4853

1、dma:直接記憶體訪問

用於在主存貯器和裝置記憶體之間的大量資料的交換,無須cpu參與,可以提高系統效率。

2、核心中的dma層

3、dma的位址

dma_addr_t

4、dma_set_mask

查詢dma定址範圍

5、dma對映

a、一致性dma對映

static inline void * dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t gfp)

void dma_free_coherent(struct evice *dev, size_t size, void *vaddr, dma_addr_t bus)

分配一組連續的物理頁面,適合於驅動程式自己分配,自己釋放的dma操作。

b、流式dma對映

dma_addr_t  dma_map_single(struct device *dev, void *cpu_addr, size_t size, enum dma_data_direction dir);

使用於不是由驅動程式自己分配的dma區域。

如果第一點不滿足,可用回彈緩衝區解決。

第二點可用struct dma_map_ops函式來處理:sync_single_for_cpu

sync_single_for_device

sync_sg_for_cpu

sync_sg_for_device

c、分散/聚集對映

struct scatterlist {

unsigned long       page_link;

unsigned               intoffset;

unsigned               intlength;

dma_addr_t         dma_address;

unsigned  intdma_length;

}                                

int dma_map_sg(strut device *dev, struct scatterlist *sg, int nents, enum dma_data_direction dir)

d、回彈緩衝區

cpu側俄虛擬位址對應的實體地址不適合裝置的dma操作,需要建立回彈緩衝區。

e、dma池

一致性dma對映只能對映頁面的整數倍的dma緩衝區,如果需要更小的dma緩衝區,則要在dma一致性對映的基礎上的dma池機制。

在dma一致性對映基礎上,將頁面分成塊大小的dma緩衝區。

struct dma_pool {

struct list_head page_list;

spinlock_t lock;

size_t size;

struct device *dev;

size_t allocation;

size_t boundary;

char name[32];

wait_queue_head_t waitq;

struct list_head pools;

dma池的建立:struct dma_pool *dma_pool_create(const char *name, struct device *dev, size_t size, size_t align,size_t boundary)

dma池的銷毀:void dma_pool_destroy(struct dma_pool *pool)

dma緩衝塊的分配:void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags, dma_addr_t *handle)

dma緩衝塊的釋放:void dma_pool_free(struct dma_pool *pool, void *vaddr_t addr)

linux核心DMA記憶體分配

linux系統啟動過程中,會初始化整個核心位址空間,將其劃分為各個型別段,其中包括物理記憶體對映區 又稱之為邏輯位址對映區 虛擬記憶體分配區 高階頁面對映區 系統保留對映區 dma對映區 這個類似物理記憶體對映區,其對映的實體地址是連續的 這幾個區域等等,linux核心在啟動的時候通過arch ar...

Linux記憶體管理 DMA和一致性快取

cpu寫記憶體的時候有兩種方式 1.write through cpu直接寫記憶體,不經過cache。2.write back cpu只寫到cache中。cache的硬體使用lru演算法將cache裡面的內容替換到記憶體。通常是這種方式。dma可以完成從記憶體到外設直接進行資料搬移。但dma不能訪問...

Linux 預留記憶體 DMA 使用心得

linux reserved memory 預留記憶體 本文採用的是 上文的 通過dma api預留記憶體 的方式 通過命令 cat proc iomem 7ff00000 7ff00fff dma 7ff00000 7ff00000 7ff00fff dma 7ff00000 7ff50000 7...