虚拟化的发展历程和实现原理——图文详解
前言
現(xiàn)在市場上最常見的虛擬化軟件有VMWare workstation(VMWare)、VirtualBox(Oracle)、Hyper-V(Microsoft)、KVM(Redhat)、Xen等,這些軟件統(tǒng)稱之為VMM(Virtual Machine Monitor),使用不同的虛擬化實(shí)現(xiàn)。而這些虛擬化實(shí)現(xiàn)的方式可以分為全虛擬化、半虛擬化、硬件虛擬化等,本篇主要是理解這些虛擬化實(shí)現(xiàn)的原理。
虛擬化
虛擬化的誕生與實(shí)現(xiàn):?
1961年?IBM709機(jī)實(shí)現(xiàn)了分時(shí)系統(tǒng),將CPU占用切分為多個(gè)極短(1/100sec)時(shí)間片,每一個(gè)時(shí)間片都執(zhí)行著不同的任務(wù)。通過對這些時(shí)間片的輪詢,這樣就可以將一個(gè)CPU虛擬化或者偽裝成為多個(gè)CPU,并且讓每一顆虛擬CPU看起來都是在同時(shí)運(yùn)行,這就是虛擬機(jī)的雛形。后來的system360機(jī)都支持分時(shí)系統(tǒng)。?
1972年?IBM正式將system370機(jī)的分時(shí)系統(tǒng)命名為虛擬機(jī)。?
1990年?IBM推出的system390機(jī)支持邏輯分區(qū),即將一個(gè)cpu分為若干份(最多10份),而且每份cpu都是獨(dú)立的,也就是一個(gè)物理cpu可以邏輯的分為10個(gè)cpu。
直到IBM將分時(shí)系統(tǒng)開源后,個(gè)人PC終于臨來了虛擬化的開端,后來才有了上述的虛擬機(jī)軟件的發(fā)展。所以至今為止仍然有一部分虛擬機(jī)軟件應(yīng)用來了分時(shí)系統(tǒng)作為虛擬化的基礎(chǔ)實(shí)現(xiàn)。
虛擬化的目的:使用邏輯來表示資源,從而擺脫物理限制的約束。提高物理資源的利用率。?
虛擬化的原理:在OS中加入一個(gè)虛擬化層(VMM),虛擬化層可以對下層(HostOS)硬件資源(物理CPU、內(nèi)存、磁盤、網(wǎng)卡、顯卡等)進(jìn)行封裝、隔離,抽象為另一種形式的邏輯資源,再提供給上層(GuestOS)使用。所以你可以理解VMM其實(shí)就是聯(lián)系HostOS和GuestOS的一個(gè)中間件,當(dāng)然虛擬化可以將一份資源抽象為多份,也可以將多份資源抽象為一份。
通過虛擬化技術(shù)實(shí)現(xiàn)的虛擬機(jī)一般被稱之為GuestOS(客戶),而作為GuestOS載體的物理主機(jī)稱之為HostOS(宿主)。
虛擬機(jī)Virtual Machine
- 由VMM提供的高效(>80%)、獨(dú)立的計(jì)算機(jī)系統(tǒng)
- 擁有自己的虛擬硬件(CPU、內(nèi)存、網(wǎng)絡(luò)設(shè)備、存儲(chǔ)設(shè)備)
- 對于上層軟件,虛擬機(jī)就是真實(shí)的機(jī)器
- Virtual Machine Monitor
滿足上面幾個(gè)條件的OS就是虛擬機(jī)。?
VM的特性?
同質(zhì):VM的本質(zhì)與物理機(jī)的本質(zhì)相同,e.g. CPU的ISA(指令集架構(gòu)?Instruction Set Architecture)相同?
高效:性能與物理機(jī)接近,在VM上執(zhí)行的大多數(shù)指令應(yīng)該有權(quán)限和能力直接在硬件上執(zhí)行,只有少數(shù)的敏感指令由VMM來處理。對于VM的性能效率在上一篇?
資源可控:VMM對物理機(jī)和虛擬機(jī)的資源都是絕對可控的?
Redhat曾經(jīng)測試過一些應(yīng)用服務(wù)在虛擬機(jī)上運(yùn)行的效率。一部分的報(bào)告如下:
| VM=HOST * 90% | VM=HOST * 90% | VM=HOST * 90% | VM=HOST * 94% | VM=HOST * 138% |
NOTE:LAMP在VM上運(yùn)行的效率之所以能夠提高是因?yàn)閷pache、PHP/Python、MySQL?3個(gè)應(yīng)用服務(wù)拆分到3個(gè)不同的VM中運(yùn)行。?
虛擬化的分類
在虛擬化發(fā)展的早期主要以全虛擬化和半虛擬化兩大流派為主,兩者各有優(yōu)缺點(diǎn)。如果能適當(dāng)?shù)膶⑵鋺?yīng)用不同的環(huán)境中,就能充分的發(fā)揮兩者的特性以獲得更高的收益。隨著這兩大流派的分歧和競爭愈演愈烈,由Intel領(lǐng)銜的硬件廠商也紛紛加入到虛擬化的浪潮中,開啟了(大航海時(shí)代)硬件虛擬化的時(shí)代,從此全虛擬化和半虛擬化前進(jìn)的道路逐漸有了靠攏的趨勢。再到后來的?第二代的內(nèi)存虛擬化、第三代的總線虛擬化?的出現(xiàn)和興起,當(dāng)下虛擬化市場已經(jīng)不再以單純賣賣虛擬化軟件為主要盈利手段,而是將虛擬化技術(shù)整合在更大、更完善的虛擬化平臺(tái)解決方案中。其中包括Redhat的RHEV、VMWare的vSphere等。
x86 CPU架構(gòu)與虛擬化的關(guān)系
在理解各種虛擬化的實(shí)現(xiàn)之前,先看看一般x86 CPU的架構(gòu)
注意:CPU為了保證代碼執(zhí)行的安全性、多用戶的獨(dú)立性、保護(hù)OS的正常運(yùn)行,實(shí)現(xiàn)了CPU執(zhí)行狀態(tài)的概念。這樣能夠限制不同程序之間的訪問能力,避免一個(gè)程序獲取另一個(gè)程序的內(nèi)存數(shù)據(jù),同時(shí)也避免了程序錯(cuò)誤操作物理硬件。一般CPU都會(huì)劃分為用戶態(tài)和內(nèi)核態(tài),x86更是細(xì)分為了Ring3~0四種狀態(tài)。
Ring3 用戶態(tài)(User Mode):運(yùn)行在用戶態(tài)的代碼需要受到CPU的檢查,這些代碼只能訪問內(nèi)存頁表項(xiàng)中規(guī)定能被用戶態(tài)訪問的頁面的虛擬地址(受限的訪問內(nèi)存),而且只能訪問TSS中的I/O Permission Bitmap中規(guī)定能被用戶態(tài)訪問的端口。甚至不能訪問外圍設(shè)備、不能搶占CPU。所有的用戶程序(Application)都運(yùn)行在用戶態(tài)。——當(dāng)運(yùn)行在用戶態(tài)的應(yīng)用程序需要調(diào)用硬件設(shè)備時(shí),CPU會(huì)通過特別的接口去調(diào)用核心態(tài)的代碼,之后用戶態(tài)的應(yīng)用程序才能對硬件設(shè)備進(jìn)行操作。?如果用戶態(tài)的應(yīng)用程序直接調(diào)用硬件設(shè)備時(shí),就會(huì)被Host OS捕捉到并觸發(fā)異常。
Ring0 核心態(tài)(Kernel Mode):是Host OS Kernel運(yùn)行的模式,運(yùn)行在核心態(tài)的代碼可以無限制的對系統(tǒng)內(nèi)存、設(shè)備驅(qū)動(dòng)程序、網(wǎng)卡接口、顯卡接口等外圍設(shè)備進(jìn)行訪問。只有Host OS能夠無限制的訪問硬盤、鍵盤等外圍硬件設(shè)備的數(shù)據(jù)(需要驅(qū)動(dòng)程序)。
虛擬化實(shí)現(xiàn)圖:
粗略而言,GuestOS和VMM都屬于運(yùn)行在Ring3上的應(yīng)用程序,GuestOS操作硬件設(shè)備時(shí)會(huì)先將操作指令傳遞給VMM,VMM對該指令進(jìn)行監(jiān)控和檢測后將指令傳遞給HostOS,HostOS會(huì)將GuestOS發(fā)出的運(yùn)行于用戶態(tài)的指令模擬為核心態(tài)指令,最后交由CPU處理。?
注意:當(dāng)上述的流程是非常簡略的,在與全虛擬化和半虛擬化的實(shí)現(xiàn)過程集合時(shí),就會(huì)變得非常復(fù)雜。
全虛擬化 Full virtualization
GuestOS可以直接在全虛擬化VMM上運(yùn)行而不需要對其本身做任何修改,全虛擬化的GuestOS具有完全的物理機(jī)特性。既VMM會(huì)為GuestOS模擬出它所需要的包括CPU、磁盤、內(nèi)存、網(wǎng)卡、顯卡等所有的抽象資源。e.g.?GuestOS在使用網(wǎng)卡時(shí),會(huì)調(diào)用VMM模擬的虛擬網(wǎng)卡驅(qū)動(dòng)來操作物理網(wǎng)卡。
結(jié)合上述的虛擬化實(shí)現(xiàn)圖來看:GuestOS是一個(gè)虛擬機(jī),在我們使用GuestOS的時(shí)候,不可避免的會(huì)使用到GuestOS中的虛擬設(shè)備驅(qū)動(dòng)程序和核心調(diào)度程序來操作硬件設(shè)備。與HostOS的不同在于,HostOS是運(yùn)行在CPU的核心態(tài)中,這就表示了HostOS是可以直接操作硬件設(shè)備的。但GuestOS是運(yùn)行在CPU用戶態(tài)中,所以其不能直接操作硬件設(shè)備。為了解決這個(gè)問題,VMM引用了兩個(gè)機(jī)制——特權(quán)解除和陷入模擬。?
特權(quán)解除:即翻譯,當(dāng)GuestOS需要使用運(yùn)行在核心態(tài)的指令時(shí),VMM就會(huì)動(dòng)態(tài)的將該指令捕獲并調(diào)用若干的運(yùn)行在非核心態(tài)的指令來模擬該核心態(tài)指令的效果,從而將核心態(tài)的特權(quán)解除。解除了核心態(tài)的特權(quán)后,GuestOS中的大部分指令都可以正常的執(zhí)行。但是,這仍然不能完美的解決問題。因?yàn)樵谝粋€(gè)OS的指令集中還存在著一種敏感指令(可能是內(nèi)核態(tài),也可能是用戶態(tài))。此時(shí)就需要陷入模擬的實(shí)現(xiàn)。?
陷入模擬:HostOS和GuestOS都含有敏感指令(reboot、shutdown等),試想如果在GuestOS中執(zhí)行了reboot指令,卻將HostOS重啟了,這將會(huì)非常糟糕。VMM的陷入模擬機(jī)制就是為了解決這個(gè)問題。e.g.?在GuestOS中執(zhí)行了需要運(yùn)行在內(nèi)核態(tài)中的reboot指令,VMM首先會(huì)將reboot指令獲取、檢測并判定為敏感指令。此時(shí)VMM就會(huì)陷入模擬,將敏感指令reboot模擬成一個(gè)只對GuestOS進(jìn)行操作的、非敏感的、并且運(yùn)行在非核心態(tài)的”reboot”指令,并將其交給CPU處理。最后由CPU準(zhǔn)確的執(zhí)行GuestOS重啟的動(dòng)作。
由于全虛擬化會(huì)將非內(nèi)核態(tài)指令模擬成內(nèi)核態(tài)指令再交由CPU處理,經(jīng)過了兩重轉(zhuǎn)換,所以其效率會(huì)比半虛擬化更低,但全虛擬化的好處在于其不會(huì)對GuestOS做修改,所以全虛擬化的VMM可以安裝絕大部分的OS(暫時(shí)來說只有已Linux、open soralis、BSD等幾種OS開源了內(nèi)核代碼)。典型的全虛擬化軟件有 —— VMWare、Hyper-V、KVM-x86(復(fù)雜指令集)。
全虛擬化的兩種實(shí)現(xiàn)方式:?
1). 基于二進(jìn)制翻譯的全虛擬化?
2). 基于掃描和修補(bǔ)的全虛擬化
半虛擬化 Paravirtualization
半虛擬化是需要GuestOS協(xié)助的虛擬化。因?yàn)樵诎胩摂M化中運(yùn)行的GuestOS內(nèi)核都進(jìn)過了特別的修改。半虛擬化VMM在處理敏感指令和內(nèi)核態(tài)指令的流程上相對更簡單一些。在半虛擬化VMM上運(yùn)行的GuestOS都需要修改內(nèi)核,主要是修改GuestOS內(nèi)核指令集中包括敏感指令在內(nèi)的內(nèi)核態(tài)指令。讓HostOS在接收到?jīng)]有經(jīng)過半虛擬化VMM模擬和翻譯處理的GuestOS內(nèi)核態(tài)指令或敏感指令時(shí),HostOS也能夠準(zhǔn)確的判斷出該指令是否屬于GuestOS。這樣就可以高校的避免了上述問題。典型的半虛擬化軟件有——Xen、KVM-PowerPC(簡易指令集)
半虛擬化除了修改內(nèi)核外還有另外一種實(shí)現(xiàn)方法——在每一個(gè)GuestOS中安裝半虛擬化軟件,e.g.?VMTools、RHEVTools。
注意:若使用KVM運(yùn)行Windows時(shí),一定要安裝半虛擬化驅(qū)動(dòng)tools,否則無法工作。現(xiàn)在主流的半虛擬化驅(qū)動(dòng)是由IBM和redhat聯(lián)合開發(fā)一個(gè)通用半虛擬機(jī)驅(qū)動(dòng)virtio 。
硬件輔助虛擬化 HVM
?
2005年?Intel提出并開發(fā)了由CPU直接支持的虛擬化技術(shù)。這種虛擬化技術(shù)引入新的CPU運(yùn)行模式和新的指令集,使得VMM和GuestOS運(yùn)行于不同的模式下(VMM=Root Mode;GuestOS=Non-Root Mode),GuestOS運(yùn)行于受控模式,原來的一些敏感指令在受控模式下會(huì)全部陷入VMM,由VMM來實(shí)現(xiàn)模擬,這樣就解決了部分非內(nèi)核態(tài)敏感指令的陷入——模擬難題,而且模式切換時(shí)上下文的保存恢復(fù)由硬件來完成,這樣就大大提高了陷入——模擬時(shí)上下文切換的效率?。該技術(shù)的引入使x86 CPU可以很容易地實(shí)現(xiàn)完全虛擬化。故皆被幾乎所有之前分歧的各大流派所采用,包括KVM-x86,VMWare ESX Server 3,Xen 3.0 。
HVM的分類:?
1). Intel –> VT-X?
2). AMD –> AMD-V
內(nèi)存虛擬化
原來的GuestOS使用的是虛擬內(nèi)存,不可以缺少虛擬內(nèi)存到物理內(nèi)存的翻譯,影響了虛擬機(jī)的效率。后來Intel EPT AMD RVI表示支持內(nèi)存虛擬化。
內(nèi)存虛擬化的映射實(shí)現(xiàn)*
A –> 虛擬地址(VA),指GuestOS提供給其應(yīng)用程序使用的線性地址空間。?
B –> 物理地址(PA),經(jīng)VMM抽象的,虛擬機(jī)看到的偽物理地址?
C –> 機(jī)器地址(MA),真是的機(jī)器物理地址,即地址總線上出現(xiàn)的地址信號?
內(nèi)存地址的映射關(guān)系::?
GuestOS:PA = f(VA) #GuestOS維護(hù)著一套頁表,負(fù)責(zé)VA到PA的映射?
VMM:MA = g(PA) #VMM維護(hù)著一套頁表,負(fù)責(zé)PA到MA的映射?
通過轉(zhuǎn)換方法實(shí)現(xiàn)了從虛擬地址到機(jī)器地址的映射。實(shí)際運(yùn)行時(shí),用戶程序訪問VA1,經(jīng)過GuestOS的頁表轉(zhuǎn)換得到PA1,再由VMM介入并使用VMM的頁表將PA1轉(zhuǎn)換為MA1 。
總線虛擬化
分類:?
1). Intel –>?VT/d
2). AMD –> iommu?
總線虛擬化可以實(shí)現(xiàn)將一塊網(wǎng)卡分給若干個(gè)GuestOS使用,每個(gè)虛擬機(jī)1/N,性能高,接近真機(jī)。?
從軟件的角度出發(fā),IO設(shè)備就是一堆狀態(tài)寄存器,控制寄存器,中斷并與其交互?
主要的虛擬化方式:設(shè)備接口完全模擬、前端-后端模擬(Xen) ??
直接劃分:直接把物理設(shè)備劃分給Guest OS,無須經(jīng)過VMM。Intel VT-d
內(nèi)存虛擬化和總線虛擬化進(jìn)一步的拉近了GuestOS和HostOS的運(yùn)行性能。
轉(zhuǎn)載:http://blog.csdn.net/jmilk/article/details/51031118
from:?https://yq.aliyun.com/articles/48867?spm=5176.100239.blogcont59817.12.JIiWID
總結(jié)
以上是生活随笔為你收集整理的虚拟化的发展历程和实现原理——图文详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 给老板汇报技术规划的一些要点
- 下一篇: Jvm原理剖析与调优之内存结构