現(xiàn)代的操作系統(tǒng)將可執(zhí)行文件加載后,創(chuàng)建了進(jìn)程,進(jìn)程中每一條指令和數(shù)據(jù)都被分配了一個(gè)虛擬地址,CPU獲取到這個(gè)虛擬地址后,需要翻譯成內(nèi)存的物理地址后,才能訪問(wèn)指令和數(shù)據(jù),本片文章闡述的重點(diǎn)就是虛擬地址翻譯物理地址的流程和實(shí)踐,因此分成2部分闡述
1.虛擬地址翻譯物理地址的流程?
2.舉一個(gè)例子實(shí)踐下?
1、虛擬地址翻譯物理地址的流程?
當(dāng)CPU第一次訪問(wèn)虛擬地址時(shí),虛擬地址所在的虛擬頁(yè)不在內(nèi)存中,虛擬頁(yè)表項(xiàng)(PTE)也不在TLB中,因此需要執(zhí)行的步驟比較多,如下圖
第一次訪問(wèn)虛擬地址
1.處理器將虛擬地址(VA)送往MMU(內(nèi)存管理單元)
虛擬地址格式
如上圖所示,虛擬地址長(zhǎng)度為n,虛擬頁(yè)偏移量長(zhǎng)度為p。
2.MMU獲取虛擬地址中的虛擬頁(yè)號(hào)(VPN),然后將虛擬頁(yè)號(hào)發(fā)送給TLB(翻譯后備緩沖器),TLB根據(jù)虛擬頁(yè)號(hào)從TLB映射表中查詢PTE(頁(yè)表項(xiàng)即Page Table Entry)。
PTE(頁(yè)表項(xiàng))
3.TLB(翻譯后備緩沖器)將查詢結(jié)果返回給MMU(內(nèi)存管理單元)
4.MMU(內(nèi)存管理單元)分析查詢結(jié)果是否有PTE(頁(yè)表項(xiàng)),發(fā)現(xiàn)PTE為空,沒(méi)有命中,因此MMU根據(jù)頁(yè)表基址寄存器(PTBR)中的頁(yè)表起始地址加上虛擬頁(yè)號(hào)(VPN),得出虛擬頁(yè)頁(yè)表項(xiàng)的物理地址PTEA(即Page Table Entry Address),然后將這個(gè)物理地址送往高速緩沖(L1)。
5.高速緩沖(L1)根據(jù)PTEA查詢內(nèi)部的緩沖映射表,發(fā)現(xiàn)沒(méi)有找到PTEA映射的內(nèi)容即PTE(頁(yè)表項(xiàng)),然后向內(nèi)存請(qǐng)求PTEA下的內(nèi)容。
6.內(nèi)存將PTEA下的內(nèi)容PTE,發(fā)送給高速緩沖(L1),高速緩沖(L1)建立了PTEA和PTE的映射關(guān)系。
7.高速緩沖(L1)再次根據(jù)PTEA查詢內(nèi)部的緩沖映射表,這次找到了,然后將PTE發(fā)送給TLB。
8~9.TLB收到了PTE后,建立了虛擬頁(yè)號(hào)(VPN)和PTE的映射(8),然后將PTE發(fā)送給MMU。
10.MMU收到了PTE后,檢查PTE的有效位,看看虛擬頁(yè)是否在內(nèi)存中。
11.MMU檢查PTE后,發(fā)現(xiàn)虛擬頁(yè)不在內(nèi)存中,因此發(fā)送缺頁(yè)中斷給CPU,CPU開(kāi)始執(zhí)行缺頁(yè)中斷處理程序。
12.缺頁(yè)中斷處理程序根據(jù)頁(yè)面置換算法,選擇出一個(gè)已經(jīng)緩沖的虛擬頁(yè)作為犧牲頁(yè)(如果這個(gè)虛擬頁(yè)發(fā)生了變化,則更新到磁盤(pán)中),將這個(gè)犧牲頁(yè)的PTE的有效位設(shè)置為0,表明這個(gè)犧牲頁(yè)不在內(nèi)存了。
13.缺頁(yè)中斷處理程序?qū)⑷鄙俚捻?yè),從磁盤(pán)換入到空閑的物理內(nèi)存中,設(shè)置缺少的虛擬頁(yè)的PTE的有效位為1,更新物理號(hào)。
14.缺頁(yè)中斷處理程序執(zhí)行完畢,跳轉(zhuǎn)到發(fā)生缺頁(yè)的指令處,然后CPU重新執(zhí)行該指令,重新發(fā)出虛擬地址到MMU,跳到了1,開(kāi)啟下一個(gè)循環(huán)。
當(dāng)CPU第二次訪問(wèn)同一個(gè)虛擬地址時(shí),虛擬地址所在的虛擬頁(yè)已經(jīng)內(nèi)存中,虛擬頁(yè)表項(xiàng)(PTE)也在TLB中了,因此需要執(zhí)行的步驟少了很多,如下圖
第二次訪問(wèn)虛擬地址
1.處理器將虛擬地址(VA)送往MMU(內(nèi)存管理單元)
2.MMU獲取虛擬地址中的虛擬頁(yè)號(hào)(VPN),然后將虛擬頁(yè)號(hào)發(fā)送給TLB(翻譯后備緩沖器),TLB根據(jù)虛擬頁(yè)號(hào)從TLB映射表中查詢PTE(頁(yè)表項(xiàng)即Page Table Entry)。
3.TLB(翻譯后備緩沖器)將查詢結(jié)果返回給MMU(內(nèi)存管理單元)
4.MMU(內(nèi)存管理單元)分析查詢結(jié)果是否有PTE(頁(yè)表項(xiàng)),發(fā)現(xiàn)PTE有值,命中了,然后檢查PTE的有效位,發(fā)現(xiàn)有效位是1,因此不缺頁(yè),根據(jù)PTE中的物理號(hào)加上虛擬地址中的(VPO)計(jì)算出指令或者數(shù)據(jù)的物理地址PA,將PA發(fā)送到高速緩沖(L1)
5.高速緩沖(L1)根據(jù)PA查詢內(nèi)部的緩沖映射表,發(fā)現(xiàn)沒(méi)有找到PA映射的內(nèi)容即指令或者數(shù)據(jù),然后向內(nèi)存請(qǐng)求PA下的內(nèi)容。
6.內(nèi)存將PA下的內(nèi)容,發(fā)送給高速緩沖(L1),高速緩沖(L1)建立了PA和內(nèi)容的映射關(guān)系。
7.高速緩沖(L1)再次根據(jù)PA查詢內(nèi)部的緩沖映射表,這次找到了,然后將代碼或者指令發(fā)送到數(shù)據(jù)總線,CPU收到數(shù)據(jù)總線的數(shù)據(jù)后,感嘆道,終于拿到數(shù)據(jù)了。
當(dāng)CPU第三次訪問(wèn)同一個(gè)虛擬地址時(shí),與第二次不同的是,因?yàn)樘摂M地址對(duì)應(yīng)的物理地址的數(shù)據(jù),已經(jīng)映射到高速緩沖(L1),所以不再?gòu)膬?nèi)存中查詢。
好了,虛擬地址翻譯物理地址的整個(gè)過(guò)程闡述完畢,下面來(lái)舉個(gè)具體的例子來(lái)實(shí)踐下!
2、舉一個(gè)例子實(shí)踐
上一節(jié)是虛擬地址翻譯物理地址的過(guò)程,現(xiàn)在實(shí)踐下,實(shí)踐前先普及兩個(gè)概念TLB和高速緩沖。
TLB
TLB全稱(chēng)叫做翻譯后備緩沖器,這是一個(gè)映射表,它建立了虛擬頁(yè)號(hào)(VPN)和頁(yè)表項(xiàng)(PTE)的映射關(guān)系,每次訪問(wèn)虛擬地址時(shí),都需要找這個(gè)虛擬地址對(duì)應(yīng)的頁(yè)表項(xiàng),每次都去內(nèi)存中查需要耗費(fèi)幾十個(gè)甚至上百個(gè)的時(shí)鐘周期,雖然頁(yè)表項(xiàng)緩沖在高速緩沖后,耗費(fèi)的周期可以降到1-2個(gè)周期,但是緩沖在TLB后,幾乎不用耗費(fèi)時(shí)鐘周期,它跟CPU幾乎是同步的,類(lèi)似于寄存器。
那么,虛擬地址怎么通過(guò)TLB映射頁(yè)表項(xiàng)(PTE)呢,先來(lái)看看TLB,我們說(shuō)TLB就是一個(gè)映射表,先來(lái)看看這個(gè)映射表長(zhǎng)什么樣,如下圖
如上圖所示,一個(gè)TLB由m個(gè)TLB組構(gòu)成,每個(gè)TLB組下有個(gè)n個(gè)條目,每個(gè)條目里有PTE和標(biāo)記位構(gòu)成。
標(biāo)記位是一個(gè)數(shù)字,每個(gè)TLB組的標(biāo)記位不能重復(fù),所以一個(gè)TLB組里,可以根據(jù)這個(gè)標(biāo)記位定位到某個(gè)條目。
每個(gè)組都有一個(gè)唯一的編號(hào)叫做組號(hào)。
因此這么看,TLB就是一個(gè)二維數(shù)組,知道了組號(hào)和標(biāo)記位就可以定位到唯一的PTE(頁(yè)表項(xiàng))。
虛擬地址中的虛擬頁(yè)號(hào)(VPN)可以拆分成兩部分即組號(hào)和標(biāo)記位,假設(shè)一個(gè)n位長(zhǎng)度的虛擬地址,如下圖
虛擬地址中的TLB部分
由上圖得知,VPN由標(biāo)記位(TLBT)和組號(hào)又叫標(biāo)記索引(TLBI)構(gòu)成,組號(hào)占t位,標(biāo)記位占了虛擬頁(yè)號(hào)剩余的位。
假如一個(gè)TLB有4組,總共有64個(gè)條目,每組就有16個(gè)條目,那么VPN中的組號(hào)就占用2位(2的2次方=4),標(biāo)記位就占用4位(2的4次方=16)。
高速緩沖
高速緩沖通常采用SRAM(靜態(tài)隨機(jī)訪問(wèn)存儲(chǔ)器)進(jìn)行存儲(chǔ),它比內(nèi)存DRAM(動(dòng)態(tài)隨機(jī)訪問(wèn)存儲(chǔ)器)快上幾十甚至上百倍,因此為了加速CPU獲取數(shù)據(jù)的速度,最近訪問(wèn)的數(shù)據(jù)存儲(chǔ)在高速緩沖中。
高速緩沖內(nèi)部有一張映射表,這張映射表建立內(nèi)存物理地址PA和該內(nèi)存物理地址下內(nèi)容的映射關(guān)系,如下圖所示
高速緩沖映射表
如上圖所示,映射表分為m個(gè)組,每個(gè)組由標(biāo)記位,有效位,和n個(gè)塊組成,有效位為1表示該緩沖沒(méi)過(guò)期,為0表示該緩沖過(guò)期了。
一個(gè)物理地址由組號(hào)+標(biāo)記位+塊號(hào)構(gòu)成,如下圖所示
物理地址的構(gòu)成
由上圖得知,物理地址為m位,塊號(hào)占用p位,組號(hào)占用t為,剩下的位就是標(biāo)記位占用的位數(shù)。
我們可以根據(jù)物理地址的組號(hào)定位到映射表的一個(gè)組,然后看看這個(gè)組下的有效位是不是為1,如果不為1,那么表示這一組的內(nèi)容都無(wú)效了,沒(méi)有必要比較下去了,因此緩沖沒(méi)有命中,如果為1呢,那么比較這個(gè)組下的標(biāo)記位和物理地址中標(biāo)記位,如果不相等,那就是沒(méi)有命中,如果相等呢,則繼續(xù)根據(jù)物理地址中的塊號(hào)去這個(gè)組相應(yīng)的塊號(hào)下找,如果找到數(shù)據(jù),則表示命中了,否則緩沖沒(méi)有命中。
假設(shè)一個(gè)高速緩沖有16個(gè)組,每個(gè)組有4個(gè)塊,那么物理地址當(dāng)中組號(hào)占用的空間就是4位(2的4次方等于16),塊號(hào)占用的位數(shù)就是2位(2的2次方等于4),剩余的位數(shù)就是標(biāo)記位占用的位數(shù)。
好了,概念普及完了,下面正式開(kāi)始舉例
先假設(shè)
1.內(nèi)存是按字節(jié)尋址,每個(gè)字是一個(gè)字節(jié)(通常對(duì)于32位的系統(tǒng)一個(gè)字是4個(gè)字節(jié))。
2.虛擬地址長(zhǎng)度為14位,假設(shè)頁(yè)表有256個(gè)頁(yè)表項(xiàng),因此虛擬頁(yè)號(hào)(VPN)占用位數(shù)為8,虛擬一偏移量(VPO)占用6位。
3.物理地址長(zhǎng)度為12位。
4.頁(yè)面大小為64個(gè)字節(jié)(P=64)
5.TLB有4個(gè)組,每個(gè)組4個(gè)條目,總共16個(gè)條目組成
6.高速緩沖(L1)有16個(gè)組,每個(gè)組有4個(gè)塊。
7.采用一級(jí)頁(yè)表(多級(jí)頁(yè)表復(fù)雜些,但原理類(lèi)似)。
先看看虛擬地址和物理地址的格式,如下圖:
虛擬地址
由上圖得知,組號(hào)(TLBI)占用2位,因?yàn)槲覀兗僭O(shè)TLB有4個(gè)組,標(biāo)記位占用6位。
物理地址
由上圖得知,組號(hào)(CI)占用4位,因?yàn)槲覀兗僭O(shè)高速緩沖有16個(gè)組,每個(gè)組下有4個(gè)塊,因此塊號(hào)(CO)占用2位,剩下的6位就是標(biāo)記位(CT)。
我們假定TLB,高速緩沖映射表如下圖:
TLB映射表
高速緩沖映射表
頁(yè)表總共有256項(xiàng),我們把前16項(xiàng)列出,如下圖
頁(yè)表前16項(xiàng)
好了,一切就緒,假設(shè)CPU訪問(wèn)的虛擬地址是0x03d4,它的二進(jìn)制是16位即00000011 11010100,而虛擬地址只有14位,所以高2位被拋棄,如下圖
0x03d4虛擬地址分布圖
由上圖得知,組號(hào)(TLBI)為11即0x03,標(biāo)記位(TLBT)為000011即0x03,從TLB映射表查找,發(fā)現(xiàn)命中了,如下圖
TLB命中
由上圖命中了紅色部分的標(biāo)記位,PTE中的PPN=0x0D,有效位為1,我們根據(jù)PPN然后在加上虛擬頁(yè)偏移量,如下圖
虛擬地址
由上圖,我們得知虛擬頁(yè)偏移量(VPO)為010100=0x14,虛擬頁(yè)偏移量(VPO)=物理頁(yè)偏移量(PPO),即PPO=0x14,PPN和PPO連接起來(lái)就是物理地址PA即001101010100=0x354,如下圖
物理地址
由上圖得知,組號(hào)是0101即0x05,塊號(hào)(CO)為00即0x00,標(biāo)記位為001101即0x0D,通過(guò)組號(hào)+標(biāo)記位+塊號(hào),可以定位到高速緩沖的數(shù)據(jù)0x36,如下圖所示
物理地址命中數(shù)據(jù)
物理地址對(duì)應(yīng)的數(shù)據(jù)找到了,返回給了CPU,當(dāng)然也可能發(fā)生其他的情況,如TLB未命中,高速緩沖未命中,缺頁(yè)等,這些讀者可以自行實(shí)踐。
審核編輯:劉清
-
處理器
+關(guān)注
關(guān)注
68文章
19896瀏覽量
235266 -
緩沖器
+關(guān)注
關(guān)注
6文章
2056瀏覽量
47032 -
虛擬機(jī)
+關(guān)注
關(guān)注
1文章
966瀏覽量
29369 -
TLB電路
+關(guān)注
關(guān)注
0文章
9瀏覽量
5343 -
MMU
+關(guān)注
關(guān)注
0文章
92瀏覽量
18753
原文標(biāo)題:虛擬地址翻譯物理地址的流程終于搞懂了~
文章出處:【微信號(hào):嵌入式情報(bào)局,微信公眾號(hào):嵌入式情報(bào)局】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
操作系統(tǒng)中的邏輯地址和物理地址
請(qǐng)問(wèn)ARM虛擬地址 物理地址 加載地址 運(yùn)行地址的聯(lián)系是什么?
為什么MMU的地址映射中物理地址會(huì)跳變?
【HarmonyOS】虛擬地址<->物理地址是如何映射的
物理地址到虛擬地址的轉(zhuǎn)換步驟
請(qǐng)問(wèn)大佬rt_malloc申請(qǐng)的動(dòng)態(tài)內(nèi)存返回的是虛擬地址還是物理地址
RT-Thread smart內(nèi)存虛擬地址到物理地址的轉(zhuǎn)換是一個(gè)什么樣的流程
用戶態(tài)得到虛擬地址對(duì)應(yīng)的物理地址

鴻蒙內(nèi)核中虛擬地址與物理地址之間是如何映射的

虛擬地址物理地址等眾多地址及MMU相關(guān)知識(shí)

為什么要用MMU?為什么要用虛擬地址?
Linux虛擬地址空間和物理地址空間的關(guān)系

評(píng)論