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