您好,登錄后才能下訂單哦!
KVM虛擬化技術中如何進行Hypervisor的實現,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
VMM(VirtualMachineMonitor)對物理資源的虛擬可以劃分為三個部分:
CPU虛擬化、內存虛擬化和I/O設備虛擬化,其中以CPU的虛擬化最為關鍵。經典的虛擬化方法:現代計算機體系結構一般至少有兩個特權級(即用戶態和核心態,x86有四個特權級Ring0~Ring3)用來分隔系統軟件和應用軟件。那些只能在處理器的最高特權級(內核態)執行的指令稱之為特權指令,一般可讀寫系統關鍵資源的指令(即敏感指令)決大多數都是特權指令(X86存在若干敏感指令是非特權指令的情況)。如果執行特權指令時處理器的狀態不在內核態,通常會引發一個異常而交由系統軟件來處理這個非法訪問(陷入)。經典的虛擬化方法就是使用“特權解除”和“陷入-模擬”的方式,即將GuestOS運行在非特權級,而將VMM運行于最高特權級(完全控制系統資源)。解除了GuestOS的特權級后,GuestOS的大部分指令仍可以在硬件上直接運行,只有執行到特權指令時,才會陷入到VMM模擬執行(陷入-模擬)。“陷入-模擬”的本質是保證可能影響VMM正確運行的指令由VMM模擬執行,大部分的非敏感指令還是照常運行。
因為X86指令集中有若干條指令是需要被VMM捕獲的敏感指令,但是卻不是特權指令(稱為臨界指令),因此“特權解除”并不能導致他們發生陷入模擬,執行它們不會發生自動的“陷入”而被VMM捕獲,從而阻礙了指令的虛擬化,這也稱之為X86的虛擬化漏洞。
X86架構虛擬化的實現方式可分為:
1、X86“全虛擬化”(指所抽象的VM具有完全的物理機特性,OS在其上運行不需要任何修改)Full派秉承無需修改直接運行的理念,對“運行時監測,捕捉后模擬”的過程進行優化。該派內部之實現又有些差別,其中以VMWare為代表的基于二進制翻譯(BT)的全虛擬化為代表,其主要思想是在執行時將VM上執行的GuestOS指令,翻譯成x86指令集的一個子集,其中的敏感指令被替換成陷入指令。翻譯過程與指令執行交叉進行,不含敏感指令的用戶態程序可以不經翻譯直接執行。
2、X86“半虛擬化”(指需OS協助的虛擬化,在其上運行的OS需要修改)半虛擬化的基本思想是通過修改GuestOS的代碼,將含有敏感指令的操作,替換為對VMM的超調用Hypercall,類似OS的系統調用,將控制權轉移到VMM,該技術因VMM項目而廣為人知。該技術的優勢在于VM的性能能接近于物理機,缺點在于需要修改GuestOS(如:Windows不支持修改)及增加的維護成本,關鍵修改GuestOS會導致操作系統對特定hypervisor的依賴性,因此很多虛擬化廠商基于VMM開發的虛擬化產品部分已經放棄了Linux半虛擬化,而專注基于硬件輔助的全虛擬化開發,來支持未經修改的操作系統。
3、X86“硬件輔助虛擬化”:其基本思想就是引入新的處理器運行模式和新的指令,使得VMM和GuestOS運行于不同的模式下,GuestOS運行于受控模式,原來的一些敏感指令在受控模式下全部會陷入VMM,這樣就解決了部分非特權的敏感指令的“陷入-模擬”難題,而且模式切換時上下文的保存恢復由硬件來完成,這樣就大大提高了“陷入-模擬”時上下文切換的效率。
以IntelVT-x硬件輔助虛擬化技術為例,該技術增加了在虛擬狀態下的兩種處理器工作模式:根(Root)操作模式和非根(Non-root)操作模式。VMM運作在Root操作模式下,而GuestOS運行在Non-root操作模式下。這兩個操作模式分別擁有自己的特權級環,VMM和虛擬機的GuestOS分別運行在這兩個操作模式的0環。這樣,既能使VMM運行在0環,也能使GuestOS運行在0環,避免了修改GuestOS。Root操作模式和Non-root操作模式的切換是通過新增的CPU指令(如:VMXON,VMXOFF)來完成。
硬件輔助虛擬化技術消除了操作系統的ring轉換問題,降低了虛擬化門檻,支持任何操作系統的虛擬化而無須修改OS內核,得到了虛擬化軟件廠商的支持。硬件輔助虛擬化技術已經逐漸消除軟件虛擬化技術之間的差別,并成為未來的發展趨勢。
2 vCPU機制
vCPU調度機制
對虛擬機來說,不直接感知物理CPU,虛擬機的計算單元通過vCPU對象來呈現。虛擬機只看到VMM呈現給它的vCPU。在VMM中,每個vCPU對應一個VMCS(Virtual-MachineControlStructure)結構,當vcpu被從物理CPU上切換下來的時候,其運行上下文會被保存在其對應的VMCS結構中當vcpu被切換到pcpu上運行時,其運行上下文會從對應的VMCS結構中導入到物理CPU上。通過這種方式,實現各vCPU之間的獨立運行。從虛擬機系統的結構與功能劃分可以看出,客戶操作系統與虛擬機監視器
共同構成了虛擬機系統的兩級調度框架,如圖所示是一個多核環境下虛擬機系統的兩級調度框架。客戶操作系統負責第2級調度,即線程或進程在vCPU上的調度(將核心線程映射到相應的虛擬CPU上)。虛擬機監視器負責第1級調度,即vCPU在物理處理單元上的調度。兩級調度的調度策略和機制不存在依賴關系。vCPU調度器負責物理處理器資源在各個虛擬機之間的分配與調度,本質上即把各個虛擬機中的vCPU按照一定的策略和機制調度在物理處理單元上可以采用任意的策略來分配物理資源,滿足虛擬機的不同需求。vCPU可以調度在一個或多個物理處理單元執行(分時復用或空間復用物理處理單元),也可以與物理處理單元建立一對一固定的映射關系(限制訪問指定的物理處理單元)。
2 內存虛擬化
內存虛擬化三層模型
因為VMM(VirtualMachineMonitor)掌控所有系統資源,因此VMM握有整個內存資源,其負責頁式內存管理,維護虛擬地址到機器地址的映射關系。因GuestOS本身亦有頁式內存管理機制,則有VMM的整個系統就比正常系統多了一層映射:
A.虛擬地址(VA),指GuestOS提供給其應用程序使用的線性地址空間;B.物理地址(PA),經VMM抽象的、虛擬機看到的偽物理地址;
C.機器地址(MA),真實的機器地址,即地址總線上出現的地址信號;映射關系如下:GuestOS:PA=f(VA)、VMM:MA=g(PA)VMM維護一
套頁表,負責PA到MA的映射。GuestOS維護一套頁表,負責VA到PA的映射。實際運行時,用戶程序訪問VA1,經GuestOS的頁表轉換得到PA1,再由VMM介入,使用VMM的頁表將PA1轉換為MA1。
2 頁表虛擬化技術
普通MMU只能完成一次虛擬地址到物理地址的映射,在虛擬機環境下,經過MMU轉換所得到的“物理地址”并不是真正的機器地址。若需得到真正的機器地址,必須由VMM介入,再經過一次映射才能得到總線上使用的機器地址。如果虛擬機的每個內存訪問都需要VMM介入,并由軟件模擬地址轉換的效率是很低下的,幾乎不具有實際可用性,為實現虛擬地址到機器地址的高效轉換,現普遍采用的思想是:由VMM根據映射f和g生成復合的映射fg,并直接將這個映射關系寫入MMU。當前采用的頁表虛擬化方法主要是MMU類虛擬化(MMUParavirtualization)和影子頁表,后者已被內存的硬件輔助虛擬化技術所替代。
1、MMUParavirtualization
其基本原理是:當GuestOS創建一個新的頁表時,會從它所維護的空閑內存中分配一個頁面,并向VMM注冊該頁面,VMM會剝奪GuestOS對該頁表的寫權限,之后GuestOS對該頁表的寫操作都會陷入到VMM加以驗證和轉換。VMM會檢查頁表中的每一項,確保他們只映射了屬于該虛擬機的機器頁面,而且不得包含對頁表頁面的可寫映射。后VMM會根據自己所維護的映射關系,將頁表項中的物理地址替換為相應的機器地址,最后再把修改過的頁表載入MMU。如此,MMU就可以根據修改過頁表直接完成虛擬地址到機器地址的轉換。
2、內存硬件輔助虛擬化
內存硬件輔助虛擬化技術原理圖
內存的硬件輔助虛擬化技術是用于替代虛擬化技術中軟件實現的“影子頁表”的一種硬件輔助虛擬化技術,其基本原理是:GVA(客戶操作系統的虛擬地址)->GPA(客戶操作系統的物理地址)->HPA(宿主操作系統的物理地址)兩次地址轉換都由CPU硬件自動完成(軟件實現內存開銷大、性能差)。以VT-x技術的頁表擴充技術ExtendedPageTable(EPT)為例,首先VMM預先把客戶機物理地址轉換到機器地址的EPT頁表設置到CPU中;其次客戶機修改客戶機頁表無需VMM干預;最后,地址轉換時,CPU自動查找兩張頁表完成客戶機虛擬地址到機器地址的轉換。使用內存的硬件輔助虛擬化技術,客戶機運行過程中無需VMM干預,去除了大量軟件開銷,內存訪問性能接近物理機。
I/O設備虛擬化
VMM通過I/O虛擬化來復用有限的外設資源,其通過截獲GuestOS對I/O設備的訪問請求,然后通過軟件模擬真實的硬件,目前I/O設備的虛擬化方式主要有三種:設備接口完全模擬、前端/后端模擬、直接劃分。
1、設備接口完全模擬:
即軟件精確模擬與物理設備完全一樣的接口,GuestOS驅動無須修改就能驅動這個虛擬設備。
優點:沒有額外的硬件開銷,可重用現有驅動程序;
缺點:為完成一次操作要涉及到多個寄存器的操作,使得VMM要截獲每個寄存器訪問并進行相應的模擬,這就導致多次上下文切換;由于是軟件模擬,性能較低。
2、前端/后端模擬:
VMM提供一個簡化的驅動程序(后端,Back-End),GuestOS中的驅動程序為前端(Front-End,FE),前端驅動將來自其他模塊的請求通過與GuestOS間的特殊通信機制直接發送給GuestOS的后端驅動,后端驅動在處理完請求后再發回通知給前端,VMM即采用該方法。
優點:基于事務的通信機制,能在很大程度上減少上下文切換開銷,沒有額外的硬件開銷;
缺點:需要GuestOS實現前端驅動,后端驅動可能成為瓶頸。
3、直接劃分:
即直接將物理設備分配給某個GuestOS,由GuestOS直接訪問I/O設備(不經VMM),目前與此相關的技術有IOMMU(IntelVT-d,PCI-SIG之SR-IOV等),旨在建立高效的I/O虛擬化直通道。
優點:可重用已有驅動,直接訪問減少了虛擬化開銷;
缺點:需要購買較多額外的硬件。
關于KVM虛擬化技術中如何進行Hypervisor的實現問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。