DMA和cache一致性問題


https://blog.csdn.net/michaelcao1980/article/details/19191167
Cache原理

CPU緩存(Cache Memory)是位於CPU與內存之間的臨時存儲器,它的容量比內存小的多但是交換速度卻比內存要快得多。緩存的出現主要是為了解決CPU運算速度與內存 讀寫速度不匹配的矛盾,因為CPU運算速度要比內存讀寫速度快很多,這樣會使CPU花費很長時間等待數據到來或把數據寫入內存。在緩存中的數據是內存中的 一小部分,但這一小部分是短時間內CPU即將訪問的,當CPU調用大量數據時,就可避開內存直接從緩存中調用,從而加快讀取速度。

只要Cache的空間與主存空間在一定范圍內保持適當比例的映射關系,Cache的命中率還是相當高的。一般規定Cache與內存的空間比為4:1000,即128kB Cache可映射32MB內存;256kB Cache可映射64MB內存。在這種情況下。命中率都在90%以上。至於沒有命中的數據,CPU只好直接從內存獲取。獲取的同時,也把它拷進Cache。

cache一致性問題

由於緩存存在於cpu與內存中間,所以任何外設對內存的修改並不能保證cache中也得到同樣的更新,同樣處理器對緩存中內容的修改也不能保證內存中的數據 得到更新。這種緩存中數據與內存中數據的不同步和不一致現象將可能導致使用DMA 傳輸數據時 或 處理器運行自修改代碼時產生錯誤。

Cache的一致性就是直Cache中的數據,與對應的內存中的數據是一致的。

 

Cache的基本結構

Cache通常由相聯存儲器實現。相聯存儲器的每一個存儲塊都具有額外的存儲信息,稱為標簽(Tag)。當訪問相聯存儲器時,將地址和每一個標簽同時進行比較,從而對標簽相同的存儲塊進行訪問。Cache的3種基本結構如下:

全相聯Cache

在全相聯Cache中,存儲的塊與塊之間。以及存儲順序或保存的存儲器地址之間沒有直接的關系。程序可以訪問很多的子程序、堆棧和段,而它們是位於主存儲器的不同部位上。 因此。Cache保存着很多互不相關的數據塊。

       Cache必須對每個塊和塊自身的地址加以存儲。當請求數據時,Cache控制器要把請求地址同所有地址加以比較進行確認。

這種Cache結構的主要優點是。

       它能夠在給定的時間內去存儲主存器中的不同的塊,命中率高;缺點是每一次請求數據同Cache中的地址進行比較需要相當的時間,速度較慢。

直接映像Cache

直接映像Cache不同於全相聯Cache。地址僅需比較一次。

在直接映像Cache中。由於每個主存儲器的塊在Cache中僅存在一個位置,因而把地址的比較次數減少為一次。其做法是,為Cache中的每個塊位置分配一個索引字段,用Tag字段區分存放在Cache位置上的不同的塊。單路直接映像把主存儲器分成若干頁。主存儲器的每一頁與Cache存儲器的大小相同。匹配的主存儲器的偏移量可以直接映像為Cache偏移量。Cache的Tag存儲器(偏移量)保存着主存儲器的頁地址(頁號)。

以上可以看出。直接映像Cache優於全相聯Cache,能進行快速查找,其缺點是當主存儲器的組之間做頻繁調用時,Cache控制器必須做多次轉換。

組相聯Cache

組相聯Cache是介於全相聯Cache和直接映像Cache之間的一種結構。這種類型的Cache使用了幾組直接映像的塊。對於某一個給定的索引號,可以允許有幾個塊位置。因而可以增加命中率和系統效率。

 

Cache與DRAM存取的一致性

在CPU與主存之間增加了Cache之后,便存在數據在CPU和Cache及主存之間如何存取的問題。讀寫各有2種方式。

貫穿讀出式(Look Through)

該方式將Cache隔在CPU與主存之間,CPU對主存的所有數據請求都首先送到Cache,由Cache自行在自身查找。如果命中。 則切斷CPU對主存的請求,並將數據送出;不命中。則將數據請求傳給主存。

該方法的優點是降低了CPU對主存的請求次數,缺點是延遲了CPU對主存的訪問時間。

旁路讀出式(Look Aside)

在這種方式中,CPU發出數據請求時,並不是單通道地穿過Cache。而是向Cache和主存同時發出請求。由於Cache速度更快,如果命中,則Cache在將數據回送給CPU的同時,還來得及中斷CPU對主存的請求;不命中。則Cache不做任何動作。由CPU直接訪問主存。它的優點是沒有時間延遲,缺點是每次CPU對主存的訪問都存在,這樣。就占用了一部分總線時間。

寫穿式(Write Through)

任一從CPU發出的寫信號送到Cache的同時,也寫入主存,以保證主存的數據能同步地更新。它的優點是操作簡單,但由於主存的慢速,降低了系統的寫速度並占用了總線的時間。

回寫式(Copy Back)

為了克服貫穿式中每次數據寫入時都要訪問主存。從而導致系統寫速度降低並占用總線時間的弊病,盡量減少對主存的訪問次數,又有了回寫式。

它是這樣工作的:數據一般只寫到Cache,這樣有可能出現Cache中的數據得到更新而主存中的數據不變(數據陳舊)的情況。但此時可在Cache 中設一標志地址及數據陳舊的信息。只有當Cache中的數據被再次更改時。才將原更新的數據寫入主存相應的單元中,然后再接受再次更新的數據。這樣保證了Cache和主存中的數據不致產生沖突。

 

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 操作效果的和。

 

wince 操作系統也有一套cache 操作接口:

void OEMCacheRangeFlush( LPVOIDpAddr, DWORD dwLength, DWORD dwFlags );


---------------------
作者:michaelcao1980
來源:CSDN
原文:https://blog.csdn.net/michaelcao1980/article/details/19191167
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM