端到端的地址翻譯(虛擬地址是怎樣取到相應快取記憶體的資料的?)

發表於2015-09-15

【0】寫在前面-為什麼需要虛擬儲存器?

0.1)定義:虛擬儲存器其實就是借用了磁碟地址空間,還記得當初我們安裝CentOS,劃分的swap 檔案系統嗎?

0.2)VM簡化了連結和載入、程式碼和資料共享,以及應用程式的儲存器分配:(摘自CSAPP)

(1) 簡化連結: 每個程式都擁有獨立的虛擬地址空間, 且空間範圍一致;(它是可重定向目標檔案使用相對實體地址的前提)
(2) 簡化載入: 載入器從不實際拷貝任何資料從磁碟到儲存器。每個頁初次被呼叫哦時, 要麼是CPU取指時引用, 要麼是一條正在執行的指令引用一個儲存器位置時引用,VM系統會按需自動調入資料頁;
(3) 簡化共享: 多個虛擬頁面可以對映到同一個共享物理頁面上;
(4) 簡化儲存器分配: 當需要額外的堆空間, os分配連續的虛擬儲存器頁面,這些VP可以對映都任意的物理頁面,這些物理頁面可以任意分散在儲存器中;

0.3)我還想多問一句,為什麼有了快取記憶體,還需要TLB-translation lookaside buffer,翻譯後備緩衝器呢?

Reason:

引入區域性性原則: (摘自CSAPP)

區域性性原則保證了在任意時刻, 程式將往往在一個較小的活動頁面集合上工作,這個集合
叫做工作集(working set)或者常駐集(resident set)。

換句話說, 區域性性原則揭示了一個現象:在一段時間內,我們會反覆調入或調入同一個或
幾個虛擬頁頁面;而且,每次CPU產生一個VA時, MMU就必須查閱PTE,
以便將VA翻譯為PA, 注意是每次,所以開銷很大;
解決方法: 為了消除這樣的開銷,在MMU中包括了一個關於PTE的小快取,稱為翻譯後備緩衝器;

關鍵點: 所有的地址翻譯步驟都是在晶片上的MMU中執行的, 因此執行速度非常快;

你要知道計算機中共有7級儲存結構,訪問CPU中的儲存空間(MMU)的速度比訪問快取的速度可是快了幾個數量級的。

【1】說了這麼多,看個荔枝(以下TLB + 頁表 + 快取記憶體 是我們手動模擬的)(圖片摘自CSAPP):


【2】題目:說有虛擬地址 0x03d7, 虛擬儲存器系統如何將其翻譯成實體地址和訪問快取的。

【3】解答:將以上虛擬地址用二進位制表示,如下:

我們看到:
VPN=bit13~bit6 =0x0f;
VPO=bit5~bit0 = 0x17;
TLBT(行索引or標記)=bit13~bit8=0x03;

(這裡,為什麼我管標記叫做行索引,說到本質,叫其行索引,並沒有什麼不妥,
因為本例項中,cache採用的是直接對映,即每個組就只有一行,所以行索引在此處無意;
但若cache是採用組相聯對映或全相聯對映的話,每組就有多行,行索引就起到作用了);

TLBI(組索引)=bit7~bit6=0x3;

相關宣告declaration寫在前面:

  • d1) 我們這裡是考慮命中的情況,當然,如果不命中, MMU需要從主存中取出相應的PTE;
  • d2) PS: 命中與否,是看TLB中是否有請求的PTE;
  • d3)虛擬地址14位,而實體地址12位;

翻譯過程: (乾貨)

(1) MMU(MMU存在於CPU中,是硬體)從虛擬地址中抽取VPN=0x0f;
(2) 再從VPN中抽取出TLBT(行索引)=0x03, TLBI(組索引)=0x3,用於索引翻譯後備儲存器TLB;
(3) 帶著TLBT和TLBI 檢視TLB,發現第3組, 有標記位03(當然,這是手動設定的,便於模擬),且有效位=1,故命中;
(4) 命中後,將PPN=0D返回給MMU;
(5) MMU將PPN=0x0D=bit11~bit6 和 虛擬地址的VPO=0x17=bit5~bit0 連線起來,形成實體地址PA 》》 0x357

(6) 如上圖所示:我們得到了CT-Cache Tag=0x0D, CI-Cache Index=0x5, CO-Cache Offset=0x3;即得到了快取標記CT=0x0d,快取組索引CI=0x5,快取偏移CO=0x3;
(7) 依據CT、CI、CO,查詢快取記憶體(c圖), 第5組的標記位-0x0D, 故命中;
(8) 在看快取偏移是0x3,所以取出塊3位元組0x1D;
(Attention)

對於CT + CI + CO, 我再說的明白一點: CT就是行索引, CI就是組索引, CO就是塊索引;

Bingo!

相關文章