我閱讀了關於dma API的自述文件,但仍不明白應該如何使用它。 據說dma_alloc_coherent負責分配緩衝區,它是否也可以重定位到事務? (我在ivtvfb.c司機見例如fb_write,使用dma_alloc_coherent的完成,如果它的交易實際上是負責)如何在內核中執行單個dma事務?
- 但是如何觸發DMA事務開始?
- 完成後是否有回調?
我閱讀了關於dma API的自述文件,但仍不明白應該如何使用它。 據說dma_alloc_coherent負責分配緩衝區,它是否也可以重定位到事務? (我在ivtvfb.c司機見例如fb_write,使用dma_alloc_coherent的完成,如果它的交易實際上是負責)如何在內核中執行單個dma事務?
什麼是DMA傳輸?
DMA是硬件機制,它允許外圍組件,而無需涉及該系統處理器直接傳輸它們的I/O數據,並從主存儲器中。使用這種機制可以大大提高進出設備的吞吐量,因爲主CPU不需要大量的計算開銷。
...使用
dma_alloc_coherent()
就好像它實際上負責交易一樣。
相反,dma_alloc_coherent()
簡單地創建一個緩衝區,則可以接受的DMA控制器即保留在主存儲器中的區域(通常是連續的),可以在CPU和DMA控制器之間共享。
例如,要執行DMA寫入,CPU可以填充此緩衝區並指示DMA控制器將其寫入設備,一旦完成,調用回調函數(以通知SW上運行的SW中央處理器)。
與此同時,當DMA控制器並行處理到外部設備的數據傳輸時,CPU可以繼續執行不依賴於正在同時傳輸的數據的其他不相關任務。
類似地,以執行DMA讀入中,CPU只是簡單地傳遞通過調用dma_allocate_coherent()
給DMA控制器獲得的緩衝器,並指示它執行讀取。隨後,DMA控制器讀取所述外部設備,並開始填充提供緩衝並調用回調函數一旦緩衝器被填充(或半填充的作爲構造一定的時間間隔後或。)
延伸閱讀:
Chapter 15 of LDD3 - "mmap and DMA"。
Article on DMA APIs in the Linux kernel。
一般來說,這取決於在DMA控制器上。 即DMA控制器驅動程序提供的API。
dma-engine
是由幾個DMA提供商所使用的Linux內核的標準框架。
相關:What is DMA mapping and DMA engine in context of linux kernel?
在dma-engine
情況:
有它完成時的回調?
填充從dmaengine_prep_slave_sg()
獲得如何觸發DMA事務開始在描述符回調指針?
使用dma_async_issue_pending()
並傳遞初始化的描述符。
欲瞭解更多詳細信息,請參閱dma-engine
client documentation。
謝謝!我還沒有檢查過dma-engine framewaork,但首先嚐試瞭解本地內核API,例如我在ivtvfb.c代碼中看到,在fb_write中它們使用dma_alloc_coherent(),就好像該函數從pc到設備進行復制一樣。 dma_alloc_coherent是否也執行了交易? – ransh