1. 程式人生 > >讀懂作業系統之虛擬記憶體TLB與快取(cache)關係篇(四)

讀懂作業系統之虛擬記憶體TLB與快取(cache)關係篇(四)

前言

前面我們講到通過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(0x0916

= 2110)去頁表中查詢得到PPN(0x1716 = 2310),如下: 

 

因其PPO = VPO(0x15),所以計算出實體地址為(23 * 64+21 = 149310 = 0x5D516

然後根據上述實體地址劃分為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產生虛擬地址(0x7916 = 00011110012),此時通過並行訪問則為如下圖解

我們結合上述圖解繼續進行分析將並行訪問分為三種情況,比如上快取中的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 = 216     -------------》 C = 16

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

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

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

總結

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