徹底搞懂虛擬地址翻譯為物理地址的過程

現代的作業系統將可執行檔案載入後,建立了程序,程序中每一條指令和資料都被分配了一個虛擬地址,CPU獲取到這個虛擬地址後,需要翻譯成記憶體的物理地址後,才能訪問指令和資料,本片文章闡述的重點就是虛擬地址翻譯物理地址的流程和實踐,因此分成2部分闡述

1。虛擬地址翻譯物理地址的流程?

2。舉一個例子實踐下?

虛擬地址翻譯物理地址的流程?

當CPU第一次訪問虛擬地址時

,虛擬地址所在的虛擬頁不在記憶體中,虛擬頁表項(PTE)也不在TLB中,因此需要執行的步驟比較多,如下圖

徹底搞懂虛擬地址翻譯為物理地址的過程

第一次訪問虛擬地址

1.

處理器將

虛擬地址(VA)

送往

MMU

(記憶體管理單元)

徹底搞懂虛擬地址翻譯為物理地址的過程

虛擬地址格式

如上圖所示,虛擬地址長度為n,虛擬頁偏移量長度為p。

2.MMU

獲取虛擬地址中的

虛擬頁號

(VPN),然後將虛擬頁號傳送給

TLB

(翻譯後備緩衝器),

TLB

根據虛擬頁號從

TLB對映表

中查詢

PTE

(頁表項即Page Table Entry)。

徹底搞懂虛擬地址翻譯為物理地址的過程

PTE(頁表項)

3.TLB

(翻譯後備緩衝器)將查詢結果返回給

MMU

(記憶體管理單元)

4.MMU

(記憶體管理單元)分析查詢結果是否有

PTE

(頁表項),發現

PTE

為空,沒有命中,因此

MMU

根據

頁表基址暫存器(PTBR)

中的頁表起始地址加上

虛擬頁號

(VPN),得出虛擬頁頁表項的物理地址

PTEA(即Page Table Entry Address)

,然後將這個物理地址送往

高速緩衝(L1)

5

高速緩衝(L1)

根據

PTEA

查詢內部的緩衝對映表,發現沒有找到PTEA對映的內容即PTE(頁表項),然後向記憶體請求

PTEA

下的內容。

6

。記憶體將

PTEA

下的內容

PTE

,傳送給高速緩衝(L1),高速緩衝(L1)建立了PTEA和PTE的對映關係。

7

。高速緩衝(L1)再次根據PTEA查詢內部的緩衝對映表,這次找到了,然後將PTE傳送給

TLB

8~9

TLB

收到了

PTE

後,建立了

虛擬頁號

(VPN)和PTE的對映(8),然後將PTE傳送給

MMU

10

MMU

收到了

PTE

後,檢查PTE的有效位,看看虛擬頁是否在記憶體中。

11

MMU

檢查

PTE

後,發現虛擬頁不在記憶體中,因此傳送缺頁中斷給CPU,CPU開始執行缺頁中斷處理程式。

12

。缺頁中斷處理程式根據頁面置換演算法,選擇出一個已經緩衝的虛擬頁作為犧牲頁(如果這個虛擬頁發生了變化,則更新到磁碟中),將這個犧牲頁的

PTE

的有效位設定為0,表明這個犧牲頁不在記憶體了。

13

。缺頁中斷處理程式將缺少的頁,從磁碟換入到空閒的物理記憶體中,設定缺少的虛擬頁的PTE的有效位為1,更新物理號。

14

。缺頁中斷處理程式執行完畢,跳轉到發生缺頁的指令處,然後CPU重新執行該指令,重新發出虛擬地址到MMU,跳到了1,開啟下一個迴圈。

當CPU第二次訪問同一個虛擬地址時

,虛擬地址所在的虛擬頁已經記憶體中,虛擬頁表項(PTE)也在TLB中了,因此需要執行的步驟少了很多,如下圖

徹底搞懂虛擬地址翻譯為物理地址的過程

第二次訪問虛擬地址

1.

處理器將

虛擬地址(VA)

送往

MMU

(記憶體管理單元)

2.MMU

獲取虛擬地址中的

虛擬頁號

(VPN),然後將虛擬頁號傳送給

TLB

(翻譯後備緩衝器),

TLB

根據虛擬頁號從

TLB對映表

中查詢

PTE

(頁表項即Page Table Entry)。

3.TLB

(翻譯後備緩衝器)將查詢結果返回給

MMU

(記憶體管理單元)

4.MMU

(記憶體管理單元)分析查詢結果是否有

PTE

(頁表項),發現

PTE

有值,命中了,然後檢查PTE的有效位,發現有效位是1,因此不缺頁,根據PTE中的物理號加上虛擬地址中的(VPO)計算出指令或者資料的物理地址PA,將PA傳送到高速緩衝(L1)

5

高速緩衝(L1)

根據

PA

查詢內部的緩衝對映表,發現沒有找到PA對映的內容即指令或者資料,然後向記憶體請求

PA

下的內容。

6

。記憶體將

PA

下的內容,傳送給高速緩衝(L1),高速緩衝(L1)建立了PA和內容的對映關係。

7

。高速緩衝(L1)再次根據PA查詢內部的緩衝對映表,這次找到了,然後將程式碼或者指令傳送到資料匯流排,CPU收到資料匯流排的資料後,感嘆道,終於拿到資料了。

當CPU第三次訪問同一個虛擬地址時,與第二次不同的是,因為虛擬地址對應的物理地址的資料,已經對映到高速緩衝(L1),所以不再從記憶體中查詢。

好了,虛擬地址翻譯物理地址的整個過程闡述完畢,下面來舉個具體的例子來實踐下!

舉一個例子實踐

上一節是虛擬地址翻譯物理地址的過程,現在實踐下,實踐前先普及兩個概念TLB和高速緩衝。

TLB

TLB全稱叫做翻譯後備緩衝器,這是一個對映表,它建立了虛擬頁號(VPN)和頁表項(PTE)的對映關係,每次訪問虛擬地址時,都需要找這個虛擬地址對應的頁表項,每次都去記憶體中查需要耗費幾十個甚至上百個的時鐘週期,雖然頁表項緩衝在高速緩衝後,耗費的週期可以降到1-2個週期,但是緩衝在TLB後,幾乎不用耗費時鐘週期,它跟CPU幾乎是同步的,類似於暫存器。

那麼,虛擬地址怎麼透過TLB對映頁表項(PTE)呢,先來看看TLB,我們說TLB就是一個對映表,先來看看這個對映表長什麼樣,如下圖

徹底搞懂虛擬地址翻譯為物理地址的過程

如上圖所示,一個TLB由m個

TLB組

構成,每個TLB組下有個n個條目,每個條目裡有PTE和標記位構成。

標記位是一個數字,每個TLB組的標記位不能重複,所以一個TLB組裡,可以根據這個標記位定位到某個條目。

每個組都有一個唯一的編號叫做組號。

因此這麼看,TLB就是一個二維陣列,知道了組號和標記位就可以定位到唯一的PTE(頁表項)。

虛擬地址中的虛擬頁號(VPN)可以拆分成兩部分即組號和標記位,假設一個n位長度的虛擬地址,如下圖

徹底搞懂虛擬地址翻譯為物理地址的過程

虛擬地址中的TLB部分

由上圖得知,VPN由標記位(TLBT)和組號又叫標記索引(TLBI)構成,組號佔t位,標記位佔了虛擬頁號剩餘的位。

假如一個TLB有4組,總共有64個條目,每組就有16個條目,那麼VPN中的組號就佔用2位(2的2次方=4),標記位就佔用4位(2的4次方=16)。

高速緩衝

高速緩衝通常採用SRAM(靜態隨機訪問儲存器)進行儲存,它比記憶體DRAM(動態隨機訪問儲存器)快上幾十甚至上百倍,因此為了加速CPU獲取資料的速度,最近訪問的資料儲存在高速緩衝中。

高速緩衝內部有一張對映表,這張對映表建立記憶體物理地址PA和該記憶體物理地址下內容的對映關係,如下圖所示

徹底搞懂虛擬地址翻譯為物理地址的過程

高速緩衝對映表

如上圖所示,對映表分為m個組,每個組由標記位,有效位,和n個塊組成,有效位為1表示該緩衝沒過期,為0表示該緩衝過期了。

一個物理地址由組號+標記位+塊號構成,如下圖所示

徹底搞懂虛擬地址翻譯為物理地址的過程

物理地址的構成

由上圖得知,物理地址為m位,塊號佔用p位,組號佔用t為,剩下的位就是標記位佔用的位數。

我們可以根據物理地址的組號定位到對映表的一個組,然後看看這個組下的有效位是不是為1,如果不為1,那麼表示這一組的內容都無效了,沒有必要比較下去了,因此緩衝沒有命中,如果為1呢,那麼比較這個組下的標記位和物理地址中標記位,如果不相等,那就是沒有命中,如果相等呢,則繼續根據物理地址中的塊號去這個組相應的塊號下找,如果找到資料,則表示命中了,否則緩衝沒有命中。

假設一個高速緩衝有16個組,每個組有4個塊,那麼物理地址當中組號佔用的空間就是4位(2的4次方等於16),塊號佔用的位數就是2位(2的2次方等於4),剩餘的位數就是標記位佔用的位數。

好了,概念普及完了,下面正式開始舉例

先假設

1。記憶體是按位元組定址,每個字是一個位元組(通常對於32位的系統一個字是4個位元組)。

2。虛擬地址長度為14位,假設頁表有256個頁表項,因此虛擬頁號(VPN)佔用位數為8,虛擬一偏移量(VPO)佔用6位。

3。物理地址長度為12位。

4。頁面大小為64個位元組(P=64)

5。TLB有4個組,每個組4個條目,總共16個條目組成

6。高速緩衝(L1)有16個組,每個組有4個塊。

7。採用一級頁表(多級頁表複雜些,但原理類似)。

先看看虛擬地址和物理地址的格式,如下圖:

徹底搞懂虛擬地址翻譯為物理地址的過程

虛擬地址

由上圖得知,組號(TLBI)佔用2位,因為我們假設TLB有4個組,標記位佔用6位。

徹底搞懂虛擬地址翻譯為物理地址的過程

物理地址

由上圖得知,組號(CI)佔用4位,因為我們假設高速緩衝有16個組,每個組下有4個塊,因此塊號(CO)佔用2位,剩下的6位就是標記位(CT)。

我們假定TLB,高速緩衝對映表如下圖:

徹底搞懂虛擬地址翻譯為物理地址的過程

TLB對映表

徹底搞懂虛擬地址翻譯為物理地址的過程

高速緩衝對映表

頁表總共有256項,我們把前16項列出,如下圖

徹底搞懂虛擬地址翻譯為物理地址的過程

頁表前16項

好了,一切就緒,假設CPU訪問的虛擬地址是0x03d4,它的二進位制是16位即

00000011 11010100

,而虛擬地址只有14位,所以高2位被拋棄,如下圖

徹底搞懂虛擬地址翻譯為物理地址的過程

0x03d4虛擬地址分佈圖

由上圖得知,組號(TLBI)為11即0x03,標記位(TLBT)為000011即0x03,從TLB對映表查詢,發現命中了,如下圖

徹底搞懂虛擬地址翻譯為物理地址的過程

TLB命中

由上圖命中了紅色部分的標記位,PTE中的PPN=0x0D,有效位為1,我們根據PPN然後在加上虛擬頁偏移量,如下圖

徹底搞懂虛擬地址翻譯為物理地址的過程

虛擬地址

由上圖,我們得知虛擬頁偏移量(VPO)為010100=0x14,虛擬頁偏移量(VPO)=物理頁偏移量(PPO),即PPO=0x14,PPN和PPO連線起來就是物理地址PA即001101010100=0x354,如下圖

徹底搞懂虛擬地址翻譯為物理地址的過程

物理地址

由上圖得知,組號是0101即0x05,塊號(CO)為00即0x00,標記位為001101即0x0D,透過組號+標記位+塊號,可以定位到高速緩衝的資料0x36,如下圖所示

徹底搞懂虛擬地址翻譯為物理地址的過程

物理地址命中資料

物理地址對應的資料找到了,返回給了CPU,當然也可能發生其他的情況,如TLB未命中,高速緩衝未命中,缺頁等,這些讀者可以自行實踐。

好了,虛擬地址翻譯物理的過程和實踐,介紹完了,談下一個話題。