欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
kvm原理分析

1. 概述

1.1. KVM簡(jiǎn)介

KVM是一個(gè)基于Linux內核的虛擬機,它屬于完全虛擬化范疇,從Linux-2.6.20開(kāi)始被包含在Linux內核中。KVM基于x86硬件虛擬化技術(shù),它的運行要求Intel VT-xAMD SVM的支持。

一般認為,虛擬機監控的實(shí)現模型有兩類(lèi):監控模型(Hypervisor)和宿主機模型(Host-based)。由于監控模型需要進(jìn)行處理器調度,還需要實(shí)現各種驅動(dòng)程序,以支撐運行其上的虛擬機,因此實(shí)現難度上一般要大于宿主機模型。KVM的實(shí)現采用宿主機模型(Host-based),由于KVM是集成在Linux內核中的,因此可以自然地使用Linux內核提供的內存管理、多處理器支持等功能,易于實(shí)現,而且還可以隨著(zhù)Linux內核的發(fā)展而發(fā)展。另外,目前KVM的所有I/O虛擬化工作是借助Qemu完成的,也顯著(zhù)地降低了實(shí)現的工作量。以上可以說(shuō)是KVM的優(yōu)勢所在。

本文僅分析KVM中與Intel VT-x相關(guān)的實(shí)現,不考慮KVM中與AMD SVM相關(guān)的實(shí)現,因此有關(guān)術(shù)語(yǔ)的使用與Intel VT-x保持一致。


2. 處理器虛擬化

2.1. VT-x技術(shù)

我們知道處理器一般存在應用編程接口和系統編程接口。對于x86處理器來(lái)說(shuō),應用編程接口僅向應用程序暴露了通用寄存器、RFLAGS、RIP和一組非特權指令,而系統編程接口向操作系統暴露了全部的ISAInstruction Set Architecture)。傳統的進(jìn)程/線(xiàn)程模型也是對處理器的一種虛擬化,但只是對處理器的應用編程接口的虛擬化,而所謂的系統虛擬化(system virtualization)是要實(shí)現處理器系統編程接口的虛擬化。從這個(gè)角度講,系統虛擬化與進(jìn)程/線(xiàn)程模型相比并無(wú)本質(zhì)的區別。

處理器虛擬化的本質(zhì)是分時(shí)共享。實(shí)現虛擬化需要兩個(gè)必要條件,第一是能夠讀取和恢復處理器的當前狀態(tài),第二是有某種機制防止虛擬機對系統全局狀態(tài)進(jìn)行修改。

第一個(gè)必要條件沒(méi)有必要一定由硬件來(lái)實(shí)現,雖然硬件實(shí)現可能比軟件實(shí)現更為簡(jiǎn)單。例如,x86處理器對多任務(wù),也就是應用編程接口虛擬化,提供了硬件的支持,軟件通常只需要執行一條指令,就可以實(shí)現任務(wù)切換,處理器硬件負責保存當前應用編程接口的狀態(tài),并為目標任務(wù)恢復應用編程接口的狀態(tài)。但操作系統并不一定要使用處理器提供的這種虛擬化機制,完全可以使用軟件來(lái)完成應用接口狀態(tài)的切換。例如,Linux就沒(méi)有使用x86處理器提提供多任務(wù)機制,完全依賴(lài)軟件實(shí)現任務(wù)切換。

第二個(gè)必要條件一定要由硬件來(lái)實(shí)現,通常處理器采用多模式操作(multi-mode operation)來(lái)確保這一點(diǎn)。在傳統x86處理器上,共有4種模式的操作,也就是常說(shuō)的4個(gè)特權級。虛擬機(這里指進(jìn)程/線(xiàn)程)通常運行在特權級3上,而虛擬機監控器(這里指操作系統)運行于特權級0上,進(jìn)程/線(xiàn)程的所有訪(fǎng)問(wèn)全局的操作,如訪(fǎng)問(wèn)共享的操作系統所在的地址空間,訪(fǎng)問(wèn)I/O等等,均會(huì )導致異常的發(fā)生,被操作系統所截獲并處理,使操作系統有機會(huì )向進(jìn)程/線(xiàn)程提供一個(gè)虛擬的世界。

系統虛擬化與進(jìn)程/線(xiàn)程模型相比并無(wú)本質(zhì)的區別。x86處理器完全有機會(huì )以較小的代價(jià)提供對系統虛擬化的支持,但很可惜Intel沒(méi)有考慮那么長(cháng)遠。x864個(gè)特權級對于實(shí)現系統虛擬化已經(jīng)足夠了,但傳統的x86處理器上,許多特權指令要求必須在特權級0上執行,如LGDT,因此通常操作系統都占用了特權級0,也就沒(méi)有特權級供虛擬機監控器使用了。為此,許多基于傳統x86處理器的虛擬化軟件不得不采用ring deprivileging方法,讓操作系統運行于特權級1,而由虛擬機監控器使用特權級0。ring deprivileging方法帶來(lái)了許多問(wèn)題,包括:ring aliasing、address space compression、nonfaulting accessing to privileged state、adverse impact on guest transitions、interrupt virtualization、access to hidden state等問(wèn)題,通常將以上問(wèn)題統稱(chēng)為x86平臺的虛擬化漏洞。

ring aliasing問(wèn)題是指,采用ring deprivileging方法時(shí),由于處理器的CPL保存在CS的低兩位,所以操作系統通過(guò)執行PUSH CS指令和一條POP EAX指令可以很容易發(fā)現其目前不在特權級0上執行,這違背了虛擬化對操作系統透明的原則。

address space compression問(wèn)題是指,操作系統通常期望能夠訪(fǎng)問(wèn)整個(gè)4GB線(xiàn)性地址空間,但虛擬機監控器可能也需要占用操作系統的一部分線(xiàn)性地址空間,以便其能夠方便地訪(fǎng)問(wèn)操作系統的地址空間。但如果操作系統是運行于特權級1,那么操作系統也同樣可以訪(fǎng)問(wèn)虛擬機監控器的存儲空間,對虛擬機監控器造成威脅。

nonfaulting accessing to privileged state問(wèn)題是指,Intel的特權級機制不能確保所有的訪(fǎng)問(wèn)處理器狀態(tài)的指令在低特權級狀態(tài)下執行時(shí)都產(chǎn)生故障(Fault),這使得操作系統在訪(fǎng)問(wèn)某些處理器狀態(tài)時(shí)虛擬機監控器無(wú)法獲得控制,也就無(wú)法對這些指令進(jìn)行仿真。例如,IA-32GDTR, LDTR, IDTR, TR包含了控制處理器狀態(tài)的指針,對這些寄存器的修改只能在特權級0進(jìn)行,但IA-32允許在所有的特權級中讀取這些寄存器的值。操作系統可以讀取這些寄存器的值,如果與真實(shí)的計算機上的值不同,操作系統就可以認為自己正運行在虛擬機環(huán)境中。

adverse impact on guest transitions問(wèn)題是指,為加快系統調用的速度,Intel引入了SYSENTERSYSEXIT指令,但SYSENTER指令總是將特權級切換到0,且從0以外的特權級執行SYSEXIT指令將導致故障。因此,在采用ring deprivileging方法實(shí)現虛擬化時(shí),SYSENTERSYSEXIT指令總是先陷入到虛擬機監控器,經(jīng)后者仿真后再交給操作系統,這使系統調用的速度減慢。

interrupt virtualization問(wèn)題是指,IA-32使用EFLAGS.IF位來(lái)控制中斷的屏蔽,修改IF位需要在CPL<=IOPL的情況下進(jìn)行,否則將產(chǎn)生故障。操作系統可能需要頻繁地修改IF位,會(huì )頻繁地導致虛擬機監控器的陷入,影響系統性能。而且,有些情況下,虛擬機監控器需要向虛擬機注入事件,但如果虛擬機正處于中斷屏蔽狀態(tài),虛擬機監控器就必須等待,直到虛擬機打開(kāi)中斷。虛擬機監控器為了及時(shí)得知虛擬機已打開(kāi)中斷,也必須截獲操作系統對EFLAGS.IF位的修改。

access to hidden state問(wèn)題是指,IA-32處理器的某些狀態(tài),例如段描述符高速緩存,是無(wú)法通過(guò)指令訪(fǎng)問(wèn)的。當虛擬機切換時(shí),IA-32沒(méi)有提供保存和恢復段描述符高速緩存的手段。也就是說(shuō),上文所述的實(shí)現虛擬化的第一個(gè)必要條件,能夠讀取和恢復處理器的當前狀態(tài),并不完全具備。

總之,雖然采用ring deprivileging方法可能實(shí)現系統虛擬化,但具有很多缺陷,且軟件上比較復雜。為此,Intel提出了VT-x技術(shù)來(lái)解決系統虛擬化問(wèn)題,其主要思路是增加一個(gè)新的比0還高的特權級,通常稱(chēng)之為特權級-1,并在硬件上支持系統編程接口狀態(tài)的保存和恢復。

首先,VT-x提供了一套稱(chēng)作VMXVirtual Machine eXtension)的新的工作模式,工作在該模式下的處理器又具有兩類(lèi)操作模式:VMX root operationVMX non-root operation。通常,虛擬機監控器運行在VMX root operation模式下,即所謂的特權級-1,客戶(hù)操作系統運行在VMX non-root operation模式下。VMX non-root operation模式仍保留4個(gè)特權級,對操作系統來(lái)說(shuō),VMX non-root operation模式與傳統的x86處理器兼容,最大的差別在于當虛擬機執行一些訪(fǎng)問(wèn)全局資源的指令時(shí)將導致虛擬機退出操作(VM exit),從而使虛擬機監控器獲得控制權,以便對訪(fǎng)問(wèn)全局資源的指令進(jìn)行模擬。以后,虛擬機監控器可以通過(guò)虛擬機進(jìn)入操作(VM entry)使虛擬機重新獲得控制權。

其次,VT-x為系統編程接口狀態(tài)的切換提供硬件支持。VT-x為每個(gè)虛擬機維護至少一個(gè)VMCSVirtual Machine Control Structure)結構,其中保存了虛擬機和虛擬機監控器的系統編程接口狀態(tài)。當執行VM exitVM entry操作時(shí),VT-x自動(dòng)根據VMCS中的內容完成虛擬機和虛擬機監控器間的系統編程接口狀態(tài)切換。為系統編程接口狀態(tài)的切換提供硬件支持是必要的,因為x86處理器的系統編程接口相比應用編程接口要復雜的多,且在不停的變化,如較新的處理器可能增加一些MSRModel Specific Register),這使得單獨依靠軟件來(lái)實(shí)現系統編程接口的保存和恢復工作變得十分復雜。另外,VT-x還提供了一組指令,使得虛擬機監控器通過(guò)一條指令就可以完成虛擬機間的切換。

VT-x解決了ring deprivileging方法的一系列問(wèn)題,從硬件上堵住了所謂的x86平臺的虛擬化漏洞。由于操作系統所在的VMX non-root operation模式仍具有4個(gè)特權級,使得ring aliasing問(wèn)題不存在了。同時(shí),由于SYSENTERSYSEXIT指令所引起的adverse impact on guest transitions問(wèn)題也不存在了;由于VT-xVM exitVM entry時(shí)完成系統編程接口的切換,也就是說(shuō)虛擬機和虛擬機監控器擁有各自的GDT,也就擁有了各自的地址空間,解決了address space compression問(wèn)題。同時(shí),虛擬機和虛擬機監控器擁有各自的GDTR/IDTR等寄存器,在虛擬機中訪(fǎng)問(wèn)這些寄存器無(wú)需陷入,解決了nonfaulting accessing to privileged state問(wèn)題,再者,VMCS中保存了虛擬機的段描述符高速緩存,因此在虛擬機切換時(shí)不會(huì )出現access to hidden state問(wèn)題;通過(guò)對VMCS進(jìn)行設置,可以使處理器在VMX non-root operation模式時(shí)的EFLAGS.IF失效,即該標志位不再對中斷屏蔽產(chǎn)生影響,因此操作系統對EFLAGS.IF的頻繁操作不會(huì )導致頻繁的VM exit,解決了interrupt virtualization的問(wèn)題。

VT-x提供了完備的處理器虛擬化機制,利用VT-x可以在單個(gè)硬件平臺上虛擬出任意數量的虛擬處理器VCPU。VT-x除了解決了處理器虛擬化的問(wèn)題之外,還為內存虛擬化和I/O虛擬化提供了支撐。在內存虛擬化方面,VT-x為影子頁(yè)表的實(shí)現提供了支撐,并且在較新的處理器中還提供了EPT機制,進(jìn)一步提高了內存虛擬化的效率。在I/O虛擬化方面,通過(guò)I/O位圖機制可以方便地實(shí)現對Programmed I/O的虛擬化,除此之外,VT-x還提供了中斷事件退出機制和中斷事件注入機制,方便對設備中斷進(jìn)行虛擬化。

2.2. KVM實(shí)現

作為VMM,KVM分為兩部分,分別是運行于Kernel模式的KVM內核模塊和運行于User模式的Qemu模塊。這里的Kernel模式和User模式,實(shí)際上指的是VMX根模式下的特權級0和特權級3。另外,KVM將虛擬機所在的運行模式稱(chēng)為Guest模式。所謂Guest模式,實(shí)際上指的是VMX的非根模式。

利用VT-x技術(shù)的支持,KVM中的每個(gè)虛擬機可具有多個(gè)虛擬處理器VCPU,每個(gè)VCPU對應一個(gè)Qemu線(xiàn)程,VCPU創(chuàng )建、初始化、運行以及退出處理都在Qemu線(xiàn)程上下文中進(jìn)行,需要Kernel、UserGuest三種模式相互配合,其工作模型如圖2.1所示。Qemu線(xiàn)程與KVM內核模塊間以ioctl的方式進(jìn)行交互,而KVM內核模塊與客戶(hù)軟件之間通過(guò)VM ExitVM entry操作進(jìn)行切換。

Qemu線(xiàn)程以ioctl的方式指示KVM內核模塊進(jìn)行VCPU的創(chuàng )建和初始化等操作,主要指VMM創(chuàng )建VCPU運行所需的各種數據結構并初始化。其中很重要的一個(gè)數據結構就是VMCS,其初始化配置見(jiàn)附2。

初始化工作完成之后,Qemu線(xiàn)程以ioctl的方式向KVM內核模塊發(fā)出運行VCPU的指示,后者執行VM entry操作,將處理器由kernel模式切換到Guest模式,中止宿主機軟件,轉而運行客戶(hù)軟件。注意,宿主機軟件被中止時(shí),正處于Qemu線(xiàn)程上下文,且正在執行ioctl系統調用的kernel模式處理程序??蛻?hù)軟件在運行過(guò)程中,如發(fā)生異?;蛲獠恐袛嗟仁录?,或執行I/O操作,可能導致VM exit,將處理器狀態(tài)由Guest模式切換回Kernel模式。KVM內核模塊檢查發(fā)生VM exit的原因,如果VM exit由于I/O操作導致,則執行系統調用返回操作,將I/O操作交給處于User模式的Qemu線(xiàn)程來(lái)處理,Qemu線(xiàn)程在處理完I/O操作后再次執行ioctl,指示KVM切換處理器到Guest模式,恢復客戶(hù)軟件的運行;如果VM exit由于其它原因導致,則由KVM內核模塊負責處理,并在處理后切換處理器到Guest模式,恢復客戶(hù)機的運行。


3. 內存虛擬化

3.1. VT-x內存虛擬化介紹

3.1.1. 基于VTLB的內存虛擬化

對于x86平臺來(lái)說(shuō),處理器在加電或復位后處于實(shí)模式,此后在操作系統的操縱下一般會(huì )先切換到非分頁(yè)保護模式,最后在切換到分頁(yè)保護模式。VMM必須能夠滿(mǎn)足以上各種模式下的內存虛擬化要求,完全控制客戶(hù)機對物理地址的訪(fǎng)問(wèn),實(shí)現虛擬機間物理內存的隔離,并對客戶(hù)機保持透明??蛻?hù)機絕大多數情況下將工作在分頁(yè)保護模式下,因此我們首先介紹客戶(hù)機工作在分頁(yè)保護模式時(shí)的內存虛擬化。

我們知道,當處理器未啟動(dòng)VMX模式時(shí),頁(yè)表機制確定了線(xiàn)性地址到物理地址的對應關(guān)系。為了加快地址轉換的效率,減少地址轉換過(guò)程中的頁(yè)表訪(fǎng)問(wèn)次數,處理器使用TLBTranslation Lookaside Buffer)來(lái)緩存線(xiàn)性地址到物理地址的映射關(guān)系。實(shí)際的地址轉換過(guò)程中,處理器首先根據線(xiàn)性地址查找TLB,如果未發(fā)現該線(xiàn)性地址到物理地址的映射關(guān)系(TLB miss),將根據頁(yè)表中的映射關(guān)系填充TLBTLB fill),然后再進(jìn)行地址轉換。因此,頁(yè)表雖然確定了線(xiàn)性地址到物理地址的對應關(guān)系,但它并不直接控制線(xiàn)性地址到物理地址的轉換,這種轉換是由TLB控制的。在不會(huì )導致地址轉換錯誤的前提下,處理器不要求TLB的內容一定與頁(yè)表保持一致,例如一次進(jìn)程切換后,TLB的內容可能都是無(wú)效的,但進(jìn)程的頁(yè)表卻是有效的,此時(shí)頁(yè)表和TLB是不一致的,以后訪(fǎng)問(wèn)內存時(shí)會(huì )引發(fā)TLB miss,并通過(guò)TLB fill令某個(gè)頁(yè)表項與某個(gè)TLB項保持一致。

VT-x中可采用一種稱(chēng)為Virtual TLBVTLB)的技術(shù)來(lái)實(shí)現內存虛擬化,其思想就源于上述多級頁(yè)表與TLB間的交互機制,其工作機制如圖3.1所示。VM的頁(yè)表并不直接控制線(xiàn)性地址到物理地址的轉換,即CR3寄存器并不指向VM的頁(yè)目錄,而是指向VMM維護的影子頁(yè)表(Shadow Page Table),因此線(xiàn)性地址到物理地址的轉換是由影子頁(yè)表和TLB來(lái)控制的,影子頁(yè)表和TLB共同構成了所謂的Virtual TLB。VM可以任意修改其頁(yè)表,而不會(huì )導致VM exit,由此可能產(chǎn)生兩種VM頁(yè)表與VTLB之間的不一致情況。

第一種不一致是指VM的頁(yè)表?yè)碛斜扔白禹?yè)表更多的訪(fǎng)問(wèn)能力,可以利用頁(yè)面故障來(lái)修補這種不一致性。例如VM頁(yè)表有某個(gè)線(xiàn)性地址到物理的對應關(guān)系而影子頁(yè)表中卻沒(méi)有,那么VM對該線(xiàn)性地址的訪(fǎng)問(wèn)將導致頁(yè)面故障。VMM可以捕獲該異常,進(jìn)而根據VM的頁(yè)表來(lái)修改影子頁(yè)表。

第二種不一致是指VM的頁(yè)表的訪(fǎng)問(wèn)能力不及影子頁(yè)表,那么一定是由于VM修改了自己的頁(yè)表,并且把頁(yè)表的訪(fǎng)問(wèn)權限降低了,例如頁(yè)面交換將頁(yè)表項的P位置0,但該操作并不會(huì )馬上反映到TLB中。此時(shí),VM需要執行INVLPG指令或重裝CR3寄存器來(lái)刷新TLB,VM在執行INVLPG指令或重裝CR3寄存器時(shí)將導致VM exit,使VMM有機會(huì )根據VM的頁(yè)表來(lái)修改影子頁(yè)表,從而修補這種不一致性。

另外,處理器在進(jìn)行內存訪(fǎng)問(wèn)時(shí)會(huì )自動(dòng)修改頁(yè)表項的A位或D位。A位在所有級別的頁(yè)表項中都存在,但在TLB entry中并不緩存A位,原因是本次訪(fǎng)存操作涉及的各個(gè)級別的頁(yè)表項都允許本次訪(fǎng)問(wèn),才會(huì )在TLB中生成一個(gè)entry,因此只要TLB中存在一個(gè)entry,那么一定已經(jīng)將entry相關(guān)的各級頁(yè)表項都訪(fǎng)問(wèn)過(guò)了,各級頁(yè)表項的A位都是1。處理器在初次訪(fǎng)問(wèn)一個(gè)頁(yè)表項時(shí),將其A位置1,但由軟件負責將A位清0。如果軟件將A位由1變成0,它應該使用INVLPG指令使對應的TLB entry失效。如果不這樣做,那么在訪(fǎng)存時(shí),總是使用TLB中緩存的entry,處理器認為頁(yè)表項中的A位已經(jīng)是1了,從而不會(huì )將A位由0改為1。在軟件看來(lái),好象該頁(yè)自將A位置0以來(lái)未曾被訪(fǎng)問(wèn)過(guò),而實(shí)際情況并不是這樣。

D位僅在最后一級頁(yè)表中存在,而且在TLB entry中也緩存D位。當首次寫(xiě)一個(gè)頁(yè)時(shí),如果TLB entry不存在或其D位為0,則將頁(yè)表項中的D位置1,同A位相同,由軟件負責將D位置1。如果軟件將PTED位由1變成0,應該使用INVLPG指令使對應的TLB entry失效。如果不這樣做,那么再次寫(xiě)該頁(yè)時(shí),總是優(yōu)先使用緩存的TLB entry,并且TLB entryD位為1,這時(shí)處理器認為PTED位已經(jīng)是1了,它不會(huì )再將其置1。在軟件看來(lái),好象該頁(yè)自將D位置0以來(lái)未曾被寫(xiě)過(guò),而實(shí)際情況并不是這樣。

由于VM進(jìn)行內存訪(fǎng)問(wèn)實(shí)際使用的是影子頁(yè)表,因此這種修改不能自動(dòng)反映到客戶(hù)頁(yè)表中,從而導致客戶(hù)頁(yè)表和影子頁(yè)表的不一致。應該有某種機制使VMM得以捕獲處理器對影子頁(yè)表的A位和D位的初次修改,并更新VM頁(yè)表,從而解決這種不一致性。

對于A位,只要VMM不先于VM建立線(xiàn)性地址到物理地址的映射關(guān)系,就可以確保捕獲客戶(hù)對內存的訪(fǎng)問(wèn),進(jìn)而有機會(huì )確保影子頁(yè)表項和客戶(hù)頁(yè)表項在A位上的一致。因為,當客戶(hù)首次訪(fǎng)問(wèn)某個(gè)線(xiàn)性地址時(shí),由于影子頁(yè)表中沒(méi)有該線(xiàn)性地址到物理地址的對應關(guān)系,將導致一次頁(yè)面故障,VMM可以捕獲該故障,在影子頁(yè)表中建立線(xiàn)性地址到物理地址的對應關(guān)系,并將客戶(hù)頁(yè)表中相應項的A位置1。

對于D位,VMM在影子頁(yè)表中建立線(xiàn)性地址到物理地址間的映射之初,可以將頁(yè)置為只讀,這樣當VM對該頁(yè)進(jìn)行寫(xiě)操作時(shí),將導致頁(yè)面故障,使VMM獲得控制,進(jìn)而有機會(huì )確保影子頁(yè)表項和VM頁(yè)表項在D位上的一致。

上面提到,VMM必須能夠滿(mǎn)足以上各種處理器模式下的內存虛擬化要求,但由于VMX模式要求處理器必須工作在分頁(yè)保護模式下,因此VMM不可能允許客戶(hù)軟件將處理器切換到實(shí)模式或非分頁(yè)保護模式,而只能在分頁(yè)保護模式下為客戶(hù)軟件模擬出類(lèi)似實(shí)模式或非分頁(yè)保護模式的環(huán)境。

可采用一個(gè)v86任務(wù)來(lái)模擬客戶(hù)機所需的實(shí)模式環(huán)境。我們知道,v86軟件在執行時(shí),其邏輯地址經(jīng)16位分段機制轉換為20位線(xiàn)性地址,其后再經(jīng)過(guò)分頁(yè)機制轉換為物理地址。因此,在客戶(hù)機引導之初,VMM可以另客戶(hù)操作系統的實(shí)模式代碼執行于一個(gè)v86任務(wù)中,并為其構造執行所需的頁(yè)表結構,從而接管客戶(hù)軟件對物理內存訪(fǎng)問(wèn)。

客戶(hù)的非分頁(yè)保護模式代碼實(shí)際上是執行在分頁(yè)保護模式之下,只不過(guò)通過(guò)影子CR0等機制使客戶(hù)察覺(jué)不到而已??蛻?hù)邏輯地址經(jīng)32位分段機制轉換后為32位線(xiàn)性地址,而后經(jīng)VMM構造的頁(yè)表轉換為物理地址,從而避免了客戶(hù)軟件對物理內存的直接控制。

3.1.2. 基于EPT的內存虛擬化

基于VTLB進(jìn)行內存虛擬化時(shí),因為客戶(hù)在讀寫(xiě)CR3、執行INVLPG指令或客戶(hù)頁(yè)表不完整等情況下均會(huì )導致VM exit,這導致了內存虛擬化效率很低。較新的Intel處理器中引入了EPTExtended Page Table)技術(shù),用于提高內存虛擬化的效率。

EPT引入了額外的一套頁(yè)表結構,后者定義了客戶(hù)物理地址到主機物理地址之間的映射關(guān)系,所有的客戶(hù)物理地址(如CR3給出的頁(yè)目錄基址、PDE給出的頁(yè)表基址、PTE給出的頁(yè)基址等)須經(jīng)由EPT頁(yè)表結構轉換后用于訪(fǎng)存,其原理如圖3.2所示。

EPTVMM控制,并且僅在處理器工作于非根模式時(shí)才參與地址轉換。采用EPT后,客戶(hù)在讀寫(xiě)CR3和執行INVLPG指令時(shí)不會(huì )導致VM exit,并且由于客戶(hù)頁(yè)表結構自身導致的頁(yè)故障也不會(huì )導致VM exit,因此極大地提高了內存虛擬化的效率,簡(jiǎn)化了內存虛擬化的實(shí)現。 

3.2. KVM實(shí)現

3.2.1. 客戶(hù)物理內存管理

每個(gè)虛擬機都需要擁有一定數量的物理內存。物理內存是寶貴的資源,為了提高物理內存的利用率,也為了在一臺計算機上運行盡可能多的虛擬機,不能將一塊物理內存固定劃分給某個(gè)虛擬機使用,而應該采用按需分配的方式。下面簡(jiǎn)述KVM的內存管理原理,參見(jiàn)圖3.3。

PC機的物理內存通常是不連續的,例如地址0xA00000xFFFFF、0xE00000000xFFFFFFFF等通常留給BIOS ROMMMIO而不是物理內存。設虛擬機包括n塊物理內存,分別記做P1, P2, …, Pn,每塊物理內存的起始地址分別記做PB1, PB2, …, PBn,每塊物理內存的大小分別為PS1, PS2, …, PSn。

在虛擬機創(chuàng )建之初,Qemu使用malloc()從其進(jìn)程地址空間中申請了一塊與虛擬機的物理內存大小相等的區域,設該區域的基地址為B。

接下來(lái),Qemu根據虛擬機的物理內存布局,將該區域劃分成n個(gè)子區域,分別記做V1, V2, …, Vn,第i個(gè)子區域與第i塊物理內存對應,每個(gè)子區域的起始線(xiàn)性地址記做VB1, VB2, …, VBn,每個(gè)子區域的大小等于對應的物理內存塊的大小,仍是PS1, PS2, …, PSn。

然后,QemuKVM內核模塊通告虛擬機的物理內存布局。KVM內核模塊中使用slot結構來(lái)記錄虛擬機的物理內存布局,每一個(gè)物理內存塊對應一個(gè)slot,其中記錄著(zhù)該物理內存塊的起始物理地址PBi、大小PSi等信息,還記錄了該物理內存塊對應的在Qemu線(xiàn)性地址空間中的子區域的起始地址VBi。

當發(fā)生由于頁(yè)故障引發(fā)的VM exit時(shí),VMM首先搜索客戶(hù)頁(yè)表,如果客戶(hù)頁(yè)表中本身就不存在客戶(hù)線(xiàn)性地址GVA到客戶(hù)物理地址GPA的映射,則將該異常事件回注給虛擬機,由客戶(hù)軟件處理該頁(yè)故障。如果在客戶(hù)頁(yè)表中存在GVAGPA的映射,則從客戶(hù)頁(yè)表中得到該GPA,然后根據GPA得到其所屬的slot,進(jìn)而得到該GPA對應的Qemu地址空間中的主機線(xiàn)性地址HVA,然后通過(guò)linux內核函數get_user_pages()確定HVA所對應的主機物理地址HPA,如果HVAHPA的映射不存在,get_user_pages()會(huì )分配物理內存,然后再建立HVAHPA的映射。之后,VMM可以使用該HPA來(lái)構建影子頁(yè)表,即建立GVAHPA的映射。因此,KVM系統中的虛擬機所使用的物理內存是最終還是由Linux內核來(lái)分配的。

3.2.2. VTLB實(shí)現

我們先來(lái)看一下VTLB的基本操作??蛻?hù)真正的訪(fǎng)存是通過(guò)影子頁(yè)表進(jìn)行的,如果影子頁(yè)表中存在客戶(hù)線(xiàn)性地址到物理地址的映射,那么訪(fǎng)存操作就正常進(jìn)行了。如果影子頁(yè)表中不存在客戶(hù)線(xiàn)性地址到物理地址的映射,那么將引發(fā)一次頁(yè)故障,從而導致一次VM exit。VMM獲得控制后,將首先根據引發(fā)異常的客戶(hù)線(xiàn)性地址去查找客戶(hù)頁(yè)表,如果客戶(hù)頁(yè)表本身限制這次訪(fǎng)問(wèn),如到物理地址的映射不存在、違反頁(yè)級保護規則等,VMM將把異常事件回注給客戶(hù),由客戶(hù)操作系統處理該頁(yè)故障。如果客戶(hù)頁(yè)表允許本次訪(fǎng)問(wèn),那么通常本次頁(yè)故障是由于影子頁(yè)表中不存在客戶(hù)線(xiàn)性地址到物理地址的映射引起的,此時(shí)就需要根據客戶(hù)頁(yè)表的內容來(lái)構建相應的影子頁(yè)表,或稱(chēng)為對客戶(hù)頁(yè)表進(jìn)行影射(Shadowing)。

如圖所示,SPDPD的影子頁(yè)表,SPT1/SPT2PT1/PT2的影子頁(yè)表。由于客戶(hù)PDEPTE給出的頁(yè)表基址和頁(yè)基址并不是真正的物理地址,所以我們采用虛線(xiàn)表示PDE到客戶(hù)頁(yè)表以及PTE到普通客戶(hù)頁(yè)的映射關(guān)系。

VMM中用于影子頁(yè)表的內存是受限的,因此當內存緊張時(shí),VMM可能回收一部分影子頁(yè)表。例如,可能回收圖中的影子頁(yè)表SPT2,以后客戶(hù)訪(fǎng)問(wèn)P1時(shí)將導致頁(yè)故障,VMM將再次分配影子頁(yè)表,查詢(xún)客戶(hù)頁(yè)表,并修補客戶(hù)線(xiàn)性地址到P1的映射。

如果完全模擬物理TLB的行為,客戶(hù)機在切換CR3時(shí),VMM需要清空整個(gè)VTLB,使所有影子頁(yè)表的內容無(wú)效。在多進(jìn)程客戶(hù)操作系統中,CR3將被頻繁地切換,某些影子頁(yè)表的內容可能很快就會(huì )被再次用到,而重建影子頁(yè)表是一項十分耗時(shí)的工作。因此,采用完全模擬物理TLB行為的方法構建VTLB在效率上是較差的。

提高效率的主要做法就是緩存影子頁(yè)表,即客戶(hù)切換CR3時(shí)不清空影子頁(yè)表。例如,假設客戶(hù)機上有兩個(gè)進(jìn)程AB,參見(jiàn)圖3,在T1時(shí)刻之前A正在運行,此時(shí)CR3指向進(jìn)程A的影子頁(yè)表。在T1T2時(shí)刻進(jìn)程B運行,此時(shí)CR3指向進(jìn)程B的影子頁(yè)表,但并不丟棄進(jìn)程A的影子頁(yè)表。以后在T3時(shí)刻再次切換到進(jìn)程A時(shí),原來(lái)A的影子頁(yè)表還可以重用,這就避免了全部重新構建A的影子頁(yè)表,提高了效率。

為了實(shí)現緩存影子頁(yè)表的做法,必須意識到以下問(wèn)題的存在:客戶(hù)可能在不通知VMM的情況下,象修改普通內存一樣修改影子頁(yè)表。例如,在進(jìn)程B運行時(shí),客戶(hù)OS可能由于內存的緊張,將屬于進(jìn)程A的內存換出,并將相應的頁(yè)表項的P位置0,而由于A不是當前進(jìn)程,所以客戶(hù)OS不會(huì )使用INVLPG指令刷新TLB,VMM也就無(wú)從得知客戶(hù)修改了進(jìn)程A的頁(yè)表。以后,當進(jìn)程A恢復運行時(shí),由于影子頁(yè)表與客戶(hù)頁(yè)表不一致,將導致錯誤。

因此,在采用緩存影子頁(yè)表的做法時(shí),必須有某種機制保持客戶(hù)頁(yè)表與影子頁(yè)表間的一致性,這可通過(guò)為客戶(hù)頁(yè)表所在的頁(yè)設置寫(xiě)保護來(lái)實(shí)現。

首先必須區別普通客戶(hù)內存和客戶(hù)頁(yè)表,因為效率上的考慮,不能對所有的客戶(hù)頁(yè)面進(jìn)行寫(xiě)保護。當一個(gè)頁(yè)表沒(méi)有用于訪(fǎng)存時(shí),VMM是無(wú)從知道該頁(yè)的身份的。例如,客戶(hù)操作系統在初始化某張頁(yè)表時(shí),VMM不能確定該頁(yè)是普通客戶(hù)內存還是客戶(hù)頁(yè)表,只有以后該表頁(yè)用于訪(fǎng)存時(shí),由于在VTLB中沒(méi)有影射,將導致一次VTLB Fill,并觸發(fā)VMM搜索客戶(hù)頁(yè)表結構,從而得知與引起頁(yè)面故障的客戶(hù)線(xiàn)性地址相關(guān)的客戶(hù)頁(yè)面的真實(shí)身份。

VTLB Fill操作實(shí)際上在客戶(hù)頁(yè)表和影子頁(yè)表之間進(jìn)行了一次同步,為了跟蹤客戶(hù)頁(yè)表的后續變化,應該對客戶(hù)頁(yè)表進(jìn)行寫(xiě)保護。注意,客戶(hù)頁(yè)表也是通過(guò)影子頁(yè)表來(lái)訪(fǎng)問(wèn)的,為了設置寫(xiě)保護就必須知道影子頁(yè)表中訪(fǎng)問(wèn)客戶(hù)頁(yè)表所使用的PTE,為了做到這一點(diǎn),KVM在影子頁(yè)表中建立客戶(hù)線(xiàn)性地址到物理地址的映射關(guān)系的同時(shí),還維護了物理地址到末級頁(yè)表PTE間的逆向映射,即給定客戶(hù)頁(yè)面,能夠方便地得到訪(fǎng)問(wèn)該客戶(hù)頁(yè)面的末級頁(yè)表PTE。圖中,紅色箭頭表示逆向映射。同時(shí),給定一個(gè)客戶(hù)頁(yè)面,如果其逆向映射存在,那么正向映射一定存在,即該客戶(hù)頁(yè)面可以通過(guò)影子頁(yè)表被訪(fǎng)問(wèn)到。

VMMVTLB Fill操作過(guò)程中識別一個(gè)客戶(hù)頁(yè)表,如PT1,就會(huì )通過(guò)逆向映射找到訪(fǎng)問(wèn)其所需的影子頁(yè)表項,如SPT2中的某個(gè)PTE,將PTEWP位置1。以后,客戶(hù)對該客戶(hù)頁(yè)表的修改將導致VM exit,從而使VMM有機會(huì )與客戶(hù)頁(yè)表保持同步。

需注意的問(wèn)題是,內存的緊張可能導致SPT2被回收,因此在識別到一個(gè)客戶(hù)頁(yè)表時(shí),影子頁(yè)表中不一定總存在到客戶(hù)頁(yè)表的映射,也就不能為其設置寫(xiě)保護。但以后客戶(hù)要修改該頁(yè)表時(shí),總要首先在影子頁(yè)表中建立到它的映射,在建立映射時(shí),VMM檢查該客戶(hù)頁(yè)面是否是客戶(hù)頁(yè)表且已被影射*,如果是則置頁(yè)表項的WP位為1。

還有一種可能是,影子頁(yè)表中存在到PT1的映射,但PT1并沒(méi)有被影射。這時(shí),VMM不對PT1進(jìn)行寫(xiě)保護,客戶(hù)可隨意修改PT1,以后當客戶(hù)使用PT1進(jìn)行訪(fǎng)存時(shí),必然會(huì )引起一次VTLB Fill,從而使VMM有機會(huì )影射該客戶(hù)頁(yè)表,與其同步,并在SPT2沒(méi)有被回收的情況下設置對該客戶(hù)頁(yè)表的寫(xiě)保護。

由以上分析中我們還可看出,客戶(hù)頁(yè)表可以很大,但VMM沒(méi)有必要對它們全部進(jìn)行影射,VMM僅需影射那些真正用于訪(fǎng)存的客戶(hù)頁(yè)表。

另外,當客戶(hù)機切換到分頁(yè)保護模式之后,可選擇采用多種分頁(yè)機制,包括普通IA-32分頁(yè)機制、PAE分頁(yè)機制、IA-32e分頁(yè)機制和PSE-36分頁(yè)機制。為了簡(jiǎn)化實(shí)現,KVM的影子頁(yè)表采用PAE分頁(yè)機制或IA-32e分頁(yè)機制實(shí)現,客戶(hù)的普通IA-32分頁(yè)機制和PSE-36分頁(yè)機制可以通過(guò)采用PAE分頁(yè)機制的影子頁(yè)表來(lái)模擬。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
虛擬 Linux
KVM基本原理及架構四
如何在虛擬機和物理機以及虛擬機和虛擬機之間的遷移系統
云計算虛擬化技術(shù)進(jìn)一步解讀(2)
淘寶核心系統團隊博客 | 硬件虛擬化技術(shù)淺析
x86-64安全虛擬機構架
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久