天天看點

【Cache篇】Cache的映射方式

????????????部落客首頁:​​MuggleZero​​ ????????????

《ARMv8/v9架構一問一答》專欄位址:​​《ARMv8/v9架構一問一答》​​

前文:

​​【Cache篇】初見Cache​​

前面我們已經初步了解了Cache是什麼。

現在我們知道Cache是以組的形式組成的,是以根據每組的Cache Line數量,可以分為兩種類型的Cache。下面我們就來看看是哪兩種類型。

直接映射型

對于直接映射型的cache來說,每組隻有一片Cache Lines。

如下圖所示的cache示範,這個cache隻有4個Cache Line,每行有4個字,1個字是4位元組。Cache控制器根據位址中的Bit[5:2]來選擇Cache中的字,使用Bit[13:6]作為索引,來選擇4個Cache Line中的1個,Bit[43:14]存儲标記值。

查詢這個Cache時,當Index和Tag值與查詢位址相等并且此Cache包含有效資料時,則發生Cache Hit,然後使用offset值來尋找Cache中的資料。如果這個Cache包含有效資料但是Tag中表示其他位址的值時,那麼就需要替換這個Cache Line。由于這個時候出現了頻繁的Cache換入換出,就會産生嚴重的Cache thrashing(颠簸),嚴重降低系統性能。

【Cache篇】Cache的映射方式
【Cache篇】Cache的映射方式

組相聯型(Set)

為了解決直接映射型cache中的颠簸問題,現代進行中廣泛使用組相聯型cache。

如下圖的2路組相聯cache為例,每一路包括4片Cache Lines,是以每個Set有兩個Cache Line用于替換,他們分别來自Way0和Way1。位址0x00、0x40、0x80的資料可以映射到同一Set的不同Cache Line。是以它們有一半的幾率可以不被替換。

【Cache篇】Cache的映射方式

以A57中的一個32KB大小,4路組相聯的L1 Cache為例,我們來看看這個Cache的結構。

由于Cache大小為32KB且為4路(4個Way),是以每路Cache的大小為8KB,一共有256個Cache Line,每行大小32位元組。

在Cache編碼的位址中,Bit[5:0]用于選擇Cache Line中的資料,Bit[5:2]可以尋址16個字;Bit[1:0]用于尋址每個字中的位元組;Bit[13:6]用于在索引域中選擇哪一行的Cache Line;Bit[43:14]用與标記域。V表示有效位,D表示髒位。

【Cache篇】Cache的映射方式
歡迎我的個人微信公衆号,一起交流學習嵌入式開發知識!