天天看點

緻敬 hacker |盤點記憶體虛拟化探索之路

雲與虛拟化

雲計算是通過 Internet 服務的方式提供動态可伸縮資源的計算模式,經過多年的發展已成為企業 IT 技術的重要支撐。虛拟化是雲計算的核心技術之一,将一台計算機抽象為多台邏輯計算機,即虛拟機,每個虛拟機是一個單獨安全的環境,可運作不同的作業系統且互不影響。

虛拟化技術給資源使用和排程帶來了極大便利,雲計算系統可以根據負載情況及時進行資源排程,在提升資源使用率的同時保證應用和服務不會因資源不足而影響服務品質。然而虛拟化也是有代價的,對資源的抽象帶來了性能損失,這也是虛拟化一直緻力解決的問題。

虛拟化的資源抽象可以簡單劃分為三部分:CPU 虛拟化、記憶體虛拟化和裝置虛拟化。其中裝置虛拟化已經可以實作網絡、存儲等裝置直通虛拟機,沒有性能損失;CPU 虛拟化在硬體特性的支援下,執行普通指令性能與裸機相同;而記憶體虛拟化相比裸機,仍然存在較大差異,是當下值得關注的問題。

記憶體虛拟化

虛拟記憶體:說到記憶體虛拟化,就不得不提虛拟記憶體的概念。早期的作業系統隻有實體位址且空間有限,程序使用記憶體時必須小心翼翼以避免覆寫其他程序的記憶體。為避免此問題,虛拟記憶體的概念被抽象出來,保證每個程序都有一塊連續的、獨立的虛拟記憶體空間。程序直接通過 VA(Virtual Address)使用記憶體,CPU 訪存時發出的 VA 由硬體 MMU(Memory Management Unit)攔截并轉換為 PA(Physical Address),VA 到 PA 的映射使用頁表進行管理,MMU 在轉換時會自動查詢頁表。

記憶體虛拟化:與虛拟記憶體的概念類似,一台主機上的每個虛拟機認為自己獨占整個實體位址空間,因而需要對記憶體再做一次抽象,即記憶體虛拟化,保證每個虛拟機都有獨立的位址空間。這樣一來,在虛拟機和實體機中均有 VA 和 PA 的概念,即 GVA(Guest Virtual Address)和 GPA(Guest Physical Address),以及 HVA(Host Virtual Address)和 HPA(Host Physical Address)。

虛拟機内的程式使用的是GVA,最終需要轉換成 HPA。兩個 VA 到 PA( GVA 到 GPA 以及 HVA 到 HPA)的映射同樣使用頁表管理,GPA 到 HVA 一般是幾段連續的線性映射,由虛拟機的管理程式 VMM(Virtual Machine Monitor)進行管理。

程序訪存需要從 VA 轉換成 PA,在引入記憶體虛拟化後,轉換路徑發生了很大的變化。原本隻需要将 VA 轉換為 PA,虛拟化後轉換過程變成 GVA -> GPA -> HVA -> HPA 。路徑變得更長更複雜之後,對于訪存的安全和性能都帶來了挑戰,這兩點也是記憶體虛拟化需要達到的目标:1)安全 ,即位址轉換的合法性,虛拟機不能通路不屬于自己的記憶體;2)性能,即位址轉換的高效性,包括轉換關系建立的開銷低,以及轉換過程本身的開銷低。

經典方案

為達成記憶體虛拟化的目标,已經有很多虛拟化方案被提出,SPT(Shadow Page Table)和 EPT(Extended Page Table)是兩種典型的方案,也是大家最熟悉的方案。我們先以此為切入點,看看他們是如何工作的,然後再讨論其他的虛拟化方案。

SPT:由于最初的硬體隻支援一層頁表轉換,直接用來轉換虛拟機或實體機上的 VA 到 PA 都無法完成 GVA 到 HPA 的轉換。是以 SPT 建立了一條捷徑,即影子頁表,直接管理 GVA 到 HPA 的映射,如下圖所示。每一個影子頁表執行個體對應虛拟機内一個程序,影子頁表的建立需要 VMM 查詢虛拟機内程序的頁表。

由于影子頁表管理的是 GVA 到 HPA 的直接映射,SPT 位址轉換路徑與實體機路徑相當,直接查詢一層頁表就可以完成位址轉換。

優勢:SPT 位址轉換過程的開銷低,與實體機相當。

劣勢:

1)位址轉換關系的建立開銷很大,為保證位址轉換的合法性,所有的轉換關系建立,即虛拟機程序的頁表修改,都會被攔截之後陷出到特權的 VMM 中代為執行;

2)影子頁表本身需要占用記憶體,且一個影子頁表隻對應虛拟機内一個程序,整體會占用較多記憶體資源。

EPT:後來的硬體針對虛拟化增加了嵌套頁表的支援,使得硬體可以自動完成兩層頁表轉換。EPT 即是基于硬體支援的方案,在管理 GVA 到 GPA 的虛拟機頁表基礎上,新增擴充頁表管理 GPA 到 HPA 的映射,如下圖所示。這兩層頁表互相獨立,兩層映射關系轉換都由硬體自動完成。

由于虛拟機内各級頁表(gL4, gL3, gL2, gL1)内容隻是 GPA,查詢下一級時必須先經擴充頁表(nL4, nL3, nL2, nL1)轉換為 HPA,使得整個轉換路徑很長。

優勢:位址轉換關系的建立開銷低,獨立的 EPT 頁表的存在保證了位址轉換的合法性,是以虛拟機的頁表可以自行修改而無需 VMM 的幹預。

劣勢:轉換過程的開銷很大,最壞情況下需要 24(4 + 4 + 4 * 4)次硬體查表轉換。

兩種經典的方案在安全上都有堅實的保證,但在性能上各有缺陷。SPT 為保證位址轉換的合法性在建立轉換關系時付出了很大代價,而 EPT 雖然消除了建立轉換關系的開銷,轉換路徑卻更長了。

其他探索

業界和學術界關于記憶體虛拟化還有很多的探索,基本思想與 SPT 或 EPT 類似,可以據此分為三類來看:

1)一層頁表方案。與 SPT 類似,使用一層頁表直接管理 GVA 到 HPA 的映射;

2)兩層頁表方案。與 EPT 類似,使用兩層獨立頁表分别管理 GVA 到 GPA 以及 GPA 到 HPA 的映射;

3)混合方案。結合前兩類方案,進行動态的選擇。

Direct Paging:一層頁表方案,這是 Xen 在早期硬體僅支援一層頁表時的半虛拟化方案。相比于 SPT 最大的差別是,沒有單獨維護 GVA 到 GPA 的虛拟機頁表,虛拟機知道自己處于虛拟化環境,即知道自己的頁表内容是 HPA。

虛拟機修改頁表也需要陷出,但是采用主動陷出的方式,可以 batch 化,而 SPT 則是被動攔截陷出;讀取頁表時隻能拿到 HPA,需要查一張 M2P(Machine to Physical)表才能得到 GPA。

Direct Paging 同樣使用一層頁表管理 GVA 到 HPA 映射,位址轉換的路徑與 SPT 是相同的。在使用 4 級頁表時,最壞隻需 4 次查表。

優勢:位址轉換過程的開銷低,與實體機相當。

1)位址轉換關系的建立開銷很大,所有頁表修改都需要主動陷出;

2)需要虛拟機做半虛拟化的适配,虛拟機需要感覺自己的頁表管理的是 GVA 到 HPA 的映射。

Direct Segment:兩層頁表方案,這是學術界基于新硬體的方案。GVA 到 GPA 的映射管理與 EPT 相同,同樣采用多級頁表。但 GPA 到 HPA 的映射采用分段機制, GPA 轉換為 HPA 時隻需要通過硬體加上一個偏移即可。

如果你想開發小程式或者app的話,可以通過第三方專業開發平台,來幫助你實作開發需求:

廈門在乎科技

-專注

廈門小程式開發

、app開發、網站開發

繼續閱讀