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

作者: 大話 IT

現代的操作系統將可執行文件加載後,創建了進程,進程中每一條指令和數據都被分配了一個虛擬地址,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)。

  1. 高速緩衝 (L1) 根據 PTEA 查詢內部的緩衝映射表,發現沒有找到 PTEA 映射的內容即 PTE(頁表項),然後向內存請求 PTEA 下的內容。

  2. 內存將 PTEA 下的內容 PTE,發送給高速緩衝 (L1),高速緩衝(L1) 建立了 PTEA 和 PTE 的映射關係。

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

8~9.TLB 收到了 PTE 後,建立了虛擬頁號 (VPN) 和 PTE 的映射(8),然後將 PTE 發送給 MMU。

10.MMU 收到了 PTE 後,檢查 PTE 的有效位,看看虛擬頁是否在內存中。

11.MMU 檢查 PTE 後,發現虛擬頁不在內存中,因此發送缺頁中斷給 CPU,CPU 開始執行缺頁中斷處理程序。

  1. 缺頁中斷處理程序根據頁面置換算法,選擇出一個已經緩衝的虛擬頁作爲犧牲頁(如果這個虛擬頁發生了變化,則更新到磁盤中),將這個犧牲頁的 PTE 的有效位設置爲 0,表明這個犧牲頁不在內存了。

  2. 缺頁中斷處理程序將缺少的頁,從磁盤換入到空閒的物理內存中,設置缺少的虛擬頁的 PTE 的有效位爲 1,更新物理號。

  3. 缺頁中斷處理程序執行完畢,跳轉到發生缺頁的指令處,然後 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)

  1. 高速緩衝 (L1) 根據 PA 查詢內部的緩衝映射表,發現沒有找到 PA 映射的內容即指令或者數據,然後向內存請求 PA 下的內容。

  2. 內存將 PA 下的內容,發送給高速緩衝 (L1),高速緩衝(L1) 建立了 PA 和內容的映射關係。

  3. 高速緩衝 (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 個條目組成

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

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

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

虛擬地址

由上圖得知, 組號 (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 未命中,高速緩衝未命中,缺頁等,這些讀者可以自行實踐。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/gJFfZZE4rgE8cZiJSwmE1A