簡體   English   中英

什么是Linux內核上下文中的DMA映射和DMA引擎?

[英]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設備驅動程序示例作為參考都會很棒。

一個簡單的PCI DMA示例

在Linux內核中,您可以查看drivers / dma中的各種真實驅動程序。

dmaengine是用於開發DMA控制器驅動程序的通用內核框架。

您可以閱讀: dmaengine提供商 你可以在drivers / dma下找到很多dmaengine驅動程序的例子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM