内存位置访问无效 midas.dll_内存虚拟化介绍
本文以Intel開源的ACRN項目(Homepage - Project ACRN?)介紹的內存虛擬化技術為基礎,介紹一下在虛擬系統中內存管理的一些基本知識。另外不同虛擬化公司提供的技術大多基于開源項目例如Xen、QEMU、KVM等
虛擬機管理程序 (HV) 通過虛擬真實的物理內存, 以便在虛擬機中運行的未經修改的操作系統 (如 linux 或 android),客戶操作系統可以管理自己的連續物理內存的視圖。虛擬機管理程序使用虛擬處理器標識符 (VPID) 和擴展頁面表 (EPT) 來把客戶物理地址轉換為實際主機物理地址。虛擬機管理程序啟用了EPT和 VPID 硬件虛擬化功能, 為操作系統和客戶系統建立了EPT頁表, 并向其他應用程序提供了EPT頁表操作接口。
從虛擬機管理程序的角度來看, 需要考慮以下幾種內存空間,有:
- 主機物理地址 (Host Physical Address): 本地主機物理地址空間,
- 主機虛擬地址 (Host Virtual Address): 基于MMU機制的本地主機虛擬地址空間。我們使用頁面表管理在HPA和HVA空間之間進行映射。
從虛擬機上運行的客戶操作系統來看, 有:
- 客戶物理地址 (Guest Physical Address): 虛擬機的客戶操作系統的物理地址空間。在GPA到HPA之間的映射通常需要基于類似MMU的硬件模塊 (例如X86中的EPT), 同時與頁面表相關聯
- 客戶操作系統虛擬地址 (Guest Virtual Address): 基于VMMU機制的虛擬機中客戶操作系統的虛擬地址空間
通常在這樣的架構下,內存地址訪問有四層映射:
GVA - GPA - HVA - HPA
GVA - GPA 的映射由客戶操作系統來負責,而 HVA - HPA 由微內核虛擬化操作系統來負責維護。于是在虛擬化系統中我們需要一種機制,來維護 GPA - HVA 的映射。常用的實現有 SPT(Shadow Page Table) 和 EPT/NPT (Intel) ,前者通過軟件維護影子頁表,后者通過硬件特性實現二級映射。
本文說明虛擬化系統的內存管理基礎結構, 以及它如何在虛擬化系統內處理不同的內存空間:
- 虛擬機管理程序如何管理本地主機內存 (HPA/HVA)
- 虛擬機管理程序如何管理客戶操作系統內存 (HPA/GPA)
- 虛擬機管理程序如何管理兩個不同客戶操作系統內存(HPA/GPA)
虛擬化物理內存管理
在虛擬化系中, 虛擬機最先初始化MMU頁表以管理所有物理內存, 然后切換到新的MMU頁表。在平臺初始化階段初始化MMU頁表后, 就不會對MMU頁表進行更新,因為這牽涉到客戶操作系統內存和交互區域,系統啟動時間優化等問題,因此MMU在平臺初始化階段固定對系統穩定性有一定的影響。
虛擬化物理內存分布
無可非議虛擬機管理程序必須具備系統內存管理功能。通常情況下, 系統啟動引導程序 (例如Intel的EFI) 將系統物理內存布局表傳遞給虛擬機管理程序,虛擬機管理程序基于此表使用分級頁表來執行內存管理工作。如下圖所示,此表包含系統平臺的原始內存布局。
虛擬化內存初始化
虛擬機管理程序在分頁模式下運行。系統啟動引導處理器 (BSP) 獲取系統平臺內存布局表后, BSP將在此基礎上創建其MMU頁面表。應用處理器 (AP) 接收 IPI CPU啟動中斷后, 它將使用由BSP創建的 MMU頁表,并啟用SMEP。SMEP(Supervisor Mode Execution Prevention),在現代intel處理器上,當設置了CR4存器的控制位時,會保護特權進程(比如在內核態的程序)不能在不含supervisor標志(對于ARM處理器,就是PXN標志)的內存區域執行代碼。(直白地說就是內核程序不能跳轉到用戶態執行代碼)。
虛擬機管理程序可以訪問所有系統內存,并有自己的內存,為其代碼/數據的 write-back 緩存,使用最小內存頁將虛擬地址空間映射到物理地址空間。如果更新了頁面的內存類型或訪問權限, 或者刪除了某些虛擬地址空間, 則會導致相應頁面的拆分。虛擬機管理程序仍將繼續使用最小內存頁將虛擬地址空間映射到物理地址空間。
內存分頁池功能
內存分頁池功能提供了對多種4kb 頁面大小內存塊的動態管理, 虛擬機管理程序通常使用這些內存塊來存儲內部數據。通過這些功能, 虛擬機管理程序可以分配和釋放相應的內存頁面。
虛擬機管理程序內存虛擬化
虛擬機管理程序為每個客戶操作系統提供了一個連續的物理內存區域。它還保證每個客戶操作系統互相隔離不能訪問彼此程序中的代碼和內部數據, 并且每個客戶操作系統在未授權的情況下不能訪問虛擬機的代碼和內部數據。虛擬機管理程序應該支持以下功能:
- 支持EPT和VPID硬件虛擬化功能,
- 為每個客戶操作系統建立EPT頁表,
- 提供EPT頁表操作服務,
- 為每個客戶操作系統提供虛擬化的MTRR機制,
- 提供VPID操作服務,
- 為GPA和HPA之間的地址空間映射提供服務,
- 提供虛擬機管理程序和每個客戶操作系統之間的數據傳輸服務。
虛擬化內存功能檢查
在虛擬機管理程序中, 內存虛擬化提供 EPT/VPID功能檢查服務和支持EPT大型頁面檢查服務。
不同地址空間的數據傳輸
在虛擬化系統中, 虛擬機管理程序、不同客戶操作系統中使用不同的內存空間來實現各自的隔離。在這些內存空間之間, 有不同類型的數據傳輸, 客戶操作系統可能會使用超調用來請求虛擬機管理程序提供數據傳輸服務。
訪問客戶操作系統內存地址GPA
當虛擬機管理程序需要訪問GPA來進行數據傳輸時, 來自客戶操作系統的調用方必須確保此GPA內存地址范圍是連續的。但對于虛擬機管理程序中的HPA主機物理內存地址, 它可能是不連續的 (特別是對于 巨型頁表分配機制下的用戶操作系統)。例如, 4Mb的GPA地址范圍可能映射到2個不同的2Mb巨型主機物理頁面。虛擬機管理程序應該通過基于其HPA的EPT頁面滑動來處理這種數據傳輸。
訪問客戶操作系統內存地址GVA
當虛擬機管理程序需要訪問GVA內存地址數據進行數據傳輸時, GPA和HPA地址可能都是不連續的。虛擬機管理程序最好監視這種數據傳輸, 并通過基于其GPA和HPA 內存頁表相應滑動來處理它。
內存擴展頁表的操作
虛擬機管理程序使用最小內存頁表將客戶操作系統的物理地址 (GPA) 映射到主機物理地址 (HPA) 。
如果更新了頁面的內存類型或訪問權限或刪除了某些 GPA 空間, 則會導致相應的EPT頁表被拆分。虛擬機管理程序仍應繼續使用最小的EPT頁表將GPA空間映射到HPA空間。
虛擬機管理程序提供EPT客戶操作系統物理內存增加、刪除、EPT頁表重新分配、以及內存無效服務。
總結
以上是生活随笔為你收集整理的内存位置访问无效 midas.dll_内存虚拟化介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我们真的需要4k电视机吗
- 下一篇: python生成词云_今天玩点啥:使用p