1. 程式人生 > >DMA及cache一致性

DMA及cache一致性

        cache的作用:

        CPU在訪問記憶體時,首先判斷所要訪問的內容是否在Cache中,如果在,就稱為“命中(hit)”,此時CPU直接從Cache中呼叫該內容;否則,就稱為“missing”,CPU只好去記憶體中呼叫所需的子程式或指令了。
        CPU不但可以直接從Cache中讀出內容,也可以直接往其中寫入內容。
        Cache的存取速率相當快,使得CPU的利用率大大提高,進而使整個系統的效能得以提升。
        Cache的一致性就是直Cache中的資料,與對應的記憶體中的資料是一致的。
        
        dma的作用:
        DMA是直接操作匯流排地址的,這裡先當作實體地址來看待(系統匯流排地址和實體地址只是觀察記憶體的角度不同)。如果cache快取的記憶體區域不包括DMA分配到的區域,那麼就沒有一致性的問題。但是如果cache快取包括了DMA目的地址的話,一致性就會有問題,因為經過DMA操作,cache快取對應的記憶體資料已經被修改了,而CPU本身不知道(DMA傳輸是不通過CPU的),它仍然認為cache中的資料就是記憶體中的資料,以後訪問Cache對映的記憶體時,它仍然使用舊的Cache資料。這樣就發生Cache與記憶體的資料“不一致性”錯誤。

        匯流排地址是從裝置角度上看到的記憶體,實體地址是CPU的角度看到的未經過轉換的記憶體(經過轉換的是虛擬地址)



        DMA如果使用cache,那麼一定要考慮cache的一致性。解決DMA導致的一致性的方法最簡單的就是禁止DMA目標地址範圍內的cache功能。但是這樣就會犧牲效能;因此在DMA是否使用cache的問題上,可以根據DMA緩衝區期望保留的的時間長短來決策。
        DAM的對映就分為:一致性DMA對映和流式DMA對映。
        一致性DMA對映申請的快取區能夠使用cache,並且保持cache一致性。一致性對映具有很長的生命週期,在這段時間內佔用的對映暫存器,即使不使用也不會釋放。生命週期為該驅動的生命週期;dma_alloc_coherent
        流式DMA對映實現比較複雜,生命週期比較短,而且禁用cache。一些硬體對流式對映有優化。建立流式DMA對映,需要告訴核心資料的流動方向;dma_alloc_writecombine

        [應用]以intel的ioat為例,其有N個dma引擎,每個引擎有獨立的channel。
        在使用中,先申請channel,填充dma的src、dest地址,申請dma_async_tx_descriptor,並tx_submit。
        由於其支援sg介面,能方便使用者處理向量io。
        dma應用中,只有penging tx被請求後,執行dma_async_issue_pending,dma才開始真正工作。

from:http://blog.chinaunix.net/uid-29631743-id-4357014.html