DMA和cache一致性問題

2021-08-27 20:30:00 字數 3590 閱讀 8453

**:

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 );

DMA和cache一致性問題

cache原理 cpu快取 cache memory 是位於cpu與記憶體之間的臨時儲存器,它的容量比記憶體小的多但是交換速度卻比記憶體要快得多。快取的出現主要是為了解決cpu運算速度與記憶體 讀寫速度不匹配的矛盾,因為cpu運算速度要比記憶體讀寫速度快很多,這樣會使cpu花費很長時間等待資料到來或...

記憶體與cache一致性問題

很不錯的一篇文章,mark一下 使用xilinx sdk對zynq的pcie,srio等高速介面進行除錯的過程中,經常會涉及到dma對ddr資料的讀寫,此時就會引入會引入cache一致性問題。zynq的ps在執行過程中,通過ddr控制器對ddr儲存器進行訪問,為了加快訪問速度,常常將一些資料快取在c...

dma訪問主存時 Cache和DMA一致性

dma應該多多少少知道點吧。dma direct memory access 是指在外置可以不用cpu干預,直接把資料傳輸到記憶體的技術。這個過程中可以把cpu解放出來,可以很好的提公升系統效能。那麼dma和cache有什麼關係呢?這也需要我們關注?我們知道dma可以幫我們在i o和主存之間搬運資料...