這篇內(nèi)容,通過從操作系統(tǒng)的虛擬地址介紹到虛擬機層面的內(nèi)存虛擬化技術(shù),并介紹這兩種技術(shù)之間的關(guān)聯(lián)。
目前創(chuàng)新互聯(lián)已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計、金堂縣網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。(以下實例都以intel 64位處理器和win10 x64操作系統(tǒng)位例。 )
一、虛擬地址
在保護模式下,每個進程擁有自己獨立的虛擬內(nèi)存,程序的代碼、全局?jǐn)?shù)據(jù)、??臻g等使用自己獨立的虛擬內(nèi)存。每個進程可以訪問自己獨立的以0開始的虛擬地址(VA),即每個進程可以有跟其他進程相同的虛擬地址(VA)起始地址(start address)和結(jié)束地址(end address)。
虛擬內(nèi)存被操作的時候,會分配一塊實際的物理內(nèi)存與它對應(yīng)。
這篇內(nèi)容,通過從操作系統(tǒng)的虛擬地址介紹到虛擬機層面的內(nèi)存虛擬化技術(shù),并介紹這兩種技術(shù)之間的關(guān)聯(lián)。
(以下實例都以intel 64位處理器和win10 x64操作系統(tǒng)位例。 )
一、虛擬地址
在保護模式下,每個進程擁有自己獨立的虛擬內(nèi)存,程序的代碼、全局?jǐn)?shù)據(jù)、棧空間等使用自己獨立的虛擬內(nèi)存。每個進程可以訪問自己獨立的以0開始的虛擬地址(VA),即每個進程可以有跟其他進程相同的虛擬地址(VA)起始地址(start address)和結(jié)束地址(end address)。
虛擬內(nèi)存被操作的時候,會分配一塊實際的物理內(nèi)存與它對應(yīng)。
CPU內(nèi)部的MMU(內(nèi)存管理單元)會把虛擬地址(virtual address)翻譯為對應(yīng)的物理地址(physical address),借助于CR3寄存器。CR3寄存器存儲該進程的最頂級頁目錄。
每一個虛擬地址被分成幾份,每一份作為一個索引,得到多個索引值和一個頁偏移。從最頂級頁目錄找到索引所在的項。從項取出次頂級頁目錄的起始物理地址。再用下一個索引從次頂級頁目錄找到下一個頁目錄的起始物理地址。直至直到頁表的起始物理地址,外加頁偏移,計算該虛擬地址對應(yīng)的實際物理地址。
從上面描述的,從虛擬地址到實際的物理地址,需要耗費一定的時間,TLB(translation lookaside buffer)可以省去中間過程。如果從TLB找到虛擬地址對應(yīng)的物理地址,則跳過從頁目錄到頁表的翻譯過程。TLB會維護虛擬地址到物理地址的對應(yīng)過程一定的時間。
完整的過程為:當(dāng)一個虛擬地址(VA)被訪問(access),如果該虛擬地址(VA)對應(yīng)的物理地址(PA)沒有找到或不存在,則觸發(fā)缺頁中斷(INT E),由缺頁處理程序建立該虛擬地址(VA)的頁目錄頁表(PML4、PDP、PDE、PTE),并把虛擬地址(VA)與物理地址(PA)的對應(yīng)關(guān)系記錄在TLB中。
二、內(nèi)存虛擬化
我們下面描述的是內(nèi)存虛擬化主要用于CPU支持并提供的硬件輔助虛擬化技術(shù)當(dāng)中。
在一臺計算機上安裝多個虛擬機(VM)時,每個虛擬機(VM)都認(rèn)為自己獨占使用物理內(nèi)存,都可以獨立的訪問以0開始的起始物理地址。如下圖:
虛擬內(nèi)存技術(shù)用于把虛擬地址VA(virtual Address)轉(zhuǎn)化為物理地址PA(physical address),但有了內(nèi)存虛擬化技術(shù)在原本的虛擬地址翻譯為物理地址的過程中又加了一層,把原本的物理地址所(PA)處的位置叫做虛擬機(virtual machine)的物理地址,也叫做GPA(guest physical address)。從而實際的物理地址(PA)叫做VMM(virtual monitor machine)的物理地址,也叫做HPA(host physical address)。
(*注:虛擬機(VM)有的資料上也叫客戶機,是一個意思)。
再由VMM(Virtual Machine Monitor)把虛擬機的GPA翻譯為HPA。最終達(dá)到的效果是VA映射到了HPA。轉(zhuǎn)換過程如下圖:
三、虛擬內(nèi)存和內(nèi)存虛擬化的關(guān)系
如果沒有內(nèi)存虛擬化技術(shù),操作系統(tǒng)通過虛擬地址(VA)訪問物理地址(PA)的過程如下:操作系統(tǒng)(OS)把一個虛擬地址分成4個索引值(Index)和一個物理內(nèi)存頁偏移(offset)。4個索引值分別是Index4、Index3、Index2、Index1,分別表示L4(第四級頁表PML4T)中的索引、L3(第三級頁表PDPT)中的索引、L2(第二級頁表PDT)中的索引、L1(第一級頁表PT)中的索引。
使用索引值在頁表中找到下一級頁表的起始物理地址,過程如下:利用CR3寄存器找到PML4T(頁表)的起始物理地址(PA),用Index4在PML4T中找到PDPT的起始物理地址(PA);再使用Index3從PDPT 找到PDT的起始物理地址(PA);再使用Index2從PDT中找到PT的起始物理地址(PA);再使用Index1從PT中取出PFN的起始物理地址(PA);最后PFN的物理起始地址加上頁內(nèi)偏移(offset)找到虛擬地址對應(yīng)的物理地址(PA)。
在內(nèi)存虛擬化技術(shù)下,所有上面提到的物理地址(PA)都將作為虛擬機的物理地址(GPA),需要把所有的GPA借助于CPU內(nèi)部的EPT(Extended Page Table)轉(zhuǎn)化為HPA,才能被CPU給訪問。所以,過程變?yōu)榱讼旅孢@樣:
虛擬機里面的操作系統(tǒng)使用的CR3寄存器存放的PML4T的起始物理地址(GPA)需要被VMM(Virtual Machine Monitor)轉(zhuǎn)化為HPA,然后才能使用Index4找到PDPT的起始物理地址(GPA)。繼續(xù)借助于EPT把PDPT的GPA轉(zhuǎn)化為HPA,再利用Index3找到PDT的起始物理地址(GPA)。繼續(xù)借助于EPT把PDT的GPA轉(zhuǎn)化為HPA,再利用Index2找到PT的起始物理地址(GPA)。繼續(xù)借助于EPT把PT的GPA轉(zhuǎn)化為HPA,再利用Index1找到PFN的起始物理地址(GPA)。最后借助于EPT把PFN的GPA轉(zhuǎn)化為HPA,加上頁內(nèi)偏移(offset),得到最后的虛擬地址(VA)對應(yīng)的HPA。
最后說明下,從GPA到HPA的轉(zhuǎn)化過程如下圖:
一個GPA地址也被分成5部分,L4,L3,L2、L1和頁內(nèi)偏移offset。每一部分作為一個索引,Index4,Index3,Index2,Index1,Offset。從EPT取出PML4 Table的基地址,加上Index4*4找到PML4 Entry;并取出PML4 Entry中存放的PDP Table的基地址,加上Index3*4找到PDP Entry;取出PDP Entry中存放的PD Table的基地址,加上Index2*4找到PD Entry;取出PD Entry中存放的PT Table的基地址,加上Index1*4找到物理頁幀號PFN;PFN 加上Offset就是最終的物理地址(HPA)。
四、示例
下面簡單介紹下代碼《Part 7 - Using EPT & Page-level Monitoring Features》,用于了解下EPT的一個應(yīng)用場景。該代碼來源于Hypervisor From Scratch – Part 7: Using EPT & Page-Level Monitoring Features | Rayanfam Blog,演示了EPT的從構(gòu)建到使用的過程。下面代碼跟上面介紹過的內(nèi)容的唯一不同的點是,頁目錄(PD)的Large Page標(biāo)記為1,意味著頁目錄指向PFN,省去了PTE。每一個PDTE指向的2MB大小的物理內(nèi)存。
在不同架構(gòu)的處理器下,4KB物理頁面和2MB的物理內(nèi)存說明如下圖:
該代碼演示了多CPU對應(yīng)一個EPT表,修改完EPT需要調(diào)用Invept指令使TLB失效。該代碼去除了ExAllocatePoolWithTag函數(shù)的可執(zhí)行權(quán)限,從而觸發(fā)VM Exit,進入VMM的處理例程VmxVmexitHandler,然后再恢復(fù)ExAllocatePoolWithTag函數(shù)的執(zhí)行權(quán)限,允許其可執(zhí)行。具體過程如下:
初始化完成EPT表后,查找函數(shù)ExAllocatePoolWithTag所在的PDE,把該PDE轉(zhuǎn)化為一個包含512個PT的表,找到函數(shù)ExAllocatePoolWithTag所在的PTE,然后去除函數(shù)ExAllocatePoolWithTag所在的PTE的執(zhí)行權(quán)限。
當(dāng)調(diào)用函數(shù)ExAllocatePoolWithTag時,函數(shù)ExAllocatePoolWithTag所在PTE標(biāo)記沒有執(zhí)行權(quán)限,觸發(fā)違例進入VmxVmexitHandler。在處理例程VmxVmexitHandler找到函數(shù)ExAllocatePoolWithTag所在的PTE,并恢復(fù)可執(zhí)行權(quán)限,最后調(diào)用Invept指令刷新TLB。
四、總結(jié)
以上,從操作系統(tǒng)層面介紹了虛擬地址與物理地址之間的關(guān)系及轉(zhuǎn)化過程,又在引入了硬件輔助虛擬化技術(shù)后,介紹了從虛擬機(操作系統(tǒng)處于虛擬機內(nèi)部)層面的物理地址再到虛擬機監(jiān)視器的實際的物理地址之間的關(guān)系及轉(zhuǎn)化過程。并通過一份開源代碼,簡單介紹了一下以上內(nèi)容的一個應(yīng)用場景。
參考資料:
《系統(tǒng)虛擬化——原理與實現(xiàn)》
《虛擬化技術(shù)原理與實現(xiàn)》
《Intel手冊卷3》
《虛擬化與云計算》
《Windows Internals Seventh Edition Part 2》
《Part 7 - Using EPT & Page-level Monitoring Features》
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧