一致性dma
dma_alloc_coherent
(dev, size, &dma_handle, gfp);
流式dma
dma_map_single(dev, addr, size, direction);
dma_unmap_single
(dev, dma_handle, size, direction);
一致性dma可以認為是「同步的」,就是dma和cpu之間看到的物理記憶體是一致的。流式dma則不然。
dma操作和cpu之間的主要隔閡就是cache,因為一般來說dma只操作物理記憶體,不會動cache,但cpu卻首先看到的是l1 l2cache,所以裝置驅動就需要呼叫正確的dma函式來操作cache。拿網絡卡收發包為例,假如cpu發包給網絡卡,那cpu填好skb的資料之後,得先把cache裡有關這個skb資料的行給刷到物理記憶體,否則網絡卡從物理記憶體拿到的資料不是真正所要的資料。反之,cpu把skb資料裝配好dma rx descriptor的時候,得先invalid掉這個skb資料在cache裡的行。這樣dma把收到的包填到物理記憶體後再中斷告知cpu時,cpu就可以避免從cache拿到關於這個skb的老(髒)資料,而會從物理記憶體取包而重新建立資料cache。
dma_map_single
dma_unmap_single
做的就是這個事情,它會根據資料的方向來判斷該是clean cache還是incalid cache。
那麼dma描述符呢,dma控制器和cpu都要對dma描述符做頻繁操作,當cpu和dma需要頻繁的操作一塊記憶體區域的時候,一致性dma對映就比較合適。所以dma描述符特別適用於一致性dma。當然,你也可以對dma描述符用流式操作,但那樣開銷就比較大了。
順便說一句,刷cache是比較耗時的,特別是刷的區域比較大的時候。現代的很多處理器,cpu和dma控制器之間從硬體上就能保證cache一致性,如arm的acp功能,這樣像
dma_map_single只是返回實體地址,而
dma_unmap_single
什麼都不做。極大的提高了系統效能。
cache與dma的一致性問題
在進行dma 操作時,如果沒有對cache 進行適當的操作,將可能產生以下兩種錯誤:
1.dma 從外設讀取資料到供處理器使用。dma 將外部資料直接傳到記憶體中,但cache 中仍然保留的是舊資料,這樣處理器在訪問資料時直接訪問快取將得到錯誤的資料。
2.dma 向外設寫入由處理器提供的資料。處理器在處理資料時資料會先存放到cache 中,此時cache 中的資料有可能還沒來得及寫回到記憶體中的資料。如果這時dma 直接從記憶體中取出資料傳送到外設,外設將可能得到錯誤的資料。
為了正確進行dma 傳輸,必須進行必要的cache 操作。 cache 操作主要分為 invalidate (作廢) 和writeback (寫回) ,有時也將兩著放在一起使用。
dma如果使用cache,那麼一定要考慮cache的一致性。解決dma導致的一致性的方法最簡單的就是禁止dma目標位址範圍內的cache功能。但是這樣就會犧牲效能。
因此在dma是否使用cache的問題上,可以根據dma緩衝區期望保留的的時間長短來決策。dam的對映就分為:一致性dma對映和流式dma對映。
一致性dma對映申請的快取區能夠使用cache,並且保持cache一致性。一致性對映具有很長的生命週期,在這段時間內占用的對映暫存器,即使不使用也不會釋放。生命週期為該驅動的生命週期。
流式dma對映實現比較複雜。只知道種方式的生命週期比較短,而且禁用cache。一些硬體對流式對映有優化。建立流式dma對映,需要告訴核心資料的流動方向。
1. dma 從外設讀取資料到供處理器使用時,可先進性invalidate 操作。這樣將迫使處理器在讀取cache中的資料時,先從記憶體中讀取資料到快取,保證快取和記憶體中資料的一致性。
2.dma 向外設寫入由處理器提供的資料時,可先進性writeback 操作。這樣可以dma傳輸資料之前先將快取中的資料寫回到記憶體中。
如果不清楚dma 操作的方向,也可先同時進行invalidate 和writeback 操作。操作的結果等同於invalidate 和 writeback 操作效果的和。
dma記憶體一致性
核心的dma一般在平台初始化的時候已經分配好了。但是對於一些有內部dma的硬體ip,比如usb ip video加速ip,他們可能由ip廠商封裝好的,沒辦法繫結到cpu端,這時候在核心使用dma就要注意了,因為dma只認識實體地址哦。當然,辦法還是有的,look 以下來自 這兩天在做 dma 相關開...
dma訪問主存時 Cache和DMA一致性
dma應該多多少少知道點吧。dma direct memory access 是指在外置可以不用cpu干預,直接把資料傳輸到記憶體的技術。這個過程中可以把cpu解放出來,可以很好的提公升系統效能。那麼dma和cache有什麼關係呢?這也需要我們關注?我們知道dma可以幫我們在i o和主存之間搬運資料...
Linux記憶體管理 DMA和一致性快取
cpu寫記憶體的時候有兩種方式 1.write through cpu直接寫記憶體,不經過cache。2.write back cpu只寫到cache中。cache的硬體使用lru演算法將cache裡面的內容替換到記憶體。通常是這種方式。dma可以完成從記憶體到外設直接進行資料搬移。但dma不能訪問...