2010-02-22 89 views
13

我有一些關於緩存同步操作的問題。緩存 - 刷新和無效操作

無效:在cpu嘗試讀取由設備更新的部分內存之前,相應的內存需要失效。

沖洗:所述裝置讀取的存儲器由CPU更新的部分之前,CPU必須刷新(回寫也是正確的嗎?)從超高速緩存到存儲器中的內容,使設備從存儲器讀取與更新的內容的內容。

如果未執行刷新操作,則可能會讀取內存中存在的垃圾數據,因爲內存仍未更新,並且內容寫入緩存。

請確認我的上述理解是否正確?

什麼時候要結合flush和invalidate?我聽說在使用設備控制描述符時,我們需要通過組合flush和invalidate來同步。爲什麼這樣?

我們是否需要遵循一個像flush這樣的順序然後無效?

有沒有一種情況,其中無效後跟着刷新會有用?

+0

謝謝你的解釋,找不到比互聯網上更好的解釋...... – fazkan

回答

21

Flush會將緩存的內容寫回到主內存,而invalidate會將緩存行標記爲無效,以便將來的讀取移到主內存。

我認爲如果設備正在更新一塊內存,我們會結合flush和invalidate:flush會確保設備有最新的內容,然後invalidate會確保當設備完成時CPU會從內存中讀取新內容。

+2

爲了清楚起見,這主要是在初始化階段進行的。在初始化階段,初始化的描述符都被刷新(在內存中更新)和失效(以便下一次由CPU讀取的內容有用)。 – kumar

2

請確認我的上述理解是否正確?

一般來說,你是完全正確的,但有一些石頭可能會導致絆倒。您沒有指定硬件平臺。如果我們不是在談論採用SRAM的小型嵌入式控制器,請考慮以下幾點。 與MMU一起打包的處理器支持正常DDR內存和驅動程序(硬件相關)內存的不同內存屬性。最後一個是不可緩存的,所以不用擔心沖洗/無效。


當你想結合了沖洗和無效?在播放設備控制描述符時我聽到 ,我們需要通過組合flush和invalidate來同步 。爲什麼這樣?

由於DMA是在標籤有幾個方案(假設HW緩衝液是不可緩存的存儲器設備)中提到:

  1. 從DDR存儲器到HW緩衝器DMA傳輸數據。
  2. 從HW緩衝區到DDR的DMA傳輸數據(硬件接收數據並希望使其可用於CPU)
  3. 將DMA從DDR傳輸到DDR的另一個區域。


  1. DDR緩衝區應DMA之前沖刷。驅動程序緩衝區不可緩存,因此不需要失效。
  2. DDR緩衝區應該是無效之前或之後(請查看下面的NOTE瞭解詳情)DMA傳輸以防止CPU使用來自緩存的「舊」數據。沖洗硬件緩衝區是多餘的。
  3. 'Source'緩衝區應該被刷新,'Destination'緩衝區應該失效。所以有效的數據在傳輸之前存儲在DMA的內存中,並且在DMA完成任務後,CPU不會從緩存中取出「污垢」。


NOTE:很明顯, '源' 應該是DMAing之前沖刷。仍然有問題何時無效。從技術上講,CPU要嘗試訪問'Destination'數據並且可能在DMA之前或之後(我們應該確保DMA已經完成了這項工作)。 IRL無效後 DMA可能會導致問題。請參閱 Flush/Invalidate range by virtual address; ARMv8; Cache;

正如你可以看到這個特殊的平臺無效前應 DMAing完成。還漫遊th /的ARMv7設備的BSP代碼我發現建議無效的目標緩衝區之前 DMA傳輸。


我們需要遵循類似沖洗序列,然後無效?

假設源緩衝區和目標緩衝區彼此不相交,則不存在依賴關係。你可以flush-invalidateinvalidate-flush


是否有其無效,隨後沖洗將是有益的場景?

不這麼認爲。