Intel VT学习笔记(七)—— EPT物理地址转换
Intel VT學習筆記(七)—— EPT物理地址轉換
- 要點回顧
- EPT
- 支持檢測
- 9-9-9-9-12分頁
- 實驗:EPT物理地址轉換
- 參考資料
要點回顧
在上一篇中,已經初步實現了最小VT框架,但實際上還有許多問題需要解決。
在最小VT框架中,我們僅處理了三個退出碼:
#define EXIT_REASON_CPUID 10 #define EXIT_REASON_VMCALL 18 #define EXIT_REASON_CR_ACCESS 28要是想開發一個成熟的VT框架,需要處理的退出碼遠要多得多。
本節,我們主要學習的內容是EPT物理地址轉換。
EPT
描述:EPT全稱為Extended Page Table,用于實現內存虛擬化。
之前,在學習保護模式的時候,我們了解了MMU(虛擬內存管理器)是如何將虛擬地址轉換成物理地址的,那便是通過分頁模式,在XP系統中,我們學習了10-10-12分頁和2-9-9-12分頁兩種分頁模式,EPT的作用與此非常像,它能夠將guest的物理地址(Guest Physical Address, GPA)轉換成host的物理地址(Host Physical Address, HPA)。
開啟EPT后,真正的物理內存就被隱藏起來了,Guest中的所有人都訪問不到,只有Host能訪問到。
關于EPT的詳細資料可以參考Intel開發手冊卷3第28節。
支持檢測
步驟:檢測IA32_VMX_PROCBASED_CTLS2 MSR(index 48BH)高32位的第2位,為1則表示支持。
9-9-9-9-12分頁
描述:EPT提供的分頁模式為9-9-9-9-12分頁,即最多支持48位地址的轉換,也就是256T內存 。
以之前學過的2-9-9-12分頁模式為例,尋址流程大致如下:
關于2-9-9-12分頁模式的具體內容可通過這篇文章復習,連筆者自己也有點忘了。
再來看看9-9-9-9-12分頁模式的流程:
不難發現,這兩者看上去差別不大,只是后者比前者多了一個目錄項,但實際上大有不同。
其中,EPTP的作用相當于Cr3,GPA通過它逐步找到HPA。
思考:VT是如何完成物理地址到物理地址之間的轉換的呢?
按照以往的經驗,如果需要將虛擬地址轉換成物理地址,首先要知道這個虛擬地址是屬于誰的,也就是Cr3是多少,然后將虛擬地址按照分頁模式進行拆分,逐級讀取各個表項,最終找到相應的物理頁。
但是在EPT模式下,Guest中的每個物理地址都經過了虛擬化,因此,每訪問一個物理地址,就要經過一次從GPA到HPA的轉換。
那也就是說,若系統使用的是2-9-9-12分頁模式,那么如果從想要找到真正的物理頁,一共要經過三次從物理地址到物理地址的轉換,具體的過程由VMM實現,我們只要了解其尋址原理即可。
第一次:PDPTE(GPA) -> PDPTE(HPA)
第二次:PDE(GPA) -> PDE(HPA)
第三次:PTE(GPA) -> PTE(HPA)
總尋址次數 = 3*4 = 12次
實驗:EPT物理地址轉換
第一步:分配內存,使其整體結構成為9-9-9-9-12模式,并掛入相應的物理頁。
//ept.c #include <ntddk.h> #define PAGE_SIZE 0x1000ULONG64* ept_PML4T;static PVOID *pagesToFree; static int index = 0;void InitEptPagesPool() {pagesToFree = ExAllocatePoolWithTag(NonPagedPool, 12*1024*1024, 'ept');if(!pagesToFree)__asm int 3RtlZeroMemory(pagesToFree, 12*1024*1024); }static ULONG64* AllocateOnePage() {PVOID page;page = ExAllocatePoolWithTag(NonPagedPool, PAGE_SIZE, 'ept');if(!page)__asm int 3RtlZeroMemory(page, PAGE_SIZE);pagesToFree[index] = page;index++;return (ULONG64 *)page; }ULONG64* MyEptInitialization() {ULONG64 *ept_PDPT, *ept_PDT, *ept_PT;PHYSICAL_ADDRESS FirstPtePA, FirstPdePA, FirstPdptePA;int a, b, c;InitEptPagesPool();ept_PML4T = AllocateOnePage();ept_PDPT = AllocateOnePage();FirstPdptePA = MmGetPhysicalAddress(ept_PDPT);*ept_PML4T = (FirstPdptePA.QuadPart) + 7;for (a = 0; a < 4; a++){ept_PDT = AllocateOnePage();FirstPdePA = MmGetPhysicalAddress(ept_PDT);*ept_PDPT = (FirstPdePA.QuadPart) + 7;ept_PDPT++;for (b = 0; b < 512; b++){ept_PT = AllocateOnePage();FirstPtePA = MmGetPhysicalAddress(ept_PT);*ept_PDT = (FirstPtePA.QuadPart) + 7;ept_PDT++;for (c = 0; c < 512; c++){*ept_PT = ((a << 30) | (b << 21) | (c << 12) | 0x37) & 0xFFFFFFFF;ept_PT++;}}}return ept_PML4T; }void MyEptFree() {int i;for (i = 0; i < index; i++) {ExFreePool(pagesToFree[i]);}ExFreePool(pagesToFree);index = 0; } //driver.c #include <ntddk.h> #include "vtasm.h" #include "vtsystem.h"VOID DriverUnload(PDRIVER_OBJECT pDriver) {StopVirtualTechnology();DbgPrint("Driver unload. \r\n"); }ULONG g_back_esp; ULONG g_back_eip;extern void InitEptPagesPool(); extern ULONG64* MyEptInitialization();NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING reg_path) {DbgPrint("Driver load. \r\n");pDriver->DriverUnload = DriverUnload;InitEptPagesPool();ULONG64* ept_PML4T = MyEptInitialization();Log("ept_PML4T", ept_PML4T);__asm int 3;__asm{pushadpushfdmov g_back_esp, espmov g_back_eip, offset BACK}StartVirtualTechnology(); //開啟VTBACK:__asm{popfdpopad}//Log("Return To DriverEntry", 0);return STATUS_SUCCESS; }第二步:運行驅動程序(注意,當Windbg獲取中斷時,此時并未開啟VT以及EPT模式)
第三步:讀取當前cr3和esp的值
第四步:獲取當前esp的物理地址作為GPA,下面嘗試將其轉換成HPA
第五步:將esp的物理地址拆分為9-9-9-9-12模式
二進制:00011110 11010110 10011100 01101100
9-9-9-9-12:000000000 000000000 011110110 101101001 110001101100
十六進制:000_000_0f6_169_c6c
第六步:定位PLM4E(注意,此時EPTP即ept_PLM4T指針是虛擬地址,里面的值才是物理地址)
這里PLM4E只有1項,因為XP系統物理內存最大為4GB,因此一項就夠了
第七步:定位PDPTE(這個時候開始就是物理地址了,記得去掉屬性位)
第八步:定位PDE
第九步:定位PTE
第十步:定位物理內存
物理頁中的內容和ESP里的值相同,說明整個過程沒有問題。
總結:不難發現,GPA經過轉換后得到的HPA沒有變化,但實際上,如果開啟EPT模式,當Guest和Host訪問同一個物理地址時,Guest只能對“虛擬的”物理內存進行讀寫,只有Host才能訪問到真正的物理內存。
參考資料
- VT虛擬化架構編寫視頻教程①~⑥課
- 周鶴《VT技術入門》系列視頻教程
- github項目:VT_Learn
- github項目: HyperPlatform
- Intel開發手冊 卷3:Chapter 23 ~ Chapter 33
- x86內部函數列表
- 科普下VT EPT
總結
以上是生活随笔為你收集整理的Intel VT学习笔记(七)—— EPT物理地址转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Intel VT学习笔记(六)—— VM
- 下一篇: Intel VT学习笔记(九)—— EP