ARM的cache和写缓冲器(write buffer)
?
轉:https://blog.csdn.net/gameit/article/details/13169445?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-6.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-6.channel_param
一、cache簡介
? ? ? ??通常CPU與外部主存之間的訪問速度差距很大,因為外部主存的低速率讀寫而降低了CPU的執行效率,所以引入了高速緩沖存儲器cache,cache存儲器是一種容量小,速度快的存儲器。其實cache說到底就是一塊速度非常快的內存。
? ? ? ? 而cache經常與寫緩沖器(write buffer)一起使用,使用writer buffer的目的是,將處理器和cache從較慢的對主存的寫操作中脫離出來。
?
下圖是一個計算機系統結構中的存儲器分層結構,更好的顯示了cache和寫緩沖器在存儲層次結構中所處的位置。
? ? ? ??從圖中可以看出,凡是從cache中向主存中寫入數據時都需要經過寫緩沖器。
?
下圖顯示了有cache的系統和沒有cache的系統之間的差別:
?
?
?
cache和存儲管理單元:
????? ??cache可以在放在處理器內核與MMU之間,也可以放在MMU與物理存儲器之間。
? ? ? ? 在處理器和MMU之間的cache稱為?邏輯cache,邏輯cache在虛擬地址空間存儲數據,處理器可以直接通過cache訪問數據,而無需通過MMU。邏輯cache又稱為虛擬cache。
????? ? 在MMU與物理存儲器之間的cache稱為?物理cache,當處理器訪問存儲器時,MMU必須先把虛擬地址轉換成物理地址,cache存儲器才可以向處理器內核提供數據。
下圖是兩中cache:
? ? ??
?
?
二、cache結構
?
??? ? ?1、cache結構
?
? ? ??圖12.4是一個4KB大小的?cache存儲器,這個cache存儲器分為256行,每行由三部分組成:?目錄存儲段,狀態信息段和?數據項段。
?
目錄存儲段:用來記錄每個cache行所對應的主存中的地址,即告訴cache這個行里存放的數據時從主存的什么地方拷貝進來的。這個目錄項里的數據被稱為?“cache標簽”
狀態信息段:用來記錄狀態信息的狀態位,兩個常見的?狀態信息位是?有效位(valid ? bit)和?臟位(dirty ?bit)。有效位用來標記當前的cache行是活動的,即當前的cache行已經存放了從主存中取得的數據,并且可以被處理器所使用。臟位用來標記該cache行中所含的內容是與主存中的內容是否一致,即該cache行中的數據已經被改變,但還沒有被寫回到主存中,主存中的數據還是舊的數據。
數據項段:從主存中拷貝來的數據放在數據項段
?
這個cache存儲器擁有4KB的大小,被分成256行,而每行所占的大小為4個字(16字節)大小,所以為4KB。注意?cache標簽和?狀態信息位所占的空間并不計算在內。
以上就是一個cache存儲器的結構,詳細看下圖12.4:
?
??????? 2、cache控制器的基本操作
?
cache控制器是用來控制cache的,它將主存中的數據或代碼自動拷貝到cache存儲器中,搬移工作自動完成。
? ? ? ??當CPU訪問主存時,在請求被發送到存儲控制器之前,主存地址會被cache控制器攔截,然后cache控制器將要訪問的地址分為三個部分:?標簽域,組索引域和?數據索引域。
? ? ? ????注:cache存儲器中的一行是對應很多個主存地址的。如圖12.5中一行對應了1MB的主存地址空間
?
組索引:用來確定某一個cache行。因為一共有256個行,而組索引寬度是8位,所以正好查找一個cache行。
標簽: ? ?其實就是用來確定當前要訪問的主存地址是否已經被緩存到了所找到的cache行中。如果該標簽與cache行中存放的cache標簽的值相等,且該cache行是活動的,則cache命中,否則失效。
數據索引:確定要訪問該cache行中的哪一個數據。
?
? ? ? 當組索引確定好某個cache行后,cache控制器便會檢查該行的有效位,如果當前cache行是有效的,即處于活動狀態,并且標簽域的值與cache標簽相等,則說明要訪問的主存地址中的數據已經被緩存到了該cache行中,cache命中。
????? ? 否則cache失效,這時,cache控制器從要訪問的主存地址中拷貝整個cache行的數據大小到cache存儲器中。這種拷貝操作稱為?cache行填充。
? ? ? ? ?在cache命中的情況下,控制器直接從cache存儲器中得到數據。使用?數據索引在當前cache行中選擇實際的要獲得的數據或指令。
?
?
詳細請看下圖12.5:
????
?
? ? ? ? ?
?
????cache的映射方式有三種:直接映射,組相聯映射和?全相聯映射
- ? 直接映射
? ? ? ??上圖12.5便是一個直接映射的顯示,在直接映射cache中,由于主存的容量要遠遠大于cache的容量,所以為了讓大容量的主存能夠全部映射到小容量的cache中,往往是主存中的多個地址對應cache中的一行。在上?圖12.5的例子中行,?組索引的值為?0x82,于是便找到了cache存儲器中對應的一個cache行。
????? ? ?注意,因為這一個cache行對應了多個主存地址,在本例中一個cache行對應了?1M的主存地址范圍,而在任一時刻,該cache行只能對應著?1M地址范圍中的一個主存地址,所以要用?標簽再確定該cache行中具體的一個主存地址。用cache行中的cache標簽與標簽域中的標簽比較,如果相等,則?cache命中,然后便對該cache行進行讀寫操作。如果不相等,則?cache失效,那么這個cache行的整個數據會被刪除,并替換為?CPU要訪問的主存地址的內容?,同時也將數據送到處理器中,這個過程稱為?替換。
????
- 組相聯映射
? ? ? ?直接映射雖然簡單方便,但是如果程序同時用到了對應于同一個cache行中的兩個主存地址,那么就會發生沖突,結果就是導致這個cache行不停的進行替換操作。所以就有了?組相聯映射。
???????組相聯映射將這cache存儲器中的256個行分為了?4路,每路有?64個cache行。這時根據組索引找到的 cache行不再是一個,而是同時找到 4個 cache行,所以才被稱為?組索引。?每路中包含一個?cache行。如?下圖12.7所示,便是一個?組相聯映射的cache。
????????因為現在每路中有 64?個 cache?行,所以?組索引的寬度變成了?6位,而?標簽域的標簽寬度變成了?12位。
????? ???直接映射中組索引一次只能對應一個cache?行,而現在組相聯映射中組索引一次能對應?4個cache行,所以現在主存中的一個地址可以存放到?4個cache行中的任意一行。?而在直接映射中,主存中的一個地址只能存放到?對應的一個cache行中。所以一個cache行被?替換的概率減少為原來的四分之一。
一個組相聯映射的實例:
?
- 全相聯映射
隨著cache的相聯度提高,沖突的可能性小了。理想的目標是,盡量提高組相聯程度,使主存中的一個地址能夠映射到cache存儲器中的任意的cache行,這樣的映射關系被稱為全相聯映射。
?
????? ? 簡單來說?直接映射可以看成是一個只有1路的組相聯映射,每路有256個cache行。
? ? 上面的?組相聯映射有4路,每路有64個cache行。
而?全相聯映射有很多路,每路中只有一個cache行。
下圖是一個64路的組相聯映射:
?
三、寫緩沖器
?
寫緩沖器是一個非常小的告高速存儲緩沖器,用來臨時存放處理器將要寫入到主存中的數據,在沒有寫緩沖器的系統中,處理器直接寫數據到主存中。在帶有寫緩沖器的系統中,cache直接將數據先寫到寫緩沖器中,然后寫緩沖器再以低速寫入主存中。這就將高速的CPU和cache從對主存的低速讀寫中脫離了出來。
? ? 寫緩沖器同時還改善了cache的性能,這體現在cache行被替換時。當cache控制器要替換出一個臟的cache行時,它只將該cache行中的數據放入寫緩沖器中,而不寫入主存。這樣就可以快速填充新的cache行數據,處理器就可以繼續從cache存儲器中讀/寫數據。
? ? ?寫緩沖器中的數據在沒有被寫入主存之前,是不能被讀取的。同樣,被替換的cache行在寫緩沖器中時也不能進行讀操作。這也是為什么寫緩沖器的深度通常比較小的原因之一,一般只有幾個cache行的深度。
?
?
四、cache策略
? ? ? ?有3種可以決定cache操作的策略:?寫策略,替換策略和分配策略,寫策略決定了處理器執行寫操作時數據存放的位置。替換策略在cache失效的情況下,決定選擇替換出哪一路的cache行。分配策略決定cache控制器在何時將要分配cache行。
? ? ? ?????
- 寫策略
? ???直寫法:
? ? 如果cache使用直寫策略,那么CPU在?寫cache命中時,將同時修改cache和主存中的內容,以確保cache和主存中數據一致性。在這種策略下,CPU在每次寫cache時也要寫相應主存單元。由于要訪問主存,直寫法的速度比回寫法要慢一些。
????
? ???回寫法:
? ? 如果cache使用回寫策略,那么CPU在?寫cache命中時,只向cache存儲器中寫數據,而不立即寫入主存。這樣,主存地址與相應的cache行數據有可能不一致。cache中的數據時最新的,而主存中的數據可能是較早的,還沒有被更新過。????
? ? 配置成回寫法的cahche要使用到cache行的狀態信息段中的一個或多個臟位(dirty bit)。當向cache存儲器中某一行寫入數據時,他會將臟位設置為1。如果此后訪問該cache行,那么通過臟位就可以知道cache中含有主存中沒有的數據。如果一個臟位被置位的cache行要被替換,那么該cache行中的數據會被自動的先寫入到相應的主存單元中,以防止主存中的信息丟失。
?
- 替換策略
? ? ?? ? 替換策略用于選擇要替換cache行中的數據,應該替換哪個cache行。總的來說,組索引在各個way(路)中選擇可用的一組cache行,而替換策略決定在該組中哪一路中的cache行會被新的數據替換。
????
? ? ? ? 輪轉法:
????? ? 簡單地將當前分配的cache行的下一行作為被替換的行。
????
????? ? 偽隨機替換法:
????? ? 從特定的位置上隨機地選出一行替換出去。
?
? ? ? ? 大多數ARM核兩種策略都支持,相比之下,輪轉法有更好的可預測性。然而,輪轉法在存儲器訪問發生很小的變化時,有可能照成cache性能有較大的變化。
?
- 分配策略
????? ? 在cache失效發生時,ARM的cache可以采取兩種策略來分配cache行:讀操作分配策略,讀寫操作分配策略。
?
????? ? 讀操作分配策略:
????? ??? ?在進行存儲器寫操作時,如果cache未命中,只是簡單的將數據寫入到主存中,而不寫到cache中,如果cache命中,才會將數據寫到cache中。但是在進行存儲器讀操作時,如果沒有命中,則會替換cache行中的內容。
?
????? ? 讀寫操作分配策略:
????????? ? 當進行存儲器寫操作時,如果cache未命中,cache控制器會將要訪問的主存地址中的數據讀到cache行中,并執行寫操作,將數據寫入到cache中。
?
?
五、清理和清除cache
ARM使用?清理和?清除表示對cache的兩種基本操作。
?
? ? ? ? 清理就是把臟的(即被改寫過的)cache行強制寫到主存,并把cache行中的臟位清零。清理cache可以重建cache和主存之間的一致性,它只是用在回寫策略的D-cache上。
? ? ? ? ?清除就是指清除cache中存儲的全部數據,其實就是將cache使無效,將cache行中的有效位清零,讓所有訪問這個cache行的操作都不命中。
????? ??
????? ? 對cache進項清理和清除的操作是通過協處理器CP15中的寄存器C7實現的,具體操作指令看CP15協處理器寄存器詳解。
總結
以上是生活随笔為你收集整理的ARM的cache和写缓冲器(write buffer)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: makefile中变量有哪些?
- 下一篇: 单片机上电复位电路图大全