linux DMA介面知識點詳解

2022-09-26 13:48:10 字數 3588 閱讀 4611

1.兩種dma對映型別

1.1. 一致性dma對映(consistent dma mappings )

主要用於對映長時間使用的區域。

cpu和dma controller不需要考慮cache的影響。

這裡的consistent實際上是coherent的概念,不能保證consistent,也就是說需要memory barrier來保證memory order。

1.2 流式dma對映(streaming dma mapping)

主要用於一次性dma傳輸,傳輸完成後就會釋放。

2.指定dma裝置的定址範圍

include/linux/dma-mapping.h

// 用於一致性記憶體對映的對映範圍

static inline int dma_set_coherent_mask(struct device *dev, u64 mask)

// 用於流式記憶體對映的對映範圍

static inline int dma_set_mask(struct device *dev, u64 mask);

3.dma對映介面

3.1一致性dma介面

分配較大dma buffer

// dev dma控制器裝置

// size 要分配的dma buffer大小

// dma_handle 返回dma buf的實體地址

// flag 分配標誌

// 返回值 dma buffer的虛擬位址

void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag)

// dev dma控制器裝置

// size 釋放的dma buffer大小

// cpu_addr dma buf的虛擬位址

// dma_handle dma buf的實體地址

void dma_free_coherent(struct device *dev, size_t size,

void *cpu_addr, dma_addr_t dma_handle)

分配較小dma buffer,從dma poll中申請。

/*** dma_pool_alloc - 從dma poll獲得一塊一致性記憶體

* @pool: 產生記憶體塊的dma pool

* @mem_flags: gfp_* bitmask

* @handle: 返回記憶體塊的dma位址

*/void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags,

dma_addr_t *handle)

/** * dma_pool_free - 將記憶體釋放回dma pool

* @pool:產生記憶體塊的dma pool

* @vaddr: 記憶體塊的虛擬位址

* @dma: 記憶體塊的實體地址

*/void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t dma)

3.2 流式dma介面

// dev 需要對映記憶體的裝置

// ptr 對映的buffer虛擬位址

// size 對映的大小

// dir 傳輸方向

// attr 屬性

// 返回值 dma實體地址

dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr,

size_t size,

enum dma_stsrxovdata_direction dir,

unsigned long attr程式設計客棧s)

// dev 需要對映記憶體的裝置

// addr dma區域的實體地址

// size 對映的大小

// dir 傳輸方向

// attr 屬性

void dma_unmap_single_attrs(struct device *dev, dma_addr_t addr,

size_t size,

enum dma_data_direction dir,

unsigned long attrs)

page對映

dma_addr_t dma_map_page(struct device *dev, struct page *page,

size_t offset, size_t size,

enum dma_data_direction dir)

void dma_unmap_page(struct device *dev, dma_addr_t addr,

size_t size, enum dma_data_direction dir)

返回dma對映錯誤

// 返回dma對映錯誤

int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)

對映scatterlist

int dma_map_sg_attrs(struct device *dev, struct scatterlist *sg,

int nents, enum dma_data_direction dir,

unsigned long attrs)

void dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg,

程式設計客棧 int nents, enum dma_data_direction dir,

unsigned long attrs)

// 返回map後的dma位址和長度

sg_dma_address(struct scatterlist *sg)

sg_dma_len(struct scatterlist *sg)

sync操作

void dma_sync_single_for_程式設計客棧cpu(struct device *dev, dma_addr_t addr,

size_t size,

enum dma_data_direction dir)

void dma_sync_single_for_device(struct device *dev,

dma_addr_t addr, size_t size,

enum dma_data_direction dir)

void

dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg,

int nelems, enum dma_data_directionwww.cppcns.com dir)

void

dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,

int nelems, enum dma_data_direction dir)

介面知識點2

1.介面中常量的定義 public static final int num one 34 注意事項 前三個關鍵字可以省略,final定義的是不可變的量,名字盡量是用大寫,必須進行賦值。2.介面是沒有靜態 塊或者構造方法的。3.乙個類的直接父類只能有乙個,但是乙個類可以同時實現多個介面。格式為 pu...

Map介面知識點

map知識點 1 map介面 hashmap集合 linkedhashmap集合 2 map 雙列集合,collection 單列集合 3 hashmap 要保證鍵的唯 一 不重複,需要重寫鍵的hashcode 方法 equals 方法。4 linkedhashmap儲存順序一致 5 map 鍵ke...

介面測試知識點

介面大體分為 websevice介面 請求報文格式是body date,返回報文是xml格式 http api介面 請求報文格式是value key,返回報文是jsonp 介面文件的組成部分 可以檢查頁面上發現不了的bug,如繞過前端頁面的一些操作是否具有安全性 檢查系統的異常處理能力 安全性 介面...