端到端的地址翻译(虚拟地址是怎样取到相应高速缓存的数据的?)
生活随笔
收集整理的這篇文章主要介紹了
端到端的地址翻译(虚拟地址是怎样取到相应高速缓存的数据的?)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【0】寫在前面-為什么需要虛擬存儲器?
0.1)定義:虛擬存儲器其實(shí)就是借用了磁盤地址空間,還記得當(dāng)初我們安裝CentOS,劃分的swap 文件系統(tǒng)嗎?
0.2)VM簡化了鏈接和加載、代碼和數(shù)據(jù)共享,以及應(yīng)用程序的存儲器分配:(摘自CSAPP)
- (1) 簡化鏈接: 每個(gè)進(jìn)程都擁有獨(dú)立的虛擬地址空間, 且空間范圍一致;(它是可重定向目標(biāo)文件使用相對物理地址的前提)
- (2) 簡化加載: 加載器從不實(shí)際拷貝任何數(shù)據(jù)從磁盤到存儲器。每個(gè)頁初次被調(diào)用哦時(shí), 要么是CPU取指時(shí)引用, 要么是一條正在執(zhí)行的指令引用一個(gè)存儲器位置時(shí)引用,VM系統(tǒng)會按需自動調(diào)入數(shù)據(jù)頁;
- (3) 簡化共享: 多個(gè)虛擬頁面可以映射到同一個(gè)共享物理頁面上;
- (4) 簡化存儲器分配: 當(dāng)需要額外的堆空間, os分配連續(xù)的虛擬存儲器頁面,這些VP可以映射都任意的物理頁面,這些物理頁面可以任意分散在存儲器中;
0.3)我還想多問一句,為什么有了高速緩存,還需要TLB-translation lookaside buffer,翻譯后備緩沖器呢?
Reason:
引入局部性原則: (摘自CSAPP)
局部性原則保證了在任意時(shí)刻, 程序?qū)⑼谝粋€(gè)較小的活動頁面集合上工作,這個(gè)集合 叫做工作集(working set)或者常駐集(resident set)。換句話說, 局部性原則揭示了一個(gè)現(xiàn)象:在一段時(shí)間內(nèi),我們會反復(fù)調(diào)入或調(diào)入同一個(gè)或 幾個(gè)虛擬頁頁面;而且,每次CPU產(chǎn)生一個(gè)VA時(shí), MMU就必須查閱PTE, 以便將VA翻譯為PA, 注意是每次,所以開銷很大;解決方法: 為了消除這樣的開銷,在MMU中包括了一個(gè)關(guān)于PTE的小緩存,稱為翻譯后備緩沖器;
關(guān)鍵點(diǎn): 所有的地址翻譯步驟都是在芯片上的MMU中執(zhí)行的, 因此執(zhí)行速度非常快;
你要知道計(jì)算機(jī)中共有7級存儲結(jié)構(gòu),訪問CPU中的存儲空間(MMU)的速度比訪問緩存的速度可是快了幾個(gè)數(shù)量級的。
【1】說了這么多,看個(gè)荔枝(以下TLB + 頁表 + 高速緩存 是我們手動模擬的)(圖片摘自CSAPP):
【2】題目:說有虛擬地址 0x03d7, 虛擬存儲器系統(tǒng)如何將其翻譯成物理地址和訪問緩存的。
【3】解答:將以上虛擬地址用二進(jìn)制表示,如下:
我們看到: VPN=bit13~bit6 =0x0f; VPO=bit5~bit0 = 0x17; TLBT(行索引or標(biāo)記)=bit13~bit8=0x03; (這里,為什么我管標(biāo)記叫做行索引,說到本質(zhì),叫其行索引,并沒有什么不妥, 因?yàn)楸緦?shí)例中,cache采用的是直接映射,即每個(gè)組就只有一行,所以行索引在此處無意; 但若cache是采用組相聯(lián)映射或全相聯(lián)映射的話,每組就有多行,行索引就起到作用了);TLBI(組索引)=bit7~bit6=0x3;相關(guān)聲明declaration寫在前面:
- d1) 我們這里是考慮命中的情況,當(dāng)然,如果不命中, MMU需要從主存中取出相應(yīng)的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,發(fā)現(xiàn)第3組, 有標(biāo)記位03(當(dāng)然,這是手動設(shè)置的,便于模擬),且有效位=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;即得到了緩存標(biāo)記CT=0x0d,緩存組索引CI=0x5,緩存偏移CO=0x3;
- (7) 依據(jù)CT、CI、CO,查詢高速緩存(c圖), 第5組的標(biāo)記位-0x0D, 故命中;
- (8) 在看緩存偏移是0x3,所以取出塊3字節(jié)0x1D;
(Attention)
對于CT + CI + CO, 我再說的明白一點(diǎn): CT就是行索引, CI就是組索引, CO就是塊索引;
Bingo!
總結(jié)
以上是生活随笔為你收集整理的端到端的地址翻译(虚拟地址是怎样取到相应高速缓存的数据的?)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux递归创建目录命令(linux
- 下一篇: 什么是上市辅导备案登记(辅导备案登记受理