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