[英]What is DMA mapping and DMA engine in context of linux kernel?
什么是Linux內核上下文中的DMA映射和DMA引擎? 什么時候可以在Linux設備驅動程序中使用DMA映射API和DMA引擎API? 任何真正的Linux設備驅動程序示例作為參考都會很棒。
什么是Linux內核上下文中的DMA映射和DMA引擎?
內核通常使用虛擬地址。 像kmalloc()
, vmalloc()
這樣的函數通常會返回虛擬地址。 它可以存儲在void*
。 虛擬內存系統將這些地址轉換為物理地址。 這些物理地址實際上對驅動程序沒用。 驅動程序必須使用ioremap()
映射空間並生成虛擬地址。
CPU CPU Bus
Virtual Physical Address
Address Address Space
Space Space
+-------+ +------+ +------+
| | |MMIO | Offset | |
| | Virtual |Space | applied | |
C +-------+ --------> B +------+ ----------> +------+ A
| | mapping | | by host | |
+-----+ | | | | bridge | | +--------+
| | | | +------+ | | | |
| CPU | | | | RAM | | | | Device |
| | | | | | | | | |
+-----+ +-------+ +------+ +------+ +--------+
| | Virtual |Buffer| Mapping | |
X +-------+ --------> Y +------+ <---------- +------+ Z
| | mapping | RAM | by IOMMU
| | | |
| | | |
+-------+ +------+
如果設備支持DMA,則驅動程序使用kmalloc
或類似的接口設置緩沖區,該接口返回虛擬地址(X)。 虛擬內存系統將X映射到系統RAM中的物理地址(Y)。 驅動程序可以使用虛擬地址X來訪問緩沖區,但設備本身不能,因為DMA不通過CPU虛擬內存系統。 在某些系統中,只有Device可以直接對物理地址執行DMA。 在某些系統中,IOMMU硬件用於將DMA地址轉換為物理地址。如上圖所示,它將Z轉換為Y.
什么時候可以在Linux設備驅動程序中使用DMA映射API?
使用DMA映射API的原因是驅動程序可以將虛擬地址X返回到接口,如dma_map_single()
,它設置任何所需的IOMMU映射並返回DMA地址Z.驅動程序然后告訴設備執行DMA到Z,以及IOMMU映射它到系統RAM中地址Y的緩沖區。
參考來自此鏈接 。
任何真正的Linux設備驅動程序示例作為參考都會很棒。
在Linux內核中,您可以查看drivers / dma中的各種真實驅動程序。
dmaengine是用於開發DMA控制器驅動程序的通用內核框架。
您可以閱讀: dmaengine提供商 。 你可以在drivers / dma下找到很多dmaengine驅動程序的例子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.