參考資料:
宋寶華:那些年你誤會的Linux DMA(關於Linux DMA ZONE和API最透徹的一篇)-CSDN部落格
https://blog.csdn.net/waterhawk/article/details/50723677
https://www.linuxidc.com/Linux/2012-09/69591p2.htm
注:本節有一些個人理解,如有誤請諒解
dma_alloc_coherent與dma_alloc_writecombine的區別(無保證cache一致性情況下):
dma_alloc_coherent 在 arm 平臺上會禁止頁表項中的 C (Cacheable) 域以及 B (Bufferable)域。而 dma_alloc_writecombine 只禁止 C (Cacheable) 域.
C 代表是否使用高速緩衝儲存器, 而 B 代表是否使用寫緩衝區。
這樣,dma_alloc_writecombine 分配出來的記憶體不使用快取,但是會使用寫緩衝區。而 dma_alloc_coherent 則二者都不使用。
C B 位的具體含義:
0 0 無cache,無寫緩衝;任何對memory的讀寫都反映到匯流排上。對 memory 的操作過程中CPU需要等待。
0 1 無cache,有寫緩衝;讀操作直接反映到匯流排上;寫操作,CPU將資料寫入到寫緩衝後繼續執行,由寫緩衝進行寫回操作。
1 0 有cache,寫通模式;讀操作首先考慮cache hit;寫操作時直接將資料寫入寫緩衝,如果同時出現cache hit,那麼也更新cache。
1 1 有cache,寫回模式;讀操作首先考慮cache hit;寫操作也首先考慮cache hit。
後面加了一條無保證cache一致性的情況下,原因在於假設使用dma_alloc_coherent使用了cache,就得進行不斷地invalidate cache和TLB,並且還無法保證百分百不出問題,所以直接不使用cache快取和緩衝
但是如果有硬體可以確保cache一致性的話,如CMN,那麼dma_alloc_coherent就不一定不使用cache了,並且dma_alloc_coherent申請的實體記憶體也不一定是連續的,這跟晶片原廠實現方式強相關。具體可見參考資料的部落格