前言

前面我們講到通過TLB緩存頁表加快地址翻譯,通過上一節緩存原理的講解爲本節做鋪墊引入TLB和緩存的關係,同時我們來完整梳理下從CPU產生虛擬地址最終映射爲物理地址獲取數據的整個過程是怎樣的,若有錯誤之處,還請批評指正。

TLB和緩存串行訪問(Serial TLB & Cache Access)

這裏會跳過前面對虛擬頁號、虛擬頁偏移量、TLB索引和標記等的詳細分析和計算,不清楚的童鞋請先查看前面文章再來看本文。假設我們有14位的虛擬地址、12位的物理地址,每頁大小爲64字節,如下:

同時假設已完全清楚虛擬地址和物理地址劃分,接下來則是針對虛擬地址和物理地址進行位劃分,如下:

同時我們假設TLB是通過組相聯來進行映射,TLB中有16個條目,4路相聯,所以TLB索引(TI)和TLB標記(TT)在虛擬地址中虛擬頁號進行位劃分如下:

我們假設緩存採取直接映射的機制,緩存大小爲64字節,每塊大小爲4個字節,說明緩存有16塊即4位,位偏移爲2位,所以緩存索引(CI)和緩存標記(CT)在物理地址中進行位劃分如下:

現假設讀取虛擬地址(0x0255),那麼將其劃分爲VPN(0x09),VPO(0x15),然後將VPN劃分爲TT(0x02)和TI(1)如下:

接下來通過TT(0x02)和TI(1)去查找TLB,如下:

此時我們會發現TLB缺失,緊接着通過VPN(0x09 16 = 21 10 )去頁表中查找得到PPN(0x17 16 = 23 10 ),如下: 

因其PPO = VPO(0x15),所以計算出物理地址爲(23 * 64+21 = 1493 10 = 0x5D5 16

然後根據上述物理地址劃分爲CT(0x17)、CI(5)、CO(1),如下:

最後通過上述CT(0x17)和CI(5)去查找緩存,此時緩存命中,然後將數據發送到CPU,如下:

從CPU到獲取數據整個的過程是這樣的:【1】CPU產生虛擬地址【2】TLB翻譯成物理地址【3】TLB命中,將物理地址發送到緩存【4】緩存命中返回數據。其中每一個過程涉及到的細節,比如TLB缺失、頁缺失等等前面已有詳細講解,殊途同歸,大致過程則是如下圖解

通過如上可看出此時TLB與Cache是串行訪問的關係,這是最簡單同時也是比較慢的方式,因爲不得不等待TLB翻譯完成後纔去檢查緩存中是否有數據,如此一來將對CPU處理速度產生重大影響,涉及到大量內存訪問時間。

TLB和緩存並行訪問(Parallel TLB & Cache Access)

當前處理器最普遍的設計是採取TLB和Cache並行的方式,有些也稱之爲重疊訪問(Overlapping TLB & Cache Access),從而提高訪問速度,那麼並行訪問到底是如何做的呢?有沒有什麼使用限制呢?這裏我們以Intel Skylake(英特爾第六代微處理器架構)爲例來說明,其虛擬地址和物理地址結構大致如下:

看到上述結構我們可以發現物理地址中的PPN和緩存標記(CT)位數相等以及其他,英特爾這樣設計就是爲了讓TLB和Cache可以並行訪問。 TLB和Cache並行訪問原理:虛擬地址(VA)中的高階位即(VPN)用來查找TLB,而低階位(VPO)用來查找緩存。通過TLB將VPN映射到PPN,此時PPN作爲緩存標記(CT),而將VPO中的低階位作爲緩存偏移量(CO),高階位作爲緩存索引(CI)。 有了緩存標記和緩存索引我們就可以查詢到數據,比如CPU產生虛擬地址(0x79 16 = 0001111001 2 ),此時通過並行訪問則爲如下圖解

我們結合上述圖解繼續進行分析將並行訪問分爲三種情況,比如上緩存中的tag = 11,同時我們產生的PPN = tag = 11,說明緩存標記等於物理頁號,同時緩存命中,最終返回數據B5給CPU(其一)。假設產生的緩存標記不是11,那麼說明緩存標記不等於頁號或者緩存缺失,但此時TLB命中,那麼將通過TLB中的物理頁號直接訪問主存(其二)。否則做標準的虛擬地址翻譯(其三)。爲便於大家理解,我們通過僞代碼形式來說明:

if (cache hit && cache tag = PPN)
  //返回數據到CPU
else if (cache miss || cache tag != PPN && TLB hit) 
  //通過TLB中的PPN訪問主存
else
  //標準地址翻譯

兩種緩存架構(Cache & TLB Access)

緩存索引(Cache index)用於查找數據在緩存中的索引位置,而緩存標記(Cache tag)則是驗證緩存中有哪些數據。從上述對並行訪問原理講解我們知道將虛擬地址中的虛擬偏移量可作爲物理緩存索引,這裏我們稱之爲虛擬索引,同時我們將VPN轉換爲PPN,這種模式稱之爲虛擬索引、物理標記緩存架構(Virtual-indexed Physically-tagged Caches),其實我們也可以將虛擬地址中的偏移量作爲緩存標記,也就是說虛擬地址中的偏移量(VPO)既作爲緩存索引也作爲緩存標記,這種緩存架構成爲虛擬索引、虛擬標記緩存架構(Virtual-indexed Virtually-tagged Caches),也叫虛擬地址緩存(Virtual Address Caches),接下來我們來分析這兩種緩存架構。

虛擬索引、虛擬標記緩存(Virtual-indexed Virtually-tagged Caches)

此種緩存架構讓緩存保存虛擬地址,但是現代處理器極少使用這種緩存設計,雖然很塊,但是處理起來很複雜, 比如進行上下文切換時需要刷新緩存(當然可以在地址空間添加ASID),但是即使這樣,由於頁面可以共享而造成處理頁面別名問題,用於直接映射緩存的解決方案,共享頁面的VA必須在緩存索引位中一致,確保訪問同一PA的所有VA將在直接映射的緩存(早期SPARC)中發生衝突,所以大多處理器採用第二種(VA-PA)緩存架構。

虛擬索引、物理標記緩存(Virtual-indexed Physically-tagged Caches)

並行TLB & Cache訪問採取的就是此種架構,此種架構要求緩存索引完全包含在虛擬地址中的虛擬偏移量中。緩存標記和PPN相等(當然第一種)當查詢緩存時也執行TLB訪問,它是當前處理器最常見的設計,我們知道緩存使用的是物理地址,而CPU產生的是虛擬地址,這也就意味着沒有TLB就無法完成緩存查找。前面我們瞭解到緩存數據存儲結構存在直接映射、組相聯、全相聯三種結構,在此種緩存架構中有使用限制,我們首先來看看直接映射。

並行訪問的本質在於緩存查詢數據無需等待TLB完成,二者可同時開始,所以當兩者訪問完成後需要進行比較,如果(cache size <=  page size)即(C = L + b) <= P纔有效,因爲對於緩存的所有輸入都無需進行任何翻譯。

通過組相聯增加了緩存的關聯性從而減少索引到緩存所需地址的位數,在訪問完成後進行比較,如果(cache size) / (associativity) ≤ page size即(C <= P + A)纔有效。對於緩存和TLB都採用的組相聯從而減少缺失率,所以對於並行訪問中的緩存組相聯映射必須滿足(cache size) / (associativity) ≤ page size。那麼問題來了,如果一個緩存大小爲64KB,採用2路相聯,頁大小>=4k,那麼可以進行並行訪問TLB & Cache嗎?很顯然不能,如下

緩存大小:64KB = 2 16  -------------》 C = 16

組相聯:2                 -------------》 A = 1

頁大小: 4KB = 2 12 --------------》P >= 12

那麼問題又來了,對於一個16位的虛擬地址,頁大小爲64字節,緩存大小爲256b,採用8路相聯的1級緩存且有16塊,那麼可以並行訪問TLB &Cache嗎?請輸出原因。

總結

本節我們詳細介紹了TLB &Cache二者的關係,採用並行訪問通過VPN查找TLB,VPO查詢緩存同時進行來提高訪問速度。下一節我們進入頁表數據結構的詳細講解,謝謝。

相關文章