天天看點

KVM 實作機制 (VT-X) 1.    概述 2.    處理器虛拟化 3.    記憶體虛拟化

http://blog.chinaunix.net/uid-23225855-id-3479915.html

1.    概述

1.1.    KVM簡介

KVM是一個基于Linux核心的虛拟機,它屬于完全虛拟化範疇,從Linux-2.6.20開始被包含在Linux核心中。KVM基于x86硬體虛拟化技術,它的運作要求Intel VT-x或AMD SVM的支援。

一般認為,虛拟機監控的實作模型有兩類:監控模型(Hypervisor)和主控端模型(Host-based)。由于監控模型需要進行處理器調 度,還需要實作各種驅動程式,以支撐運作其上的虛拟機,是以實作難度上一般要大于主控端模型。KVM的實作采用主控端模型(Host-based),由于 KVM是內建在Linux核心中的,是以可以自然地使用Linux核心提供的記憶體管理、多處理器支援等功能,易于實作,而且還可以随着Linux核心的發 展而發展。另外,目前KVM的所有I/O虛拟化工作是借助Qemu完成的,也顯著地降低了實作的工作量。以上可以說是KVM的優勢所在。

本文僅分析KVM中與Intel VT-x相關的實作,不考慮KVM中與AMD SVM相關的實作,是以有關術語的使用與Intel VT-x保持一緻。

2.    處理器虛拟化

2.1.    VT-x技術

我們知道處理器一般存在應用程式設計接口和系統程式設計接口。對于x86處理器來說,應用程式設計接口僅向應用程式暴露了通用寄存器、RFLAGS、RIP和一 組非特權指令,而系統程式設計接口向作業系統暴露了全部的ISA(Instruction Set Architecture)。傳統的程序/線程模型也是對處理器的一種虛拟化,但隻是對處理器的應用程式設計接口的虛拟化,而所謂的系統虛拟化(system virtualization)是要實作處理器系統程式設計接口的虛拟化。從這個角度講,系統虛拟化與程序/線程模型相比并無本質的差別。

處理器虛拟化的本質是分時共享。實作虛拟化需要兩個必要條件,第一是能夠讀取和恢複處理器的目前狀态,第二是有某種機制防止虛拟機對系統全局狀态進行修改。

第一個必要條件沒有必要一定由硬體來實作,雖然硬體實作可能比軟體實作更為簡單。例如,x86處理器對多任務,也就是應用程式設計接口虛拟化,提供了硬 件的支援,軟體通常隻需要執行一條指令,就可以實作任務切換,處理器硬體負責儲存目前應用程式設計接口的狀态,并為目标任務恢複應用程式設計接口的狀态。但操作系 統并不一定要使用處理器提供的這種虛拟化機制,完全可以使用軟體來完成應用接口狀态的切換。例如,Linux就沒有使用x86處理器提提供多任務機制,完 全依賴軟體實作任務切換。

第二個必要條件一定要由硬體來實作,通常處理器采用多模式操作(multi-mode operation)來確定這一點。在傳統x86處理器上,共有4種模式的操作,也就是常說的4個特權級。虛拟機(這裡指程序/線程)通常運作在特權級3 上,而虛拟機監控器(這裡指作業系統)運作于特權級0上,程序/線程的所有通路全局的操作,如通路共享的作業系統所在的位址空間,通路I/O等等,均會導 緻異常的發生,被作業系統所截獲并處理,使作業系統有機會向程序/線程提供一個虛拟的世界。

系統虛拟化與程序/線程模型相比并無本質的差別。x86處理器完全有機會以較小的代價提供對系統虛拟化的支援,但很可惜Intel沒有考慮那麼長 遠。x86的4個特權級對于實作系統虛拟化已經足夠了,但傳統的x86處理器上,許多特權指令要求必須在特權級0上執行,如LGDT,是以通常作業系統都 占用了特權級0,也就沒有特權級供虛拟機監控器使用了。為此,許多基于傳統x86處理器的虛拟化軟體不得不采用ring deprivileging方法,讓作業系統運作于特權級1,而由虛拟機監控器使用特權級0。ring deprivileging方法帶來了許多問題,包括:ring aliasing、address space compression、nonfaulting accessing to privileged state、adverse impact on guest transitions、interrupt virtualization、access to hidden state等問題,通常将以上問題統稱為x86平台的虛拟化漏洞。

ring aliasing問題是指,采用ring deprivileging方法時,由于處理器的CPL儲存在CS的低兩位,是以作業系統通過執行PUSH CS指令和一條POP EAX指令可以很容易發現其目前不在特權級0上執行,這違背了虛拟化對作業系統透明的原則。

address space compression問題是指,作業系統通常期望能夠通路整個4GB線性位址空間,但虛拟機監控器可能也需要占用作業系統的一部分線性位址空間,以便其 能夠友善地通路作業系統的位址空間。但如果作業系統是運作于特權級1,那麼作業系統也同樣可以通路虛拟機監控器的存儲空間,對虛拟機監控器造成威脅。

nonfaulting accessing to privileged state問題是指,Intel的特權級機制不能確定所有的通路處理器狀态的指令在低特權級狀态下執行時都産生故障(Fault),這使得作業系統在通路 某些處理器狀态時虛拟機監控器無法獲得控制,也就無法對這些指令進行仿真。例如,IA-32的GDTR, LDTR, IDTR, TR包含了控制處理器狀态的指針,對這些寄存器的修改隻能在特權級0進行,但IA-32允許在所有的特權級中讀取這些寄存器的值。作業系統可以讀取這些寄 存器的值,如果與真實的計算機上的值不同,作業系統就可以認為自己正運作在虛拟機環境中。

adverse impact on guest transitions問題是指,為加快系統調用的速度,Intel引入了SYSENTER和SYSEXIT指令,但SYSENTER指令總是将特權級切 換到0,且從0以外的特權級執行SYSEXIT指令将導緻故障。是以,在采用ring deprivileging方法實作虛拟化時,SYSENTER和SYSEXIT指令總是先陷入到虛拟機監控器,經後者仿真後再交給作業系統,這使系統調 用的速度減慢。

interrupt virtualization問題是指,IA-32使用EFLAGS.IF位來控制中斷的屏蔽,修改IF位需要在CPL<=IOPL的情況下進行, 否則将産生故障。作業系統可能需要頻繁地修改IF位,會頻繁地導緻虛拟機監控器的陷入,影響系統性能。而且,有些情況下,虛拟機監控器需要向虛拟機注入事 件,但如果虛拟機正處于中斷屏蔽狀态,虛拟機監控器就必須等待,直到虛拟機打開中斷。虛拟機監控器為了及時得知虛拟機已打開中斷,也必須截獲作業系統對 EFLAGS.IF位的修改。

access to hidden state問題是指,IA-32處理器的某些狀态,例如段描述符高速緩存,是無法通過指令通路的。當虛拟機切換時,IA-32沒有提供儲存和恢複段描述符 高速緩存的手段。也就是說,上文所述的實作虛拟化的第一個必要條件,能夠讀取和恢複處理器的目前狀态,并不完全具備。

總之,雖然采用ring deprivileging方法可能實作系統虛拟化,但具有很多缺陷,且軟體上比較複雜。為此,Intel提出了VT-x技術來解決系統虛拟化問題,其主 要思路是增加一個新的比0還高的特權級,通常稱之為特權級-1,并在硬體上支援系統程式設計接口狀态的儲存和恢複。

首先,VT-x提供了一套稱作VMX(Virtual Machine eXtension)的新的工作模式,工作在該模式下的處理器又具有兩類操作模式:VMX root operation和VMX non-root operation。通常,虛拟機監控器運作在VMX root operation模式下,即所謂的特權級-1,客戶作業系統運作在VMX non-root operation模式下。VMX non-root operation模式仍保留4個特權級,對作業系統來說,VMX non-root operation模式與傳統的x86處理器相容,最大的差别在于當虛拟機執行一些通路全局資源的指令時将導緻虛拟機退出操作(VM exit),進而使虛拟機監控器獲得控制權,以便對通路全局資源的指令進行模拟。以後,虛拟機監控器可以通過虛拟機進入操作(VM entry)使虛拟機重新獲得控制權。

其次,VT-x為系統程式設計接口狀态的切換提供硬體支援。VT-x為每個虛拟機維護至少一個VMCS(Virtual Machine Control Structure)結構,其中儲存了虛拟機和虛拟機監控器的系統程式設計接口狀态。當執行VM exit和VM entry操作時,VT-x自動根據VMCS中的内容完成虛拟機和虛拟機監控器間的系統程式設計接口狀态切換。為系統程式設計接口狀态的切換提供硬體支援是必要 的,因為x86處理器的系統程式設計接口相比應用程式設計接口要複雜的多,且在不停的變化,如較新的處理器可能增加一些MSR(Model Specific Register),這使得單獨依靠軟體來實作系統程式設計接口的儲存和恢複工作變得十分複雜。另外,VT-x還提供了一組指令,使得虛拟機監控器通過一條指 令就可以完成虛拟機間的切換。

VT-x解決了ring deprivileging方法的一系列問題,從硬體上堵住了所謂的x86平台的虛拟化漏洞。由于作業系統所在的VMX non-root operation模式仍具有4個特權級,使得ring aliasing問題不存在了。同時,由于SYSENTER和SYSEXIT指令所引起的adverse impact on guest transitions問題也不存在了;由于VT-x在VM exit和VM entry時完成系統程式設計接口的切換,也就是說虛拟機和虛拟機監控器擁有各自的GDT,也就擁有了各自的位址空間,解決了address space compression問題。同時,虛拟機和虛拟機監控器擁有各自的GDTR/IDTR等寄存器,在虛拟機中通路這些寄存器無需陷入,解決了 nonfaulting accessing to privileged state問題,再者,VMCS中儲存了虛拟機的段描述符高速緩存,是以在虛拟機切換時不會出現access to hidden state問題;通過對VMCS進行設定,可以使處理器在VMX non-root operation模式時的EFLAGS.IF失效,即該标志位不再對中斷屏蔽産生影響,是以作業系統對EFLAGS.IF的頻繁操作不會導緻頻繁的VM exit,解決了interrupt virtualization的問題。

VT-x提供了完備的處理器虛拟化機制,利用VT-x可以在單個硬體平台上虛拟出任意數量的虛拟處理器VCPU。VT-x除了解決了處理器虛拟化的 問題之外,還為記憶體虛拟化和I/O虛拟化提供了支撐。在記憶體虛拟化方面,VT-x為影子頁表的實作提供了支撐,并且在較新的處理器中還提供了EPT機制, 進一步提高了記憶體虛拟化的效率。在I/O虛拟化方面,通過I/O位圖機制可以友善地實作對Programmed I/O的虛拟化,除此之外,VT-x還提供了中斷事件退出機制和中斷事件注入機制,友善對裝置中斷進行虛拟化。

2.2.    KVM實作

作為VMM,KVM分為兩部分,分别是運作于Kernel模式的KVM核心子產品和運作于User模式的Qemu子產品。這裡的Kernel模式和 User模式,實際上指的是VMX根模式下的特權級0和特權級3。另外,KVM将虛拟機所在的運作模式稱為Guest模式。所謂Guest模式,實際上指 的是VMX的非根模式。

KVM 實作機制 (VT-X) 1.    概述 2.    處理器虛拟化 3.    記憶體虛拟化

利用VT-x技術的支援,KVM中的每個虛拟機可具有多個虛拟處理器VCPU,每個VCPU對應一個Qemu線程,VCPU的建立、初始化、運作以及退出處理都在Qemu線程上下文中進行,需要Kernel、User和Guest三種模式互相配合,其工作模型如圖2.1所示。Qemu線程與KVM核心子產品間以ioctl的方式進行互動,而KVM核心子產品與客戶軟體之間通過VM Exit和VM entry操作進行切換。

Qemu線程以ioctl的方式訓示KVM核心子產品進行VCPU的建立和初始化等操作,主要指VMM建立VCPU運作所需的各種資料結構并初始化。其中很重要的一個資料結構就是VMCS,其初始化配置見附2。

初始化工作完成之後,Qemu線程以ioctl的方式向KVM核心子產品發出運作VCPU的訓示,後者執行VM entry操作,将處理器由kernel模式切換到Guest模式,中止主控端軟體,轉而運作客戶軟體。注意,主控端軟體被中止時,正處于Qemu線程上 下文,且正在執行ioctl系統調用的kernel模式處理程式。客戶軟體在運作過程中,如發生異常或外部中斷等事件,或執行I/O操作,可能導緻VM exit,将處理器狀态由Guest模式切換回Kernel模式。KVM核心子產品檢查發生VM exit的原因,如果VM exit由于I/O操作導緻,則執行系統調用傳回操作,将I/O操作交給處于User模式的Qemu線程來處理,Qemu線程在處理完I/O操作後再次執 行ioctl,訓示KVM切換處理器到Guest模式,恢複客戶軟體的運作;如果VM exit由于其它原因導緻,則由KVM核心子產品負責處理,并在處理後切換處理器到Guest模式,恢複客戶機的運作。

3.    記憶體虛拟化

3.1.    VT-x記憶體虛拟化介紹

3.1.1.   基于VTLB的記憶體虛拟化

對于x86平台來說,處理器在加電或複位後處于實模式,此後在作業系統的操縱下一般會先切換到非分頁保護模式,最後在切換到分頁保護模式。VMM必 須能夠滿足以上各種模式下的記憶體虛拟化要求,完全控制客戶機對實體位址的通路,實作虛拟機間實體記憶體的隔離,并對客戶機保持透明。客戶機絕大多數情況下将 工作在分頁保護模式下,是以我們首先介紹客戶機工作在分頁保護模式時的記憶體虛拟化。

我們知道,當處理器未啟動VMX模式時,頁表機制确定了線性位址到實體位址的對應關系。為了加快位址轉換的效率,減少位址轉換過程中的頁表通路次 數,處理器使用TLB(Translation Lookaside Buffer)來緩存線性位址到實體位址的映射關系。實際的位址轉換過程中,處理器首先根據線性位址查找TLB,如果未發現該線性位址到實體位址的映射關 系(TLB miss),将根據頁表中的映射關系填充TLB(TLB fill),然後再進行位址轉換。是以,頁表雖然确定了線性位址到實體位址的對應關系,但它并不直接控制線性位址到實體位址的轉換,這種轉換是由TLB控 制的。在不會導緻位址轉換錯誤的前提下,處理器不要求TLB的内容一定與頁表保持一緻,例如一次程序切換後,TLB的内容可能都是無效的,但程序的頁表卻 是有效的,此時頁表和TLB是不一緻的,以後通路記憶體時會引發TLB miss,并通過TLB fill令某個頁表項與某個TLB項保持一緻。

VT-x中可采用一種稱為Virtual TLB(VTLB)的技術來實作記憶體虛拟化,其思想就源于上述多級頁表與TLB間的互動機制,其工作機制如圖3.1所示。VM的頁表并不直接控制線性位址 到實體位址的轉換,即CR3寄存器并不指向VM的頁目錄,而是指向VMM維護的影子頁表(Shadow Page Table),是以線性位址到實體位址的轉換是由影子頁表和TLB來控制的,影子頁表和TLB共同構成了所謂的Virtual TLB。VM可以任意修改其頁表,而不會導緻VM exit,由此可能産生兩種VM頁表與VTLB之間的不一緻情況。

第一種不一緻是指VM的頁表擁有比影子頁表更多的通路能力,可以利用頁面故障來修補這種不一緻性。例如VM頁表有某個線性位址到實體的對應關系而影子頁表中卻沒有,那麼VM對該線性位址的通路将導緻頁面故障。VMM可以捕獲該異常,進而根據VM的頁表來修改影子頁表。

第二種不一緻是指VM的頁表的通路能力不及影子頁表,那麼一定是由于VM修改了自己的頁表,并且把頁表的通路權限降低了,例如頁面交換将頁表項的P 位置0,但該操作并不會馬上反映到TLB中。此時,VM需要執行INVLPG指令或重裝CR3寄存器來重新整理TLB,VM在執行INVLPG指令或重裝 CR3寄存器時将導緻VM exit,使VMM有機會根據VM的頁表來修改影子頁表,進而修補這種不一緻性。

另外,處理器在進行記憶體通路時會自動修改頁表項的A位或D位。A位在所有級别的頁表項中都存在,但在TLB entry中并不緩存A位,原因是本次訪存操作涉及的各個級别的頁表項都允許本次通路,才會在TLB中生成一個entry,是以隻要TLB中存在一個 entry,那麼一定已經将entry相關的各級頁表項都通路過了,各級頁表項的A位都是1。處理器在初次通路一個頁表項時,将其A位置1,但由軟體負責 将A位清0。如果軟體将A位由1變成0,它應該使用INVLPG指令使對應的TLB entry失效。如果不這樣做,那麼在訪存時,總是使用TLB中緩存的entry,處理器認為頁表項中的A位已經是1了,進而不會将A位由0改為1。在軟 件看來,好象該頁自将A位置0以來未曾被通路過,而實際情況并不是這樣。

D位僅在最後一級頁表中存在,而且在TLB entry中也緩存D位。當首次寫一個頁時,如果TLB entry不存在或其D位為0,則将頁表項中的D位置1,同A位相同,由軟體負責将D位置1。如果軟體将PTE的D位由1變成0,應該使用INVLPG指 令使對應的TLB entry失效。如果不這樣做,那麼再次寫該頁時,總是優先使用緩存的TLB entry,并且TLB entry的D位為1,這時處理器認為PTE的D位已經是1了,它不會再将其置1。在軟體看來,好象該頁自将D位置0以來未曾被寫過,而實際情況并不是這 樣。

由于VM進行記憶體通路實際使用的是影子頁表,是以這種修改不能自動反映到客戶頁表中,進而導緻客戶頁表和影子頁表的不一緻。應該有某種機制使VMM得以捕獲處理器對影子頁表的A位和D位的初次修改,并更新VM頁表,進而解決這種不一緻性。

對于A位,隻要VMM不先于VM建立線性位址到實體位址的映射關系,就可以確定捕獲客戶對記憶體的通路,進而有機會確定影子頁表項和客戶頁表項在A位 上的一緻。因為,當客戶首次通路某個線性位址時,由于影子頁表中沒有該線性位址到實體位址的對應關系,将導緻一次頁面故障,VMM可以捕獲該故障,在影子 頁表中建立線性位址到實體位址的對應關系,并将客戶頁表中相應項的A位置1。

對于D位,VMM在影子頁表中建立線性位址到實體位址間的映射之初,可以将頁置為隻讀,這樣當VM對該頁進行寫操作時,将導緻頁面故障,使VMM獲得控制,進而有機會確定影子頁表項和VM頁表項在D位上的一緻。

KVM 實作機制 (VT-X) 1.    概述 2.    處理器虛拟化 3.    記憶體虛拟化

上面提到,VMM必須能夠滿足以上各種處理器模式下的記憶體虛拟化要求,但由于VMX模式要求處理器必須工作在分頁保護模式下,是以VMM不可能允許客戶軟體将處理器切換到實模式或非分頁保護模式,而隻能在分頁保護模式下為客戶軟體模拟出類似實模式或非分頁保護模式的環境。

可采用一個v86任務來模拟客戶機所需的實模式環境。我們知道,v86軟體在執行時,其邏輯位址經16位分段機制轉換為20位線性位址,其後再經過 分頁機制轉換為實體位址。是以,在客戶機引導之初,VMM可以另客戶作業系統的實模式代碼執行于一個v86任務中,并為其構造執行所需的頁表結構,進而接 管客戶軟體對實體記憶體通路。

客戶的非分頁保護模式代碼實際上是執行在分頁保護模式之下,隻不過通過影子CR0等機制使客戶察覺不到而已。客戶邏輯位址經32位分段機制轉換後為32位線性位址,而後經VMM構造的頁表轉換為實體位址,進而避免了客戶軟體對實體記憶體的直接控制。

3.1.2.   基于EPT的記憶體虛拟化

基于VTLB進行記憶體虛拟化時,因為客戶在讀寫CR3、執行INVLPG指令或客戶頁表不完整等情況下均會導緻VM exit,這導緻了記憶體虛拟化效率很低。較新的Intel處理器中引入了EPT(Extended Page Table)技術,用于提高記憶體虛拟化的效率。

EPT引入了額外的一套頁表結構,後者定義了客戶實體位址到主機實體位址之間的映射關系,所有的客戶實體位址(如CR3給出的頁目錄基址、PDE給出的頁表基址、PTE給出的頁基址等)須經由EPT頁表結構轉換後用于訪存,其原理如圖3.2所示。

KVM 實作機制 (VT-X) 1.    概述 2.    處理器虛拟化 3.    記憶體虛拟化

EPT由VMM控制,并且僅在處理器工作于非根模式時才參與位址轉換。采用EPT後,客戶在讀寫CR3和執行INVLPG指令時不會導緻VM exit,并且由于客戶頁表結構自身導緻的頁故障也不會導緻VM exit,是以極大地提高了記憶體虛拟化的效率,簡化了記憶體虛拟化的實作。 

3.2.    KVM實作

3.2.1.   客戶實體記憶體管理

每個虛拟機都需要擁有一定數量的實體記憶體。實體記憶體是寶貴的資源,為了提高實體記憶體的使用率,也為了在一台計算機上運作盡可能多的虛拟機,不能将一塊實體記憶體固定劃分給某個虛拟機使用,而應該采用按需配置設定的方式。下面簡述KVM的記憶體管理原理,參見圖3.3。

PC機的實體記憶體通常是不連續的,例如位址0xA0000至0xFFFFF、0xE0000000至0xFFFFFFFF等通常留給BIOS ROM和MMIO而不是實體記憶體。設虛拟機包括n塊實體記憶體,分别記做P1, P2, …, Pn,每塊實體記憶體的起始位址分别記做PB1, PB2, …, PBn,每塊實體記憶體的大小分别為PS1, PS2, …, PSn。

在虛拟機建立之初,Qemu使用malloc()從其程序位址空間中申請了一塊與虛拟機的實體記憶體大小相等的區域,設該區域的基位址為B。

KVM 實作機制 (VT-X) 1.    概述 2.    處理器虛拟化 3.    記憶體虛拟化

接下來,Qemu根據虛拟機的實體記憶體布局,将該區域劃分成n個子區域,分别記做V1, V2, …, Vn,第i個子區域與第i塊實體記憶體對應,每個子區域的起始線性位址記做VB1, VB2, …, VBn,每個子區域的大小等于對應的實體記憶體塊的大小,仍是PS1, PS2, …, PSn。

然後,Qemu向KVM核心子產品通告虛拟機的實體記憶體布局。KVM核心子產品中使用slot結構來記錄虛拟機的實體記憶體布局,每一個實體記憶體塊對應一 個slot,其中記錄着該實體記憶體塊的起始實體位址PBi、大小PSi等資訊,還記錄了該實體記憶體塊對應的在Qemu線性位址空間中的子區域的起始位址 VBi。

當發生由于頁故障引發的VM exit時,VMM首先搜尋客戶頁表,如果客戶頁表中本身就不存在客戶線性位址GVA到客戶實體位址GPA的映射,則将該異常事件回注給虛拟機,由客戶軟 件處理該頁故障。如果在客戶頁表中存在GVA到GPA的映射,則從客戶頁表中得到該GPA,然後根據GPA得到其所屬的slot,進而得到該GPA對應的 Qemu位址空間中的主機線性位址HVA,然後通過linux核心函數get_user_pages()确定HVA所對應的主機實體位址HPA,如果 HVA到HPA的映射不存在,get_user_pages()會配置設定實體記憶體,然後再建立HVA到HPA的映射。之後,VMM可以使用該HPA來建構影 子頁表,即建立GVA到HPA的映射。是以,KVM系統中的虛拟機所使用的實體記憶體是最終還是由Linux核心來配置設定的。

3.2.2.   VTLB實作

我們先來看一下VTLB的基本操作。客戶真正的訪存是通過影子頁表進行的,如果影子頁表中存在客戶線性位址到實體位址的映射,那麼訪存操作就正常進 行了。如果影子頁表中不存在客戶線性位址到實體位址的映射,那麼将引發一次頁故障,進而導緻一次VM exit。VMM獲得控制後,将首先根據引發異常的客戶線性位址去查找客戶頁表,如果客戶頁表本身限制這次通路,如到實體位址的映射不存在、違反頁級保護 規則等,VMM将把異常事件回注給客戶,由客戶作業系統處理該頁故障。如果客戶頁表允許本次通路,那麼通常本次頁故障是由于影子頁表中不存在客戶線性位址 到實體位址的映射引起的,此時就需要根據客戶頁表的内容來建構相應的影子頁表,或稱為對客戶頁表進行影射(Shadowing)。

如圖所示,SPD是PD的影子頁表,SPT1/SPT2是PT1/PT2的影子頁表。由于客戶PDE和PTE給出的頁表基址和頁基址并不是真正的實體位址,是以我們采用虛線表示PDE到客戶頁表以及PTE到普通客戶頁的映射關系。

KVM 實作機制 (VT-X) 1.    概述 2.    處理器虛拟化 3.    記憶體虛拟化

VMM中用于影子頁表的記憶體是受限的,是以當記憶體緊張時,VMM可能回收一部分影子頁表。例如,可能回收圖中的影子頁表SPT2,以後客戶通路P1時将導緻頁故障,VMM将再次配置設定影子頁表,查詢客戶頁表,并修補客戶線性位址到P1的映射。

如果完全模拟實體TLB的行為,客戶機在切換CR3時,VMM需要清空整個VTLB,使所有影子頁表的内容無效。在多程序客戶作業系統中,CR3将 被頻繁地切換,某些影子頁表的内容可能很快就會被再次用到,而重建影子頁表是一項十分耗時的工作。是以,采用完全模拟實體TLB行為的方法建構VTLB在 效率上是較差的。

提高效率的主要做法就是緩存影子頁表,即客戶切換CR3時不清空影子頁表。例如,假設客戶機上有兩個程序A和B,參見圖3,在T1時刻之前A正在運 行,此時CR3指向程序A的影子頁表。在T1至T2時刻程序B運作,此時CR3指向程序B的影子頁表,但并不丢棄程序A的影子頁表。以後在T3時刻再次切 換到程序A時,原來A的影子頁表還可以重用,這就避免了全部重新建構A的影子頁表,提高了效率。

為了實作緩存影子頁表的做法,必須意識到以下問題的存在:客戶可能在不通知VMM的情況下,象修改普通記憶體一樣修改影子頁表。例如,在程序B運作 時,客戶OS可能由于記憶體的緊張,将屬于程序A的記憶體換出,并将相應的頁表項的P位置0,而由于A不是目前程序,是以客戶OS不會使用INVLPG指令刷 新TLB,VMM也就無從得知客戶修改了程序A的頁表。以後,當程序A恢複運作時,由于影子頁表與客戶頁表不一緻,将導緻錯誤。

是以,在采用緩存影子頁表的做法時,必須有某種機制保持客戶頁表與影子頁表間的一緻性,這可通過為客戶頁表所在的頁設定寫保護來實作。

首先必須差別普通客戶記憶體和客戶頁表,因為效率上的考慮,不能對所有的客戶頁面進行寫保護。當一個頁表沒有用于訪存時,VMM是無從知道該頁的身份 的。例如,客戶作業系統在初始化某張頁表時,VMM不能确定該頁是普通客戶記憶體還是客戶頁表,隻有以後該表頁用于訪存時,由于在VTLB中沒有影射,将導 緻一次VTLB Fill,并觸發VMM搜尋客戶頁表結構,進而得知與引起頁面故障的客戶線性位址相關的客戶頁面的真實身份。

VTLB Fill操作實際上在客戶頁表和影子頁表之間進行了一次同步,為了跟蹤客戶頁表的後續變化,應該對客戶頁表進行寫保護。注意,客戶頁表也是通過影子頁表來 通路的,為了設定寫保護就必須知道影子頁表中通路客戶頁表所使用的PTE,為了做到這一點,KVM在影子頁表中建立客戶線性位址到實體位址的映射關系的同 時,還維護了實體位址到末級頁表PTE間的逆向映射,即給定客戶頁面,能夠友善地得到通路該客戶頁面的末級頁表PTE。圖中,紅色箭頭表示逆向映射。同 時,給定一個客戶頁面,如果其逆向映射存在,那麼正向映射一定存在,即該客戶頁面可以通過影子頁表被通路到。

KVM 實作機制 (VT-X) 1.    概述 2.    處理器虛拟化 3.    記憶體虛拟化

當VMM在VTLB Fill操作過程中識别一個客戶頁表,如PT1,就會通過逆向映射找到通路其所需的影子頁表項,如SPT2中的某個PTE,将PTE的WP位置1。以後,客戶對該客戶頁表的修改将導緻VM exit,進而使VMM有機會與客戶頁表保持同步。

需注意的問題是,記憶體的緊張可能導緻SPT2被回收,是以在識别到一個客戶頁表時,影子頁表中不一定總存在到客戶頁表的映射,也就不能為其設定寫保 護。但以後客戶要修改該頁表時,總要首先在影子頁表中建立到它的映射,在建立映射時,VMM檢查該客戶頁面是否是客戶頁表且已被影射*,如果是則置頁表項的WP位為1。

還有一種可能是,影子頁表中存在到PT1的映射,但PT1并沒有被影射。這時,VMM不對PT1進行寫保護,客戶可随意修改PT1,以後當客戶使用 PT1進行訪存時,必然會引起一次VTLB Fill,進而使VMM有機會影射該客戶頁表,與其同步,并在SPT2沒有被回收的情況下設定對該客戶頁表的寫保護。

由以上分析中我們還可看出,客戶頁表可以很大,但VMM沒有必要對它們全部進行影射,VMM僅需影射那些真正用于訪存的客戶頁表。

另外,當客戶機切換到分頁保護模式之後,可選擇采用多種分頁機制,包括普通IA-32分頁機制、PAE分頁機制、IA-32e分頁機制和PSE- 36分頁機制。為了簡化實作,KVM的影子頁表采用PAE分頁機制或IA-32e分頁機制實作,客戶的普通IA-32分頁機制和PSE-36分頁機制可以 通過采用PAE分頁機制的影子頁表來模拟。

KVM 實作機制 (VT-X) 1.    概述 2.    處理器虛拟化 3.    記憶體虛拟化
KVM

繼續閱讀