1.概念
處理器通路主存儲器使用位址編碼的方式。Cache也使用類似的位址編碼,是以處理器使用這些編碼位址可以通路各級cache。下圖是經典的Cache架構圖

處理器在通路存儲器時,會把位址傳給TLB和cache,TLB是一個存儲虛拟位址到實體位址轉換的小緩存。處理器先使用EPN在TLB 中查找最終的RPN(Real Page Number)。如果在這期間發生TLB Miss, 将會帶來一系列的系統懲罰,處理器需要查詢頁表,假設這裡TLB Hit, 此時很快獲得合适的RPN,并得到相應的實體位址PA(Physical Address)。
同時,處理器通過cache編碼位址可以很快找到相應的cache line組。但是這裡的cache block資料不一定是處理器所需要的,是以需要進行檢查,将cache line中存放的位址和通過虛拟位址轉換的實體位址進行比較,如果相同則會發生cache命中,那麼處理器通過位元組選擇和偏移部件,就可以擷取到最終資料。如果發生cache miss,處理器需要用實體位址進一步通路不主存儲器獲得最終資料。
Cache的基本結構圖
Cache位址編碼:處理器通路cache位址時的位址編碼,分為3個部分,分别是偏移量、索引和标記
Cache Line:cache中最小的通路單元,包含一小段主存儲器的資料,常見的大小為32/64Byte
索引:用于查找在哪一行
組:相同索引區域的cache Line組成一個組
路:在組相連的cache中,cache被分為大小相同的幾個塊
标記:cache位址編碼的一部分,用于判斷cache line存放的資料是否和處理器想要的一緻。
2.cache映射方式的差別
(1)直接映射
根據每個組的高速緩存行數,cache可以分成不同的類。當每個組隻有一行cache line時稱為直接映射高速緩存。
如下圖,這個cache隻有4行cache line,每行有4個字(word,一個字4Byte)。發生cache命中的時候,隻能同時有一個cache line,因為cache line的頻繁換入換出,會導緻嚴重的cache颠簸。
(2)組映射
為了直接解決高速映射緩存中的cache颠簸問題,組相聯的cache結構得到了廣泛應用。
如上圖兩路組相連的cache,每路包括4個cache line,那麼每組有兩個cache line 可以以提高cache line替換。位址0x00,0x40或0x80的資料可以映射到同一組的任意一個cache line。當cache line發生替換操作時,就有50%機率可以不被替換,進而減少了cache颠簸
(3)全關聯
3.PIPT和VIVT的Data Cache組織方式有什麼不同?
處理器在通路存儲器通路時,處理器通路位址是虛拟位址,經過TLB和MMU映射,最終變成實體位址PA。那麼查詢cache組是用虛拟位址還是實體位址的索引呢?當找到cache時,我們使用虛拟位址還是實體位址的tag來比對cache line呢?
Cache可以設計成通過虛拟位址或者實體位址通路,可以分為3類。
VIVT(Virtual Index Virtual Tag)
VIPT(Virtual Index Physical Tag)
PIPT(Physical Index Physical Tag)
4.多核處理器中,cache(高速緩存)一緻性是如何實作的,簡述MESI協定的含義。
Cache一緻性産生的原因是不同CPU核上的資料cache和記憶體可能具有同一個資料的多個副本。Cache一緻性協定主要有兩大類别,監聽協定和目錄協定
ARM采用MESI協定來維護cache一緻性,MESI的含義:修改态(Modified)、獨占态(Exclusive)、共享态(Shared)和失效态(Invalid)。
5.Cache在Linux核心中的妙用