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...