我已經(jīng)想不起來(lái)是從什么時(shí)候開(kāi)始的,突然就對(duì)計(jì)算機(jī)歷史產(chǎn)生了濃厚的興趣,。于是我想著,要不以后所有系列文章的開(kāi)篇都先和大家聊聊歷史吧,。其實(shí)說(shuō)來(lái)挺有意思,,看過(guò)去到底是為了看未來(lái),因?yàn)闅v史總是驚人的相似,,幾乎所有的問(wèn)題都能夠在歷史長(zhǎng)河中尋得答案,。可惜的是,,但凡歷史,,最是難寫(xiě),筆者礙于能力有限,,還望大家多指點(diǎn)一二,。在計(jì)算機(jī)科學(xué)中,,虛擬化技術(shù)(Virtualization)是一種資源管理(優(yōu)化)技術(shù),,將計(jì)算機(jī)的各種物理資源(e.g. CPU,、內(nèi)存以及磁盤(pán)空間、網(wǎng)絡(luò)適配器等 I/O 設(shè)備)予以抽象,、轉(zhuǎn)換,,然后呈現(xiàn)出來(lái)的一個(gè)可供分割并任意組合為一個(gè)或多個(gè)(虛擬)計(jì)算機(jī)的配置環(huán)境。虛擬化技術(shù)打破了計(jì)算機(jī)內(nèi)部實(shí)體結(jié)構(gòu)間不可切割的障礙,,使用戶能夠以比原本更好的配置方式來(lái)應(yīng)用這些計(jì)算機(jī)硬件資源,。而這些資源的虛擬形式將不受現(xiàn)有架設(shè)方式,地域或物理配置所限制,。虛擬化技術(shù)是一個(gè)廣義的術(shù)語(yǔ),,根據(jù)不同的對(duì)象類型可以細(xì)分為:平臺(tái)虛擬化(Platform Virtualization):針對(duì)計(jì)算機(jī)和操作系統(tǒng)的虛擬化。 資源虛擬化(Resource Virtualization):針對(duì)特定的系統(tǒng)資源的虛擬化,,如內(nèi)存,、存儲(chǔ)、網(wǎng)絡(luò)資源等,。 應(yīng)用程序虛擬化(Application Virtualization):包括仿真,、模擬、解釋技術(shù)等,,如 Java 虛擬機(jī)(JVM),。 這里我們主要討論的是平臺(tái)虛擬化。首先提出第一個(gè)問(wèn)題:當(dāng)我們討論平臺(tái)虛擬化技術(shù),,實(shí)際在討論什么,?我認(rèn)為討論的是 Hypervisor 或稱為 VMM(Virtual Machine Monitor),本篇我們主要回顧 VMM 的發(fā)展歷程,,并思考之中的原因,。1959 年 6 月,牛津大學(xué)的計(jì)算機(jī)教授,,克里斯·托弗(Christopher Strachey)在國(guó)際信息處理大會(huì)(International Conference on Information Processing)上發(fā)表了一篇名為《大型高速計(jì)算機(jī)中的時(shí)間共享》(Time Sharing in Large Fast Computer)的學(xué)術(shù)報(bào)告,,他在文中首次提出了 “虛擬化” 的基本概念,還論述了什么是虛擬化技術(shù),。這篇文章被認(rèn)為是最早的虛擬化技術(shù)論述,,從此拉開(kāi)了虛擬化發(fā)展的帷幕。克里斯·托弗還同時(shí)提出了 Multi-Processing(多道程序)這一超前的概念,。Multi-Processing 解決了應(yīng)用程序因等待外部設(shè)備而導(dǎo)致處理器空轉(zhuǎn)問(wèn)題,,同時(shí)也解決了用戶如何調(diào)試(Debug)代碼的問(wèn)題。即便在現(xiàn)在看來(lái),,多道程序的理念仍是操作系統(tǒng)在 “并發(fā)” 領(lǐng)域中的隗寶。When I wrote the paper in 1959 I, in common with everyone else, had no idea of the difficulties which would arise in writing the software to control either the time-sharing or multi-programming. If I had I should not have been so enthusiastic about them. 1960 年,,為了應(yīng)對(duì)物理學(xué)領(lǐng)域的計(jì)算需求,,美國(guó)啟動(dòng) Atlas 超級(jí)計(jì)算機(jī)(Super Computer)項(xiàng)目,。同期的英國(guó)全國(guó)只有 16 臺(tái)計(jì)算機(jī),日不落帝國(guó)的詛咒在計(jì)算機(jī)領(lǐng)域也無(wú)法幸免,。1961 年,,由麻省理工學(xué)院的 Fernando Corbato 教授帶領(lǐng)團(tuán)隊(duì)開(kāi)始研發(fā) CTSS(Compatible Time Sharing System,兼容性分時(shí)系統(tǒng))項(xiàng)目,,并由 IBM 提供硬件設(shè)備和工程師進(jìn)行支持,。分時(shí)系統(tǒng)可以說(shuō)是硬件虛擬化的根本,CTSS 為后來(lái) IBM 的 TSS 打下了基礎(chǔ),。1962 年,,第一臺(tái) Atlas 超級(jí)計(jì)算機(jī) Atlas 1 誕生,Atlas 1 是第一臺(tái)實(shí)現(xiàn)了虛擬內(nèi)存(Virtual Memory)概念的計(jì)算機(jī),,并將其稱為一級(jí)存儲(chǔ)(one-level store),。Atlas 1 還是第一個(gè)實(shí)現(xiàn)了名為 Supervisor 的底層資源管理組件的計(jì)算機(jī),Supervisor 可以通過(guò)特殊的指令或代碼來(lái)管理物理主機(jī)的硬件資源,。例如:中央處理器的時(shí)間分配,。沒(méi)錯(cuò),操作系統(tǒng)最早的稱謂其實(shí)是 Supervisor,,往后還被叫過(guò)一段時(shí)間的 Master Control Program(主控程序),,但最終 Operating System 勝出了。此時(shí)你或許能夠理解為什么虛擬機(jī)管理程序會(huì)被統(tǒng)稱為 Hypervisor(Super,、Hyper 是同意詞,,意為超級(jí),但詞義上 Hyper 比 Super 還要高級(jí)一些),。1963 年使用打孔機(jī)的第一代 Atlas 超級(jí)計(jì)算機(jī)1960 中期,,IBM 在 Thomas J. Watson Research Center (NY) 進(jìn)行 M44/44X 計(jì)算機(jī)研究項(xiàng)目。M44/44X 項(xiàng)目基于 IBM 7044(M44)實(shí)現(xiàn)了多個(gè)具有突破性的虛擬化概念,,包括部分硬件共享(partial hardware sharing),、時(shí)間共享(time sharing)、內(nèi)存分頁(yè)(memory paging)以及實(shí)現(xiàn)了虛擬內(nèi)存管理的 VMM,。通過(guò)這些虛擬化技術(shù),,應(yīng)用程序可以運(yùn)行在這些虛擬的內(nèi)存之中,實(shí)現(xiàn)了在同一臺(tái)主機(jī)上模擬出多個(gè) 7044 系統(tǒng)(44X),。M44/44X 項(xiàng)目首次使用了 VM(Virtual Machine) 和 VMM(Virtual Machine Monitor)一詞,,被認(rèn)為是世界上第一個(gè)支持虛擬機(jī)的系統(tǒng)。1964 年:IBM 推出了著名的 System/360,。你或許有所耳聞,,System/360 的開(kāi)發(fā)過(guò)程被視為了計(jì)算機(jī)發(fā)展史上最大的一次豪賭,為了研發(fā) System/360,,IBM 決定征召六萬(wàn)多名新員工,,創(chuàng)建了五座新工廠,。即便如此,當(dāng)時(shí)的出貨時(shí)間仍被不斷順延,。吉恩·阿姆達(dá)爾是系統(tǒng)主架構(gòu)師,,當(dāng)時(shí)的項(xiàng)目經(jīng)理佛瑞德·布魯克斯(Frederick P. Brooks, Jr.)事后根據(jù)這項(xiàng)計(jì)劃的開(kāi)發(fā)經(jīng)驗(yàn),寫(xiě)出了同樣著名的《人月神話:軟件項(xiàng)目管理之道》(The Mythical Man-Month: Essays on Software Engineering)記述人類工程史上一項(xiàng)里程碑式的大型復(fù)雜軟件系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn),。最終,,IBM System/360 取得了巨大的商業(yè)成功。System/360 不僅提供了新型的操作系統(tǒng)(讓單一操作系統(tǒng)適用于整個(gè)系列的產(chǎn)品,,這是 System/360 系列大型機(jī)成功的關(guān)鍵),,還實(shí)現(xiàn)了基于全硬件虛擬化(Full Hardware Virtualization)的虛擬機(jī)解決方案,包括:頁(yè)式虛擬內(nèi)存(4k 分頁(yè)虛擬存儲(chǔ)系統(tǒng)),,虛擬磁盤(pán)以及 TSS 分時(shí)系統(tǒng),。System/360 最多可提供 14 個(gè)虛擬機(jī),每個(gè)虛擬機(jī)具有 256k 固定虛擬內(nèi)存,。這里有必要著重介紹一下 TSS (Time Sharing System,,分時(shí)共享系統(tǒng)),它能夠讓一臺(tái)主機(jī)上連接多個(gè)帶有顯示器和鍵盤(pán)的終端,,同時(shí)允許多個(gè)用戶通過(guò)主機(jī)的終端,,以交互方式使用計(jì)算機(jī),共享主機(jī)中的資源,。分時(shí)操作系統(tǒng)本質(zhì)是一個(gè)多用戶交互式操作系統(tǒng),。其中,“分時(shí)” 的含義是將 CPU 占用切分為多個(gè)極短(e.g. 1/100sec)的時(shí)間片,,每個(gè)時(shí)間片都執(zhí)行著不同的任務(wù),。通過(guò)對(duì)這些時(shí)間片的輪詢,就可以將一個(gè) CPU “偽裝”(虛擬化)成多個(gè) vCPU,,并且讓每顆 vCPU 看起來(lái)都是并行運(yùn)行的,。最終達(dá)到多個(gè)用戶分享使用同一臺(tái)計(jì)算機(jī),多個(gè)程序分時(shí)共享硬件和軟件資源的效果,。TSS 被認(rèn)為是最原始的虛擬化技術(shù),。可見(jiàn),最初虛擬化技術(shù)的應(yīng)用和發(fā)展源于大型機(jī)對(duì)分時(shí)系統(tǒng)的需求,。這種通過(guò)硬件的方式來(lái)生成多個(gè)可以運(yùn)行獨(dú)立操作系統(tǒng)軟件的虛擬機(jī)實(shí)例,,解決了早期大型計(jì)算機(jī)只能單任務(wù)處理而不能分時(shí)多任務(wù)處理的問(wèn)題。由于這種虛擬化技術(shù)是基于硬件設(shè)備來(lái)實(shí)現(xiàn)的,,故被稱為硬件虛擬化(Hardware virtualization),。但需要注意的是,這一說(shuō)法在后來(lái)被進(jìn)一步細(xì)分為了狹義的硬件虛擬化技術(shù),現(xiàn)今更加為人多熟知的硬件虛擬化是指:一種對(duì)計(jì)算機(jī)或操作系統(tǒng)的虛擬化,,能夠?qū)τ脩綦[藏真實(shí)的計(jì)算機(jī)硬件,,表現(xiàn)出另一個(gè)抽象的計(jì)算平臺(tái)。The Mythical Man-Month: Essays on Software Engineering1974 年,Gerald J. Popek(杰拉爾德·J·波佩克)和 Robert P. Goldberg(羅伯特·P·戈德堡)在合作論文《可虛擬第三代架構(gòu)的規(guī)范化條件》(Formal Requirements for Virtualizable Third Generation Architectures)中提出了一組稱為虛擬化準(zhǔn)則的充分條件,,又稱波佩克與戈德堡虛擬化需求(Popek and Goldberg virtualization requirements)即:虛擬化系統(tǒng)結(jié)構(gòu)的三個(gè)基本條件,。滿足這些條件的控制程序才可以被稱為虛擬機(jī)監(jiān)控器(Virtual Machine Monitor,簡(jiǎn)稱 VMM):資源控制(Resource Control),??刂瞥绦虮仨毮軌蚬芾硭械南到y(tǒng)資源。 等價(jià)性(Equivalence),。在控制程序管理下運(yùn)行的程序(包括操作系統(tǒng)),,除時(shí)序和資源可用性之外的行為應(yīng)該與沒(méi)有控制程序時(shí)的完全一致,且預(yù)先編寫(xiě)的特權(quán)指令可以自由地執(zhí)行,。 效率性(Efficiency),。絕大多數(shù)的客戶機(jī)指令應(yīng)該由主機(jī)硬件直接執(zhí)行而無(wú)需控制程序的參與。 該論文盡管基于簡(jiǎn)化的假設(shè),,但上述條件仍為評(píng)判一個(gè)計(jì)算機(jī)體系結(jié)構(gòu)是否能夠有效支持虛擬化提供了一個(gè)便利方法,,也為設(shè)計(jì)可虛擬化計(jì)算機(jī)架構(gòu)給出了指導(dǎo)原則。同時(shí),,Gerald J. Popek 和 Robert P. Goldberg 還在論文中介紹了兩種 Hypervisor 類型,,分別是類型 I 和 類型 II。類型 II(寄居或托管 Hypervisor):VMM 運(yùn)行在傳統(tǒng)的操作系統(tǒng)上,,就像其他計(jì)算機(jī)程序那樣運(yùn)行,。VMware 5.5 以前版本 Xen 3.0 以前版本 Virtual PC 2004 類型 I(原生或裸機(jī) Hypervisor):這些虛擬機(jī)管理程序直接運(yùn)行在宿主機(jī)的硬件上來(lái)控制硬件和管理客戶機(jī)操作系統(tǒng)。需要硬件支持 VMM 作為主操作系統(tǒng) 運(yùn)行效率高
VMware 5.5 及以后版本 Xen 3.0 及以后版本 Virtual PC 2005 KVM ps:這里我特意將類型 I 和 II 的順序調(diào)轉(zhuǎn),,至于為什么,,從實(shí)現(xiàn)案例可以看出類型 I 已然是時(shí)代的選擇。再一個(gè),,老實(shí)說(shuō)我確實(shí)為這個(gè)事實(shí)感到震驚,,平臺(tái)虛擬化的雛形竟然在 1974 年就已經(jīng)確立了的這個(gè)事實(shí)。1979 年,,Unix 的第 7 個(gè)版本引入了 chroot 機(jī)制,,意味著第一個(gè) 操作系統(tǒng)虛擬化(OS-level virtualization) 誕生了。chroot 是直到現(xiàn)在我們依然在使用的一個(gè)系統(tǒng)調(diào)用,,這個(gè)系統(tǒng)調(diào)用會(huì)讓一個(gè)進(jìn)程把指定的目錄作為根目錄,,它的所有文件系統(tǒng)操作都只能在這個(gè)指定目錄中進(jìn)行,本質(zhì)是一種文件系統(tǒng)層的隔離。ps:操作系統(tǒng)虛擬化這個(gè)說(shuō)法你或許會(huì)感到陌生,,但容器(Container)你應(yīng)該非常熟悉了,。在上世紀(jì) 60~80 年代,因?yàn)樘摂M化技術(shù)使得大型機(jī)和小型機(jī)獲得了空前的成功,。并且在相當(dāng)長(zhǎng)的一段時(shí)間里,,虛擬化技術(shù)只在大型機(jī)和小型機(jī)上得到了應(yīng)用,而在 x86 平臺(tái)上的應(yīng)用仍然進(jìn)展緩慢,。不過(guò)也可以理解,,以當(dāng)時(shí) x86 平臺(tái)的處理能力,應(yīng)付一兩個(gè)應(yīng)用程序已然捉襟見(jiàn)肘,,還怎么能夠?qū)①Y源分給更多的虛擬應(yīng)用呢,?而后隨著 x86 的流行,大型機(jī)和小型機(jī)在新興的服務(wù)器市場(chǎng)中也逐漸失去了競(jìng)爭(zhēng)力,。直到上世紀(jì) 80~90 年代,,Intel 公司(戈登·摩爾)提出了摩爾定律,Windows,、Mac 等 PC(Personal Computer)電腦被廣泛使用,,Wintel 聯(lián)盟勢(shì)如破竹,還出現(xiàn)了神一般的 Linux 服務(wù)器操作系統(tǒng),。種種原因,,到底是 x86 贏得了時(shí)代的青睞,成為了服務(wù)器的行業(yè)標(biāo)準(zhǔn),?;蛟S在那時(shí) Intel 就已經(jīng)開(kāi)始思考為何 “生態(tài)” 這件事情了。隨著 x86 服務(wù)器和桌面部署的增長(zhǎng)也為企業(yè) IT 基礎(chǔ)架構(gòu)帶來(lái)了新的難題:基礎(chǔ)架構(gòu)利用率低 基礎(chǔ)架構(gòu)成本高 IT 運(yùn)維成本高 故障切換和災(zāi)難保護(hù)不足 最終用戶桌面的維護(hù)成本高昂 而解決這些難題就是新時(shí)代賦予虛擬化技術(shù)的歷史任務(wù),,整個(gè) 80~90 年代,,虛擬化技術(shù)及公司如同雨后春筍般涌現(xiàn)。1987 年:Insignia Solutions 公司演示了一個(gè)稱為 SoftPC 的軟件模擬器,,這個(gè)模擬器允許用戶在 Unix Workstations 上運(yùn)行 DOS 應(yīng)用,。當(dāng)時(shí)一個(gè)可以運(yùn)行 Microsoft DOS 的 PC 需要 1,500 美金,而使用 SoftPC 模擬,,就可以直接在大型工作站上運(yùn)行 Microsoft DOS 了,。1989 年,,Insignia Solutions 發(fā)布了 Mac 版的 SoftPC,使蘋(píng)果用戶不僅能運(yùn)行 DOS,,還能運(yùn)行 Windows 操作系統(tǒng),。1990 年,Keir Fraser 和 Ian Pratt 創(chuàng)建了 XenServer 的初始代碼工程(項(xiàng)目),。1997 年,,蘋(píng)果開(kāi)發(fā)了 Virtual PC,后來(lái)又賣給了 Connectix 公司,。1998 年,,著名的 x86 仿真模擬器 Bochs 發(fā)布。1999 年,,VMware 公司率先推出針對(duì) x86 平臺(tái)推出了可以流暢運(yùn)行的商業(yè)虛擬化軟件 VMaware Workstation。2000 年,,F(xiàn)reeBSD jail,,真正意義上的第一個(gè)功能完整的操作系統(tǒng)虛擬化技術(shù),。利用這個(gè)技術(shù),,F(xiàn)reeBSD 的系統(tǒng)管理者,可以創(chuàng)造出幾個(gè)小型的軟件系統(tǒng),,這些軟件系統(tǒng)被稱為 jails(監(jiān)獄,,即容器。ps:不禁感慨,,取名真的很重要),。2001 年,VMWare 發(fā)布 ESX 和 GSX,,是 ESXi 的前身,。同年,F(xiàn)abrice Bellard 也發(fā)布了目前最流行的,,采用了動(dòng)態(tài)二進(jìn)制翻譯(Binary Translation)技術(shù)的開(kāi)源虛擬化軟件 QEMU(Quick EMUlator)的第一個(gè)版本,。此時(shí),虛擬化技術(shù)的共同目標(biāo)就是將 x86 架構(gòu)轉(zhuǎn)變?yōu)橥ㄓ玫墓蚕碛布A(chǔ)架構(gòu),,使應(yīng)用程序運(yùn)行環(huán)境在隔離性,、移動(dòng)性和操作系統(tǒng)類型方面都有選擇的空間。首先了解一下 x86 架構(gòu)的特點(diǎn),。CPU 為了保證程序代碼執(zhí)行的安全性,,多用戶的獨(dú)立性以及保證操作系統(tǒng)的穩(wěn)定性,提出了 CPU 執(zhí)行狀態(tài)的概念,。它有效的限制了不同程序之間的數(shù)據(jù)訪問(wèn)能力,,避免了非法的內(nèi)存數(shù)據(jù)操作,同時(shí)也避免了應(yīng)用程序錯(cuò)誤操作計(jì)算機(jī)的物理設(shè)備。一般的,,CPU 都會(huì)劃分為用戶態(tài)和內(nèi)核態(tài),,而 x86 CPU 更是細(xì)分為了 Ring 0~3 四種執(zhí)行狀態(tài)。Ring0 核心態(tài)(Kernel Mode):是操作系統(tǒng)內(nèi)核的執(zhí)行狀態(tài)(運(yùn)行模式),,運(yùn)行在核心態(tài)的代碼可以無(wú)限制的對(duì)系統(tǒng)內(nèi)存,、設(shè)備驅(qū)動(dòng)程序、網(wǎng)卡接口,、顯卡接口等外部設(shè)備進(jìn)行訪問(wèn),。 顯然,只有操作系統(tǒng)能夠無(wú)限制的訪問(wèn)內(nèi)存,、磁盤(pán),、鼠鍵等外圍硬件設(shè)備的數(shù)據(jù),因?yàn)椴僮飨到y(tǒng)就是作為計(jì)算機(jī)硬件資源管理器而存在的,,操作系統(tǒng)就是為了讓多個(gè)普通應(yīng)用程序可以更簡(jiǎn)單,、安全的運(yùn)行在同一臺(tái)計(jì)算機(jī)上而存在的 “特殊的應(yīng)用程序”。Ring3 用戶態(tài)(User Mode):運(yùn)行在用戶態(tài)的程序代碼需要受到 CPU 的檢查,,用戶態(tài)程序代碼只能訪問(wèn)內(nèi)存頁(yè)表項(xiàng)中規(guī)定能被用戶態(tài)程序代碼訪問(wèn)的頁(yè)面虛擬地址(受限的內(nèi)存訪問(wèn)),,而且還只能訪問(wèn) I/O Permission Bitmap 中規(guī)定的能被用戶態(tài)程序代碼訪問(wèn)的端口,不能直接訪問(wèn)外圍硬件設(shè)備,、不能搶占 CPU,。 也很顯然,所有的應(yīng)用程序都應(yīng)該運(yùn)行在用戶態(tài)中,。當(dāng)應(yīng)用程序需要訪問(wèn)外圍硬件設(shè)備時(shí),,CPU 會(huì)通過(guò)特別的接口去調(diào)用核心態(tài)的代碼,以這種旁路的方式來(lái)應(yīng)用程序?qū)τ布O(shè)備的調(diào)用,。如果用戶態(tài)的應(yīng)用程序直接調(diào)用硬件設(shè)備的話,,就會(huì)被操作系統(tǒng)捕捉到并觸發(fā)異常,彈出警告窗口,。可見(jiàn),,x86 架構(gòu)與大型機(jī)不同,當(dāng)時(shí)的 x86 體系結(jié)構(gòu)缺乏必要的針對(duì)虛擬化的硬件支持,,難以直接滿足波佩克與戈德堡的虛擬化需求,,所以 x86 架構(gòu)天然不是一個(gè)可虛擬化的架構(gòu)。x86 架構(gòu)的 CPU 中有 17 條指令成為了虛擬化最大的障礙,,錯(cuò)誤執(zhí)行這些指令會(huì)導(dǎo)致操作系統(tǒng)顯示警告,、終止應(yīng)用程序甚至完全崩潰。當(dāng)時(shí) VMware 提出了解決這個(gè)問(wèn)題的思路:在虛擬機(jī)生成這些特殊的指令時(shí)將它們 “困住”,,然后將它們轉(zhuǎn)換成可虛擬化的安全指令,,同時(shí)保證其他所有的指令不受到干擾地執(zhí)行,。這樣就產(chǎn)生了一種與主機(jī)硬件匹配并保持軟件完全兼容性的高性能虛擬機(jī)。這就是 全虛擬化(Full virtualization) 技術(shù)誕生的背景 —— 必須使用純軟件實(shí)現(xiàn)的方式構(gòu)造 VMM,。VMware 首創(chuàng)了這項(xiàng)技術(shù),,一舉穩(wěn)坐虛擬化龍頭老大。全虛擬化是指虛擬機(jī)模擬了完整的底層硬件,,包括處理器,、物理內(nèi)存、時(shí)鐘,、外設(shè)等,,使得為原始硬件設(shè)計(jì)的操作系統(tǒng)或其它系統(tǒng)軟件完全不做任何修改就可以在虛擬機(jī)中運(yùn)行。客戶機(jī)操作系統(tǒng)(Guest OS)與真實(shí)硬件之間的交互可以看成是通過(guò)一個(gè)預(yù)先規(guī)定的硬件接口進(jìn)行的,。全虛擬化 VMM 以完整模擬硬件的方式提供全部接口(同時(shí)還必須模擬特權(quán)指令的執(zhí)行過(guò)程),。全虛擬化的工作原理:虛擬機(jī)是對(duì)真實(shí)計(jì)算環(huán)境的抽象和模擬,VMM 需要為每個(gè)虛擬機(jī)分配一套數(shù)據(jù)結(jié)構(gòu)來(lái)管理它們狀態(tài),,包括 vCPU 的全套寄存器,,物理內(nèi)存的使用情況,虛擬設(shè)備的狀態(tài)等等,。VMM 調(diào)度虛擬機(jī)時(shí),會(huì)將其部分狀態(tài)恢復(fù)到 Host OS 中,。但并非所有的狀態(tài)都需要恢復(fù),,例如主機(jī) CR3 寄存器中存放的是 VMM 設(shè)置的頁(yè)表物理地址,而不是 Guest OS 設(shè)置的值,。pCPU 直接運(yùn)行 Guest OS 的機(jī)器指令時(shí),,由于 Guest OS 運(yùn)行在低特權(quán)級(jí)別(Ring 1),如果 Guest OS 直接訪問(wèn) Host OS 的特權(quán)狀態(tài)(如寫(xiě) GDT 寄存器),,就會(huì)因?yàn)闄?quán)限不足導(dǎo)致 pCPU 產(chǎn)生異常,,然后將運(yùn)行權(quán)主動(dòng)交還給 VMM。此外,,外部中斷的到來(lái)也會(huì)影響 VMM 的運(yùn)行,。VMM 可能需要先將該虛擬機(jī)的當(dāng)前狀態(tài)寫(xiě)回到狀態(tài)數(shù)據(jù)結(jié)構(gòu)中,分析虛擬機(jī)被掛起的原因,,然后代表 Guest OS 執(zhí)行相應(yīng)的特權(quán)操作,。最簡(jiǎn)單的情況,如 Guest OS 對(duì) CR3 寄存器的修改,,只需要更新虛擬機(jī)的狀態(tài)數(shù)據(jù)結(jié)構(gòu)即可,。一般而言,大部分情況下,,VMM 需要經(jīng)過(guò)復(fù)雜的流程才能完成原本簡(jiǎn)單的操作,。最后 VMM 將運(yùn)行權(quán)還給 Guest OS,,Guest OS 從上次被中斷的地方繼續(xù)執(zhí)行,或處理 VMM “塞”入的虛擬中斷和異常,。這種經(jīng)典的虛擬機(jī)運(yùn)行方式被稱為 Trap-And-Emulate(捕獲-模擬),,虛擬機(jī)對(duì)于 Guest OS 完全透明,Guest OS 不需要任何修改,,但是 VMM 的設(shè)計(jì)會(huì)比較復(fù)雜,,系統(tǒng)整體性能受到明顯的損害。舉例來(lái)說(shuō):x86 平臺(tái)中,,操作系統(tǒng)執(zhí)行切換進(jìn)程頁(yè)表的操作,,真實(shí)硬件會(huì)通過(guò)提供一個(gè)特權(quán) CR3 寄存器來(lái)實(shí)現(xiàn)該接口,操作系統(tǒng)只需執(zhí)行 mov pgtable, %%cr3 匯編指令即可,。而全虛擬化 VMM 就必須要完整地模擬該接口執(zhí)行的全過(guò)程,。如果硬件(主要是 CPU)不提供虛擬化的特殊支持的話,那么這個(gè)模擬過(guò)程將會(huì)十分復(fù)雜:一般而言,,VMM 必須運(yùn)行在最高優(yōu)先級(jí)來(lái)完全控制宿主機(jī)操作系統(tǒng)(Host OS),,而 Guest OS 需要降級(jí)運(yùn)行,從而不能執(zhí)行特權(quán)操作,。當(dāng) Guest OS 執(zhí)行前面的特權(quán)匯編指令時(shí),,Host OS 產(chǎn)生異常(General Protection Exception),執(zhí)行控制權(quán)重新從 Guest OS 轉(zhuǎn)到 VMM 手中,。VMM 事先分配一個(gè)變量作為影子 CR3 寄存器給 Guest OS,,將 pgtable(頁(yè)表)代表的 Guest OS 物理地址(Guest Physical Address)填入影子 CR3 寄存器,然后 VMM 還需要 pgtable 翻譯成主機(jī)物理地址(Host Physical Address)并填入物理 CR3 寄存器,,最后返回到 Guest OS中,。隨后 VMM 還將處理復(fù)雜的 Guest OS 缺頁(yè)異常(Page Fault)。簡(jiǎn)單來(lái)說(shuō)就是全虛擬化需要在 VMM 中模擬出一顆包含了控制單元,、運(yùn)算單元,、存儲(chǔ)單元、IS(指令集)的 CPU,;此外,,還需要模擬一張進(jìn)行虛擬存儲(chǔ)地址和物理存儲(chǔ)地址轉(zhuǎn)換的頁(yè)表;此外,,還需要在 VMM 模擬磁盤(pán)設(shè)備控制器,、網(wǎng)絡(luò)適配器等等各種 I/O 外設(shè)接口。如此依賴,,Guest OS 就不知道自己其實(shí)是個(gè)虛擬機(jī)了呀,,它收到了欺騙??梢韵胂蟮玫?,全虛擬化這種處理器密集型的虛擬化技術(shù)實(shí)現(xiàn)是異常困難且低效的,。比較著名的全虛擬化 VMM 有 Microsoft Virtual PC、VMware Workstation,、Sun Virtual Box,、Parallels Desktop for Mac 和 QEMU。QEMU 在今年(2019)對(duì)外宣稱可以模擬所有設(shè)備,,天啊,,這簡(jiǎn)直是個(gè)奇跡般的偉大軟件。但基于這樣的前提,,全虛擬化 VMM 必須要克服許多難以解決的問(wèn)題,。例如:確保 VMM 控制所有的系統(tǒng)資源:x86 處理器有 4 個(gè)特權(quán)級(jí)別,Ring 0 ~ Ring 3,,只有運(yùn)行在 Ring 0 ~ 2 時(shí),,處理器才可以訪問(wèn)特權(quán)資源或執(zhí)行特權(quán)指令;運(yùn)行在 Ring 0 級(jí)時(shí),,處理器可以訪問(wèn)所有的特權(quán)狀態(tài),。x86 平臺(tái)上的操作系統(tǒng)一般只使用 Ring 0 和 Ring 3 這兩個(gè)級(jí)別,操作系統(tǒng)運(yùn)行在 Ring 0 級(jí),,用戶進(jìn)程運(yùn)行在 Ring 3 級(jí),。為了滿足 資源控制(Resource Control) 虛擬化需求條件,VMM 就必須運(yùn)行在 Ring 0 級(jí),,同時(shí)為了避免 Guest OS 控制系統(tǒng)資源,,Guest OS 不得不降低自身的運(yùn)行級(jí)別,運(yùn)行在 Ring 1 或 Ring 3 級(jí)(Ring 2 不使用),。 特權(quán)級(jí)壓縮(Ring Compression):VMM 使用分頁(yè)或段限制的方式來(lái)保護(hù)物理內(nèi)存的訪問(wèn),但是 64 位模式下段限制不起作用,,而分頁(yè)又不區(qū)分 Ring 0, 1, 2,。為了統(tǒng)一和簡(jiǎn)化 VMM的設(shè)計(jì),Guest OS 只能和 Guest 進(jìn)程一樣運(yùn)行在 Ring 3 級(jí),。VMM 必須監(jiān)視 Guest OS 對(duì) GDT,、IDT 等特權(quán)資源的設(shè)置,防止 Guest OS 運(yùn)行在 Ring 0級(jí),,同時(shí)又要保護(hù)降級(jí)后的 Guest OS 不受 Guest 進(jìn)程的主動(dòng)攻擊或無(wú)意破壞,。 特權(quán)級(jí)別名(Ring Alias):特權(quán)級(jí)別名是指 Guest OS 在虛擬機(jī)中運(yùn)行的級(jí)別并不是它所期望的。VMM 必須保證 Guest OS 不能獲知正在虛擬機(jī)中運(yùn)行這一事實(shí),,否則可能打破 等價(jià)性(Equivalence) 虛擬化需求條件,。例如,x86 處理器的特權(quán)級(jí)別存放在 CS 代碼段寄存器內(nèi),,Guest OS 可以使用非特權(quán) push 指令將 CS 寄存器壓棧,,然后 pop 出來(lái)檢查該值,。又如,Guest OS 在低特權(quán)級(jí)別時(shí)讀取特權(quán)寄存器 GDT,、LDT,、IDT 和 TR,并不發(fā)生異常,,從而可能發(fā)現(xiàn)這些值與自己期望的不一樣,。為了解決這個(gè)挑戰(zhàn),VMM 可以使用動(dòng)態(tài)二進(jìn)制翻譯(Binary Translation)的技術(shù),,例如預(yù)先把 push %%cs 指令替換,,在棧上存放一個(gè)影子 CS 寄存器值;又如,,可以把讀取 GDT 寄存器的操作 sgdt dest 改為 movl fake_gdt, dest,。 地址空間壓縮(Address Space Compression):地址空間壓縮是指 VMM 必須在 Guest OS 的地址空間中保留一部分供其使用。例如,,中斷描述表寄存器(IDT Register)中存放的是中斷描述表的線性地址,,如果 Guest OS 運(yùn)行過(guò)程中來(lái)了外部中斷或觸發(fā)處理器異常,必須保證運(yùn)行權(quán)馬上轉(zhuǎn)移到 VMM 中,,因此 VMM 需要將 Guest OS 的一部分線性地址空間映射成自己的中斷描述表的主機(jī)物理地址,。VMM 可以完全運(yùn)行在 Guest OS 的地址空間中,也可以擁有獨(dú)立的地址空間,,后者的話,,VMM 只占用 Guest OS 很少的地址空間,用于存放中斷描述表和全局描述符表(GDT)等重要的特權(quán)狀態(tài),。無(wú)論如何哪種情況,,VMM 應(yīng)該防止 Guest OS 直接讀取和修改這部分地址空間。 處理 Guest OS 的缺頁(yè)異常:內(nèi)存是一種非常重要的系統(tǒng)資源,,VMM 必須全權(quán)管理,,Guest OS 理解的物理地址只是客戶機(jī)物理地址(Guest Physical Address),并不是最終的主機(jī)物理地址(Host Physical Address),。當(dāng) Guest OS 發(fā)生缺頁(yè)異常時(shí),,VMM 需要知道缺頁(yè)異常的原因,是 Guest 進(jìn)程試圖訪問(wèn)沒(méi)有權(quán)限的地址,,或是客戶機(jī)線性地址(Guest Linear Address)尚未翻譯成客戶機(jī)物理地址,,還是客戶機(jī)物理地址尚未翻譯成主機(jī)物理地址。一種可行的解決方法是 VMM 為 Guest OS 的每個(gè)進(jìn)程的頁(yè)表構(gòu)造一個(gè)影子頁(yè)表(Shadow Page Table),,維護(hù) Guest Linear Address 到 Host Physical Address 的映射,,主機(jī) CR3 寄存器存放這個(gè)影子頁(yè)表的物理內(nèi)存地址。VMM 同時(shí)維護(hù)一個(gè) Guest OS 全局的 Guest Physical Address 到 Host Physical Address 的映射表,。發(fā)生缺頁(yè)異常的地址總是 Guest Linear Address,,VMM 先去 Guest OS 中的頁(yè)表檢查原因,,如果頁(yè)表項(xiàng)已經(jīng)建立,即對(duì)應(yīng)的 Guest Physical Address 存在,,說(shuō)明尚未建立到 Host Physical Address 的映射,,那么 VMM 分配一頁(yè)物理內(nèi)存,將影子頁(yè)表和映射表更新,;否則,,VMM 返回到 Guest OS,由 Guest OS 自己處理該異常,。 處理 Guest OS 中的系統(tǒng)調(diào)用(System Call):系統(tǒng)調(diào)用是操作系統(tǒng)提供給用戶的服務(wù)例程,,使用非常頻繁。最新的操作系統(tǒng)一般使用 SYSENTER/SYSEXIT 指令對(duì)來(lái)實(shí)現(xiàn)快速系統(tǒng)調(diào)用,。SYSENTER 指令通過(guò) IA32_SYSENTER_CS,,IA32_SYSENTER_EIP 和 IA32_SYSENTER_ESP 這 3 個(gè) MSR(Model Specific Register)寄存器直接轉(zhuǎn)到 Ring 0 級(jí);而 SYSEXIT 指令不在 Ring 0 級(jí)執(zhí)行的話將觸發(fā)異常,。因此,,如果 VMM 只能采取 Trap-And-Emulate 的方式處理這 2 條指令的話,整體性能將會(huì)受到極大損害,。 轉(zhuǎn)發(fā)虛擬的中斷和異常:所有的外部中斷和 pCPU 的異常直接由 VMM 接管,,VMM 構(gòu)造必需的虛擬中斷和異常,然后轉(zhuǎn)發(fā)給 Guest OS,。VMM 需要模擬硬件和操作系統(tǒng)對(duì)中斷和異常的完整處理流程,,例如 VMM 先要在 Guest OS 當(dāng)前的內(nèi)核棧上壓入一些信息,然后找到 Guest OS 相應(yīng)處理例程的地址,,并跳轉(zhuǎn)過(guò)去,。VMM 必須對(duì)不同的 Guest OS 的內(nèi)部工作流程比較清楚,這增加了 VMM 的實(shí)現(xiàn)難度,。同時(shí),,Guest OS 可能頻繁地屏蔽中斷和啟用中斷,這兩個(gè)操作訪問(wèn)特權(quán)寄存器 EFLAGS,,必須由 VMM 模擬完成,性能因此會(huì)受到損害,。Guest OS 重新啟用中斷時(shí),,VMM 需要及時(shí)地獲知這一情況,并將積累的虛擬中斷轉(zhuǎn)發(fā),。 Guest OS 頻繁訪問(wèn)特權(quán)資源:Guest OS 對(duì)特權(quán)資源的每次訪問(wèn)都會(huì)觸發(fā) CPU 異常,,然后由 VMM 模擬執(zhí)行,如果訪問(wèn)過(guò)于頻繁,,則系統(tǒng)整體性能將會(huì)受到極大損害,。比如對(duì)中斷的屏蔽和啟用,,cli(Clear Interrupts)指令在 Pentium 4 處理器上需要花費(fèi) 60 個(gè)時(shí)鐘周期(cycle)。又比如,,處理器本地高級(jí)可編程中斷處理器(Local APIC)上有一個(gè)操作系統(tǒng)可修改的任務(wù)優(yōu)先級(jí)寄存器(Task-Priority Register),,IO-APIC 將外部中斷轉(zhuǎn)發(fā)到 TPR 值最低的處理器上(期望該處理器正在執(zhí)行低優(yōu)先級(jí)的線程),從而優(yōu)化中斷的處理,。TPR 是一個(gè)特權(quán)寄存器,,某些操作系統(tǒng)會(huì)頻繁設(shè)置(Linux Kernel 只在初始化階段為每個(gè)處理器的 TPR 設(shè)置相同的值)。 顯然,,基于 Trap-And-Emulate 處理方式的全虛擬化雖能夠以純軟件的方式完成虛擬化并解決了許多問(wèn)題,,但同時(shí)也帶來(lái)了極大的設(shè)計(jì)復(fù)雜性和性能下降。而對(duì)于這兩個(gè)問(wèn)題,,半虛擬化(Partial virtualization) 想到了一個(gè)好辦法:改造 Guest OS,,將 Guest OS 原來(lái)所有需要被 VMM 截獲、模擬的指令和操作全部改造成與 VMM 協(xié)同工作的指令(hypercall)和操作,。VMM 不再隱瞞了,,因?yàn)槟悖℅uest OS)已經(jīng)知道自己就是個(gè)虛擬機(jī)了。其核心思想是:動(dòng)態(tài)或靜態(tài)地改變 Guest OS 對(duì)特權(quán)狀態(tài)訪問(wèn)的操作,,盡量減少產(chǎn)生不必要的硬件異常,,同時(shí)簡(jiǎn)化 VMM 的設(shè)計(jì)。半虛擬化是一種通過(guò)修改 Guest OS 部分訪問(wèn)特權(quán)狀態(tài)的代碼以便直接與 VMM 交互的技術(shù),。在半虛擬化虛擬機(jī)中,,部分硬件接口以軟件的形式提供給 Guest OS,這可以通過(guò) Hypercall(VMM 提供給 Guest OS 的直接調(diào)用,,與系統(tǒng)調(diào)用類似)的方式來(lái)提供,。例如,Guest OS 把切換頁(yè)表的代碼修改為調(diào)用 Hypercall 來(lái)直接完成修改影子 CR3 寄存器和翻譯地址的工作,。由于不需要產(chǎn)生額外的異常和模擬部分硬件執(zhí)行流程,,半虛擬化可以大幅度提高性能,比較著名的 VMM 有 Denali,、Xen,。2003 年,英國(guó)劍橋大學(xué)的一位講師發(fā)布了開(kāi)源虛擬化項(xiàng)目 Xen,,并成立 XenSource 公司,,通過(guò)半虛擬化技術(shù)為 x86-64 提供虛擬化支持。同年,,Intel 正式公布將在 x86 平臺(tái)的 CPU 上支持虛擬化技術(shù) VT,。同年 VMWare 也被 EMC 收購(gòu),成為 EMC 迄今最成功的一筆收購(gòu)。同年,,微軟收購(gòu) Connectix 公司獲得 Virtual PC 虛擬化技術(shù),。相較于全虛擬化,半虛擬化 VMM 只需要模擬部分底層硬件,,因此 Guest OS 不做修改是無(wú)法在虛擬機(jī)中運(yùn)行的,,甚至運(yùn)行在虛擬機(jī)中的其它程序也需要進(jìn)行修改,如此代價(jià),,換來(lái)的就是接近于物理機(jī)的虛擬機(jī)性能,。有意思的是,半虛擬化其實(shí)也很尷尬,,對(duì)于 Linux 而言自然是改了就改了,,但 Windows 你要怎么改?人家可是閉源的,。寫(xiě)到這里,,不禁會(huì)想起自己寫(xiě)過(guò)的代碼,拆東墻補(bǔ)西墻可不值得提倡,,要從根源上解決問(wèn)題,。而這個(gè)根源自然就是 —— CPU。既然全虛擬化性能低的主要原因是花費(fèi)了太多的精力去捕獲 CPU 異常并模擬 CPU 行為,,那么如果 CPU 本身就為 VMM 提供了便利,,那豈不是從根本上解決了這個(gè)問(wèn)題?這就是 硬件輔助虛擬化(Hardware-assisted virtualization) ,。Intel-VT(Intel Virtualization Technology)和 AMD-V 是目前 x86 平臺(tái)上可用的兩種硬件輔助虛擬化技術(shù),。VT-x 為 IA 32 處理器增加了兩種操作模式:VMX root operation 和 VMX non-root operation。VMM 自己運(yùn)行在 VMX root operation 模式,,VMX non-root operation 模式則由 Guest OS 使用,。兩種操作模式都支持 Ring 0~3 這 4 個(gè)特權(quán)級(jí),因此 VMM 和 Guest OS 都可以自由選擇它們所期望的運(yùn)行級(jí)別,。這兩種操作模式可以互相轉(zhuǎn)換,。運(yùn)行在 VMX root operation 模式下的 VMM 通過(guò)顯式調(diào)用 VMLAUNCH 或 VMRESUME 指令切換到 VMX non-root operation 模式,硬件自動(dòng)加載 Guest OS 的上下文,,于是 Guest OS 獲得運(yùn)行,,這種轉(zhuǎn)換稱為 VM entry。Guest OS 運(yùn)行過(guò)程中遇到需要 VMM 處理的事件,,例如外部中斷或缺頁(yè)異常,,或者主動(dòng)調(diào)用 VMCALL 指令調(diào)用 VMM 的服務(wù)的時(shí)候(與系統(tǒng)調(diào)用類似),硬件自動(dòng)掛起 Guest OS,,切換到 VMX root operation 模式,恢復(fù) VMM 的運(yùn)行,這種轉(zhuǎn)換稱為 VM exit,。VMX root operation 模式下軟件的行為與在沒(méi)有 VT-x 技術(shù)的處理器上的行為基本一致,;而 VMX non-root operation 模式則有很大不同,最主要的區(qū)別是此時(shí)運(yùn)行某些指令或遇到某些事件時(shí),,發(fā)生 VM exit,。例如:在上面的例子中,Guest OS 能夠執(zhí)行修改頁(yè)表的匯編指令,,再無(wú)需 VMM 進(jìn)行捕獲,、模擬。從而減少了相關(guān)的性能開(kāi)銷,,也極大簡(jiǎn)化了 VMM 設(shè)計(jì),,進(jìn)而使 VMM 能夠按通用標(biāo)準(zhǔn)進(jìn)行編寫(xiě),性能更加強(qiáng)大,。又因?yàn)?VMM 和 Guest OS 共享底層的處理器資源,,所以硬件需要一個(gè)物理內(nèi)存區(qū)域來(lái)自動(dòng)保存或恢復(fù)彼此執(zhí)行的上下文。這個(gè)區(qū)域稱為虛擬機(jī)控制塊(VMCS),,包括客戶機(jī)狀態(tài)區(qū)(Guest State Area),,主機(jī)狀態(tài)區(qū)(Host State Area)和執(zhí)行控制區(qū)。VM entry 時(shí),,硬件自動(dòng)從客戶機(jī)狀態(tài)區(qū)加載 Guest OS 的上下文,。并不需要保存 VMM 的上下文,原因與中斷處理程序類似,,因?yàn)?VMM 如果開(kāi)始運(yùn)行,,就不會(huì)受到 Guest OS的干擾,只有 VMM 將工作徹底處理完畢才可能自行切換到 Guest OS,。而 VMM 的下次運(yùn)行必然是處理一個(gè)新的事件,,因此每次 VMM entry 時(shí), VMM 都從一個(gè)通用事件處理函數(shù)開(kāi)始執(zhí)行,;VM exit 時(shí),,硬件自動(dòng)將 Guest OS 的上下文保存在客戶機(jī)狀態(tài)區(qū),從主機(jī)狀態(tài)區(qū)中加載 VMM 的通用事件處理函數(shù)的地址,,VMM 開(kāi)始執(zhí)行,。而執(zhí)行控制區(qū)存放的則是可以操控 VM entry 和 exit 的標(biāo)志位,例如標(biāo)記哪些事件可以導(dǎo)致 VM exit,,VM entry 時(shí)準(zhǔn)備自動(dòng)給 Guest OS “塞” 入哪種中斷等等,。客戶機(jī)狀態(tài)區(qū)和主機(jī)狀態(tài)區(qū)都應(yīng)該包含部分物理寄存器的信息,例如控制寄存器 CR0,,CR3,,CR4,;ESP 和 EIP(如果處理器支持 64 位擴(kuò)展,則為 RSP,,RIP),;CS,SS,,DS,,ES,F(xiàn)S,,GS 等段寄存器及其描述項(xiàng),;TR,GDTR,,IDTR 寄存器,;IA32_SYSENTER_CS,IA32_SYSENTER_ESP,,IA32_SYSENTER_EIP 和 IA32_PERF_GLOBAL_CTRL 等 MSR 寄存器,。客戶機(jī)狀態(tài)區(qū)并不包括通用寄存器的內(nèi)容,,VMM 自行決定是否在 VM exit 的時(shí)候保存它們,,從而提高了系統(tǒng)性能??蛻魴C(jī)狀態(tài)區(qū)還包括非物理寄存器的內(nèi)容,,比如一個(gè) 32 位的 Active State 值表明 Guest OS 執(zhí)行時(shí)處理器所處的活躍狀態(tài),如果正常執(zhí)行指令就是處于 Active 狀態(tài),,如果觸發(fā)了三重故障(Triple Fault)或其它嚴(yán)重錯(cuò)誤就處于 Shutdown 狀態(tài),,等等。執(zhí)行控制區(qū)用于存放可以操控 VM entry 和 VM exit 的標(biāo)志位,,包括:External-interrupt exiting:用于設(shè)置是否外部中斷可以觸發(fā) VM exit,,而不論 Guest OS 是否屏蔽了中斷。 Interrupt-window exiting:如果設(shè)置,,當(dāng) Guest OS 解除中斷屏蔽時(shí),,觸發(fā) VM exit。 Use TPR shadow:通過(guò) CR8 訪問(wèn) Task Priority Register(TPR)的時(shí)候,,使用 VMCS 中的影子 TPR,,可以避免觸發(fā) VM exit。同時(shí)執(zhí)行控制區(qū)還有一個(gè) TPR 閾值的設(shè)置,,只有當(dāng) Guest OS 設(shè)置的 TR 值小于該閾值時(shí),,才觸發(fā) VM exit。 CR masks and shadows:每個(gè)控制寄存器的每一位都有對(duì)應(yīng)的掩碼,,控制 Guest OS 是否可以直接寫(xiě)相應(yīng)的位,,或是觸發(fā) VM exit,。同時(shí) VMCS 中包括影子控制寄存器,Guest OS 讀取控制寄存器時(shí),,硬件將影子控制寄存器的值返回給 Guest OS,。 VMCS 還包括一組位圖以提供更好的適應(yīng)性:Exception bitmap:選擇哪些異常可以觸發(fā) VM exit,, I/O bitmap:對(duì)哪些 16 位的 I/O 端口的訪問(wèn)觸發(fā) VM exit。 MSR bitmaps:與控制寄存器掩碼相似,,每個(gè) MSR 寄存器都有一組“讀”的位圖掩碼和一組“寫(xiě)”的位圖掩碼,。 每次發(fā)生 VM exi t時(shí),硬件自動(dòng)在 VMCS 中存入豐富的信息,,方便 VMM 甄別事件的種類和原因,。VM entry 時(shí),VMM 可以方便地為 Guest OS 注入事件(中斷和異常),,因?yàn)?VMCS 中存有 Guest OS 的中斷描述表(IDT)的地址,,因此硬件能夠自動(dòng)地調(diào)用 Guest OS 的處理程序。傳統(tǒng)的全虛擬化實(shí)現(xiàn)在有了硬件的輔助之后,,由于 CPU 引入了新的操作模式,,VMM 和 Guest OS 的執(zhí)行由硬件自動(dòng)隔離開(kāi)來(lái),任何關(guān)鍵的事件都可以將系統(tǒng)控制權(quán)自動(dòng)轉(zhuǎn)移到 VMM,,因此 VMM 能夠完全控制系統(tǒng)的全部資源,。Guest OS 也可以運(yùn)行在它所期望的最高特權(quán)級(jí)別,因此特權(quán)級(jí)壓縮和特權(quán)級(jí)別名的問(wèn)題迎刃而解,,而且 Guest OS 中的系統(tǒng)調(diào)用也不會(huì)觸發(fā) VM exit,。硬件使用物理地址訪問(wèn)虛擬機(jī)控制塊(VMCS),而 VMCS 保存了 VMM 和 Guest OS 各自的 IDTR 和 CR3 寄存器,,因此 VMM 可以擁有獨(dú)立的地址空間,,Guest OS 能夠完全控制自己的地址空間,地址空間壓縮的問(wèn)題也不存在了,。中斷和異常虛擬化的問(wèn)題也得到了很好的解決,。VMM 只用簡(jiǎn)單地設(shè)置需要轉(zhuǎn)發(fā)的虛擬中斷或異常,在 VM entry 時(shí),,硬件自動(dòng)調(diào)用 Guest OS 的中斷和異常處理程序,,大大簡(jiǎn)化 VMM 的設(shè)計(jì)。同時(shí),,Guest OS 對(duì)中斷的屏蔽及解除可以不觸發(fā) VM exit,,從而提高了性能。而且 VMM 還可以設(shè)置當(dāng) Guest OS 解除中斷屏蔽時(shí)觸發(fā) VM exit,,因此能夠及時(shí)地轉(zhuǎn)發(fā)積累的虛擬中斷和異常,。另外,,純軟件實(shí)現(xiàn)的 VMM 目前缺少對(duì) 64 位客戶操作系統(tǒng)的支持,而 CPU 的虛擬化技術(shù)除支持廣泛的傳統(tǒng)操作系統(tǒng)類型之外,,還支持 64 位客戶操作系統(tǒng),。硬件輔助虛擬技術(shù)提高了虛擬機(jī)的性能以及兼容性。需要注意的是,,上文中我們提到了全虛擬化,、半虛擬化和硬件輔助的全虛擬化,但這種分類實(shí)際上并不絕對(duì),,一個(gè)優(yōu)秀的 VMM 往往融合了多項(xiàng)技術(shù),。例如 VMware Workstation 是一個(gè)著名的全虛擬化的 VMM,但是它使用了一種被稱為動(dòng)態(tài)二進(jìn)制翻譯(Binary Translation)的技術(shù)把對(duì)特權(quán)狀態(tài)的訪問(wèn)轉(zhuǎn)換成對(duì)影子狀態(tài)的操作,,從而避免了低效的 Trap-And-Emulate 的處理方式,,這與半虛擬化相似,只不過(guò)半虛擬化是靜態(tài)地修改程序代碼,。看得出硬件輔助虛擬化技術(shù)必然是未來(lái)的方向,,Intel-VT 的處理器級(jí)虛擬化技術(shù)還需要進(jìn)行以下優(yōu)化:提高操作模式間的轉(zhuǎn)換速度:兩種操作模式間的轉(zhuǎn)換發(fā)生之如此頻繁,如果不能有效減少其轉(zhuǎn)換速度,,即使充分利用硬件特性,,虛擬機(jī)的整體性能也會(huì)大打折扣。早期的支持硬件輔助虛擬化技術(shù)的 Pentium 4 處理器需要花費(fèi) 2409 個(gè)時(shí)鐘周期處理 VM entry,,花費(fèi) 508 個(gè)時(shí)鐘周期處理由缺頁(yè)異常觸發(fā)的 VM exit,,代價(jià)相當(dāng)高。隨著 Intel 技術(shù)的不斷完善,,在新的 Core 架構(gòu)上,,相應(yīng)時(shí)間已經(jīng)減少到 937 和 446 個(gè)時(shí)鐘周期。未來(lái)硬件廠商還需要進(jìn)一步提高模式的轉(zhuǎn)換速度,,并提供更多的硬件特性來(lái)減少不必要的轉(zhuǎn)換,。 優(yōu)化翻譯后援緩沖器(TLB)的性能:每次 VM entry 和 VM exit 發(fā)生時(shí),由于需要重新加載 CR3 寄存器,,因此 TLB(Translation Lookaside Buffer)被完全清空,。虛擬化系統(tǒng)中操作模式的轉(zhuǎn)換發(fā)生頻率相當(dāng)高,因此系統(tǒng)的整體性能受到明顯損害,。一種可行的方案是為 VMM 和每個(gè)虛擬機(jī)分配一個(gè)全局唯一 ID,,TLB 的每一項(xiàng)附加該 ID 信息來(lái)索引線性地址的翻譯。 提供內(nèi)存管理單元(MMU)虛擬化的硬件支持:即使使用 Intel-VT 技術(shù),,VMM 還是得用老辦法來(lái)處理 Guest OS 中發(fā)生的缺頁(yè)異常以及Guest OS 的客戶機(jī)物理地址到主機(jī)物理地址的翻譯,,本質(zhì)原因是 VMM 完全控制主機(jī)物理內(nèi)存,因此 Guest OS 中的線性地址的翻譯同時(shí)牽涉到 VMM 和 Guest OS 的地址空間,,而硬件只能看到其中的一個(gè),。Intel 和 AMD 提出了各自的解決方案,,分別叫做 EPT(Extended Page Table)和 Nested Paging。這兩種技術(shù)的基本思想是,,無(wú)論何時(shí)遇到客戶機(jī)物理地址,,硬件自動(dòng)搜索 VMM 提供的關(guān)于該 Guest OS 的一個(gè)頁(yè)表,翻譯成主機(jī)物理地址,,或產(chǎn)生缺頁(yè)異常來(lái)觸發(fā) VM exit,。 支持高效的 I/O 虛擬化:I/O 虛擬化需要考慮性能、可用性,、可擴(kuò)展性,、可靠性和成本等多種因素。最簡(jiǎn)單的方式是 VMM 為虛擬機(jī)模擬一個(gè)常見(jiàn)的 I/O 設(shè)備,,該設(shè)備的功能由 VMM 用軟件或復(fù)用主機(jī) I/O 設(shè)備的方法實(shí)現(xiàn)。例如 Virtual PC 虛擬機(jī)提供的是一種比較古老的 S3 Trio64顯卡,。這種方式提高了兼容性,,并充分利用 Guest OS 自帶的設(shè)備驅(qū)動(dòng)程序,但是虛擬的 I/O 設(shè)備功能有限且性能低下,。為了提高性能,,VMM 可以直接將主機(jī) I/O 設(shè)備分配給虛擬機(jī),這會(huì)帶來(lái)兩個(gè)主要挑戰(zhàn):1. 如果多個(gè)虛擬機(jī)可以復(fù)用同一個(gè)設(shè)備,,VMM 必須保證它們對(duì)設(shè)備的訪問(wèn)不會(huì)互相干擾,。2. 如果 Guest OS 使用 DMA 的方式訪問(wèn) I/O 設(shè)備,由于 Guest OS 給出的地址并不是主機(jī)物理地址,,VMM 必須保證在啟動(dòng) DMA 操作前將該地址正確轉(zhuǎn)換,。Intel 和 AMD 分別提出了各自的解決方案,分別稱為 Direct I/O(VT-d)和 IOMMU,,希望用硬件的手段解決這些問(wèn)題,,降低 VMM 實(shí)現(xiàn)的難度。 2004 年,,微軟發(fā)布 Virtual Server 2005 計(jì)劃,,象征著虛擬化技術(shù)正式進(jìn)入主流市場(chǎng)。2005 年,,OpenVZ 發(fā)布,,這是 Linux 操作系統(tǒng)的容器化技術(shù)實(shí)現(xiàn),同時(shí)也是 LXC 的核心實(shí)現(xiàn),。2006 年,,Intel 和 AMD 等廠商相繼將對(duì)虛擬化技術(shù)的支持加入到 x86 體系結(jié)構(gòu)的中央處理器中(AMD-V,Intel VT-x),,使原來(lái)純軟件實(shí)現(xiàn)的各項(xiàng)功能可以用借助硬件的力量實(shí)現(xiàn)提速,。同年,,紅帽將 Xen 作為 RHEL 的默認(rèn)特性。同年,,Amazon Web Services(AWS)開(kāi)始以 Web 服務(wù)的形式向企業(yè)提供 IT 基礎(chǔ)設(shè)施服務(wù),,現(xiàn)在通常稱為云計(jì)算。ps:虛擬化和云計(jì)算不解的淵源自此開(kāi)始了,。2007 年 1 月,,Sun 公司發(fā)布了開(kāi)源虛擬化軟件 VirtualBox。同年 Xen 被 Citrix(思杰)收購(gòu),。2007 年 2 月,,Linux Kernel 2.6.20 合入了由以色列公司 Qumranet 開(kāi)發(fā)的虛擬化內(nèi)核模塊 KVM(Kernel-based Virtual Machine,基于內(nèi)核的虛擬機(jī)),,支持 KVM 的前提是 CPU 必須要支持虛擬化技術(shù),。2008 年第一季度,微軟同時(shí)發(fā)布了 Windows Server 2008 R2 及虛擬化產(chǎn)品 Hyper-V,。2008 年 6 月,,Linux Container(LXC) 發(fā)布 0.1.0 版本,其可以提供輕量級(jí)的虛擬化,,用來(lái)隔離進(jìn)程和資源,。是 Docker 最初使用的容器技術(shù)支撐。2008 年 9 月 4 日,,Red Hat 收購(gòu)以色列公司 Qumranet,,并著手使用 KVM 替換在 Red Hat 中的使用的 Xen。2009 年 9 月,,紅帽發(fā)布 RHEL 5.4,,在原先的 Xen 虛擬化機(jī)制之上,將 KVM 添加了進(jìn)來(lái),。同年,,阿里云寫(xiě)下第一行代碼。2010年11月,,紅帽發(fā)布 RHEL 6.0,,這個(gè)版本將默認(rèn)安裝的 Xen 虛擬化機(jī)制徹底去除,僅提供 KVM 虛擬化機(jī)制,。當(dāng)年,,Xen 雖然作為一項(xiàng)廣泛應(yīng)用于 Linux 發(fā)行版中的虛擬化技術(shù),但卻遲遲沒(méi)有集成到 Linux 內(nèi)核中,,紅帽也許是出于對(duì)這種脫離內(nèi)核的維護(hù)方式感到不爽,,加之當(dāng)時(shí)思杰和微軟表現(xiàn)的很非常親密,導(dǎo)致紅帽萌生了放棄 Xen 的想法,并在正式采用 KVM 的一年后,,就宣布徹底放棄 Xen,。硬件輔助虛擬化的到來(lái),Xen 引以為傲的半虛擬化技術(shù)也隨之在主流 Linux 發(fā)行廠商中衰落了,。2010 年 10 月 21 日,,NASA 發(fā)布了可以 IaaS(基礎(chǔ)設(shè)施即服務(wù))云操作系統(tǒng) OpenStack,第一個(gè)版本便是眾所周知 Austin(奧斯?。?。OpenStack 挽手自主可控的口號(hào),推動(dòng)了云計(jì)算在國(guó)內(nèi)的全面爆發(fā),。2011 年初,,IBM 找上老搭檔紅帽,表示 KVM 這個(gè)東西值得加大力度去做,。于是到了 5 月,,IBM 和紅帽,聯(lián)合惠普和英特爾一起,,成立了開(kāi)放虛擬化聯(lián)盟(Open Virtualization Alliance),,加速 KVM 投入市場(chǎng)的速度,由此避免 VMware 一家獨(dú)大的情況出現(xiàn),。聯(lián)盟成立之時(shí),紅帽的發(fā)言人表示:“大家都希望除 VMware 之外還有一種開(kāi)源選擇,。未來(lái)的云基礎(chǔ)設(shè)施一定會(huì)基于開(kāi)源,。我們想要營(yíng)造一個(gè)小廠商們可以輕松加入的生態(tài)環(huán)境?!?/span>ps:現(xiàn)在回頭再看,,企業(yè)之所以能夠長(zhǎng)盛不衰,長(zhǎng)遠(yuǎn)的洞察力至關(guān)重要,。 2013 年 3 月 15 日,,在加利福尼亞州圣克拉拉召開(kāi)的 Python 開(kāi)發(fā)者大會(huì)上,DotCloud 的創(chuàng)始人兼首席執(zhí)行官 Solomon Hvkes 在一場(chǎng)僅五分鐘的微型演講中,,首次提出了 Docker 這一概念,,并于會(huì)后將其源碼開(kāi)源并托管到 Github。最初的 Docker 就是使用了 LXC 再封裝了其他的一些功能,??梢钥闯觯珼ocker 的成功,,與其說(shuō)是技術(shù)的創(chuàng)新,,還不如說(shuō)是一次組合式的創(chuàng)新。2014 年 6 月,,Docker 發(fā)布了第一個(gè)正式版本 v1.0,。同年,,Redhat 和 AWS 就宣布了為 Docker 提供官方支持。在傳統(tǒng)操作系統(tǒng)中,,所有用戶的進(jìn)程本質(zhì)上是在同一個(gè)操作系統(tǒng)的實(shí)例中運(yùn)行,,因此內(nèi)核或應(yīng)用程序的缺陷可能影響到其它進(jìn)程。操作系統(tǒng)虛擬化(OS-level virtualization) 是一種在服務(wù)器操作系統(tǒng)中使用的,、沒(méi)有 VMM 層的輕量級(jí)虛擬化技術(shù),,內(nèi)核通過(guò)創(chuàng)建多個(gè)虛擬的操作系統(tǒng)實(shí)例(內(nèi)核和庫(kù))來(lái)隔離不同的進(jìn)程(容器),不同實(shí)例中的進(jìn)程完全不了解對(duì)方的存在,。操作系統(tǒng)虛擬化看似與上述提到過(guò)的幾種硬件虛擬化方式一樣,,都是產(chǎn)生多個(gè)操作系統(tǒng),但操作系統(tǒng)虛擬化與硬件虛擬化之間還是有很多不同之處,,其中最核心的區(qū)別就是:操作系統(tǒng)虛擬化是操作系統(tǒng)的虛擬化,,而硬件虛擬化是計(jì)算機(jī)的虛擬化。前者隔離操作系統(tǒng)資源,,而后者隔離計(jì)算機(jī)硬件資源,。ps:容器技術(shù)之所以火熱,是因?yàn)槿萜鞲綦x性封裝的特性,,為運(yùn)維能力引入了 “可編程性”,,開(kāi)發(fā)人員借助容器得以 Software Define Operation。2015 年 7 月 21 日:Kubernetes v1.0 發(fā)布,!進(jìn)入云原生時(shí)代,。2018 年,IBM 正式收購(gòu) Redhat 以彌補(bǔ)在云計(jì)算市場(chǎng)的戰(zhàn)略失敗,。同年,,微軟收購(gòu) Github。開(kāi)源的歷史會(huì)銘記這一天,。2019 年,,全球最大的開(kāi)源盛會(huì) KubeCon + CloudNativeCon + Open Source Summit、Open Infrastructure Summit 相繼在上海舉辦,。中國(guó)的開(kāi)源會(huì)銘記這一天,。對(duì)于篇幅較長(zhǎng)的文章,,我都習(xí)慣使用三句話來(lái)進(jìn)行總結(jié):虛擬化的發(fā)展:縱觀虛擬化技術(shù)的發(fā)展歷史,,可以看到它始終如一的目標(biāo)就是實(shí)現(xiàn)對(duì) IT 資源的充分利用。 虛擬化與云計(jì)算:虛擬化是 IT 資源的抽象,,云計(jì)算則是基于虛擬化實(shí)現(xiàn)的更上層的對(duì)企業(yè)業(yè)務(wù)能力的抽象,。 云計(jì)算與開(kāi)源:開(kāi)源是引誘開(kāi)發(fā)者的蘋(píng)果,而開(kāi)發(fā)者則是企業(yè)的核心資產(chǎn)。云的世界,,得開(kāi)發(fā)者,,得天下。 https://www.ibm.com/developerworks/cn/linux/l-cn-vt/index.html作者:范桂颶,,九州云(99Cloud)OpenStack 研發(fā)工程師,,曾先后服務(wù)于 Windows Azure、Redhat OpenStack 與 Prophetech HyperMotion,。云物互聯(lián)公號(hào)主,,現(xiàn)專注于探索云計(jì)算、邊緣計(jì)算,、SDN 與物聯(lián)網(wǎng)的深度結(jié)合應(yīng)用場(chǎng)景,。
|