本書是一本論述系統(tǒng)虛擬化原理與實踐的專業(yè)圖書。全書分為6章,第1章概述系統(tǒng)虛擬化的基本 概念、發(fā)展歷史、趨勢展望、主要功能和分類,以及目前典型的虛擬化系統(tǒng),并介紹openEuler操作系統(tǒng)的虛 擬化技術(shù)。第2~4章分別介紹系統(tǒng)虛擬化的三大組成部分: CPU 虛擬化、內(nèi)存虛擬化和I/O 虛擬化的相 關(guān)原理,并配備相應(yīng)實驗便于讀者理解。第5章介紹基于ARMv8的鯤鵬虛擬化架構(gòu),并概述其CPU、中 斷、內(nèi)存、I/O 和時鐘虛擬化的基本原理。第6章結(jié)合代碼講解輕量級虛擬化平臺StratoVirt的基本原理 和技術(shù)特點,讀者可以跟隨本書從零開始打造一個具備基本功能的輕量級虛擬化平臺。 為便于讀者高效學(xué)習(xí)、深入掌握系統(tǒng)虛擬化的基本原理,本書的源代碼及安裝運行說明均保存于 GiantVM 和 StratoVirt開源社區(qū)。后續(xù)將通過開源社區(qū)進行代碼更新和線上交流。 本書可作為相關(guān)領(lǐng)域工程技術(shù)人員的參考書,也可作為高年級本科生和研究生的學(xué)習(xí)用書,還可作為 對虛擬化技術(shù)感興趣的愛好者的自學(xué)用書。
虛擬化領(lǐng)域系統(tǒng)性教材,涵蓋虛擬化歷史、通用虛擬化、ARM虛擬化、鯤鵬虛擬化、新一代虛擬化原理和應(yīng)用實戰(zhàn)介紹。加速虛擬化技術(shù)落地,助力國產(chǎn)云計算產(chǎn)業(yè)發(fā)展。
虛擬化技術(shù)是一門古老的新技術(shù)。早在1959年,牛津大學(xué)Christopher Strachey就提出了具有虛擬化概念的高效分時復(fù)用方案,意在解決當時大型機器使用效率低下的問題。到20世紀60至70年代,虛擬化研究進入了個高速發(fā)展時期,出現(xiàn)了以IBM CP67/CMS為代表的大型機虛擬化技術(shù),并提出了硬件架構(gòu)可虛擬化的理論和準則(如敏感指令應(yīng)屬于特權(quán)指令)。但到了20世紀80年代,隨著操作系統(tǒng)的成熟,資源管理不再以虛擬化為中心,MIPS和x86等CPU廠商出于成本和商業(yè)考慮,設(shè)計的硬件架構(gòu)不再滿足可虛擬化準則,形成了所謂的虛擬化漏洞(例如,x86有5類共17條敏感指令,但不屬于特權(quán)指令)。隨著個人計算機的普及,研究者提出了一系列彌補x86架構(gòu)虛擬化漏洞的方法,代表性的技術(shù)有斯坦福大學(xué)Mendel Rosenblum等在SOSP 1997國際學(xué)術(shù)會議發(fā)表的DISCO系統(tǒng),虛擬化技術(shù)重新興起。隨后,Intel和AMD等硬件廠商提出了硬件輔助虛擬化,使得x86硬件平臺滿足可虛擬化準則。從2006年亞馬遜以虛擬機形式向企業(yè)提供IaaS(Infrastructure as a Service,基礎(chǔ)設(shè)施即服務(wù))平臺開始,虛擬化技術(shù)成為當前支撐云計算、大數(shù)據(jù)、移動互聯(lián)網(wǎng)和工業(yè)互聯(lián)網(wǎng)等新型計算和應(yīng)用模型的關(guān)鍵根技術(shù)。
回顧虛擬化的發(fā)展歷史,可得出一些重要啟示。一是基礎(chǔ)研究對于計算機系統(tǒng)非常重要,不少關(guān)鍵技術(shù)的突破首先來自學(xué)術(shù)界和工業(yè)界的前沿研究; 二是的技術(shù)未必用于產(chǎn)品,成本和市場也是重要考量(ARM和RISCV初期也不是可虛擬化硬件架構(gòu),如ARMv6有4大類24條敏感非特權(quán)指令)。因此,深入理解虛擬化技術(shù),把握其內(nèi)在的發(fā)展規(guī)律,對于虛擬化的創(chuàng)新發(fā)展有重要作用。
系統(tǒng)虛擬化作為物理硬件層的虛擬化,在計算機硬件和操作系統(tǒng)之間引入一個系統(tǒng)軟件抽象層,向下管理硬件資源,向上對操作系統(tǒng)提供虛擬機接口,其目標可概括為功能不缺失、性能不損失。因此,系統(tǒng)虛擬化涉及操作系統(tǒng)和硬件接口,技術(shù)體系比較復(fù)雜,對初學(xué)者來說是一個很大的挑戰(zhàn)。讀者如果不了解虛擬化技術(shù)的基本原理而去直接翻閱源代碼,例如開源的QEMU/KVM,很容易抓不住主線,迷失在龐大的代碼中(QEMU源代碼已超過150萬行)。然而要把源代碼涉及的方方面面都講清楚需要極大的篇幅。因此,本書借鑒學(xué)習(xí)操作系統(tǒng)(Linux內(nèi)核源代碼已超過2700萬行)的方法,借助實驗把重要概念涉及的主干技術(shù)路徑敘述清楚,讀者可以通過調(diào)試和打印直觀理解虛擬化場景的現(xiàn)場,使靜態(tài)的代碼變得鮮活生動。其次,類似于代碼量約1萬行的Linux 0.11,麻雀雖小、五臟俱全,本書第6章從零開始構(gòu)建一個用戶態(tài)輕量級虛擬化平臺,逐步展現(xiàn)虛擬機的構(gòu)建過程,掌握系統(tǒng)虛擬化技術(shù)的關(guān)鍵基因圖譜。
基于在虛擬化領(lǐng)域的長期研究和實踐積累,以及和華為虛擬化團隊在openEuler開源操作系統(tǒng)上的合作研究,本書試圖從龐大的虛擬化技術(shù)中厘清關(guān)鍵路徑,并配以相關(guān)實驗,幫助讀者了解系統(tǒng)虛擬化技術(shù)的來龍去脈,理解基本原理,掌握核心方法,為進一步的研究打下基礎(chǔ)。
本書定位為計算機系統(tǒng)虛擬化領(lǐng)域的專業(yè)圖書,面向工程科技類普通讀者。讀者除了需要具備基本的硬件體系結(jié)構(gòu)和操作系統(tǒng)知識外,無須其他先修課程。此外,本書受眾還包括有志于計算機系統(tǒng)軟件領(lǐng)域深耕的研發(fā)人員以及對虛擬化感興趣的技術(shù)愛好者。
全書分6章,內(nèi)容涵蓋系統(tǒng)虛擬化的基本概念和實現(xiàn)方法,將系統(tǒng)虛擬化技術(shù)分為目前主流的一虛多(把單物理機器抽象成若干虛擬機器)和新型的多虛一(把多物理機抽象成單一虛擬機)。對于傳統(tǒng)一虛多技術(shù),本書基于開源QEMU/KVM和x86平臺深入介紹了CPU、內(nèi)存和I/O虛擬化的基本原理,并配備了相關(guān)實驗。針對新型多虛一技術(shù),本書介紹了開源項目GiantVM的CPU、內(nèi)存和I/O多虛一的基本實現(xiàn)方法。此外,針對ARM虛擬化,本書專門介紹基于ARMv8的鯤鵬虛擬化架構(gòu)。后,本書基于內(nèi)存安全的Rust語言從零開始打造一個具備基本功能的輕量級虛擬化平臺StratoVirt,逐步提供CPU、內(nèi)存和I/O的虛擬化能力。從開始運行一段匯編代碼到終能夠運行Linux客戶機操作系統(tǒng),讀者可以完整經(jīng)歷虛擬化從設(shè)計到實現(xiàn)的全部流程。同時,讀者可以參考華為產(chǎn)品級StratoVirt的源代碼,領(lǐng)略基于Rust語言實現(xiàn)的前沿輕量級虛擬化技術(shù)。感謝實驗室同學(xué)和華為公司對本書撰寫工作做出的重要貢獻,其中第1章主要由戚正偉撰寫,第2章主要由余博識撰寫,第3章主要由賈興國撰寫,第4章主要由張正君撰寫,第5章主要由余博識、賈興國、張正君和楊銘合作撰寫,第6章由徐飛、張亮、楊曉鶴、高煒、楊銘、吳斌、王志鋼撰寫,全書由戚正偉、管海兵修改和審閱。寫作過程中參考了實驗室GiantVM項目的代碼和文檔(主要來自陳育彬、丁卓成、張晉)。項羽心、張晉、鄧天邁等同學(xué)仔細閱讀了本書,并提供了寶貴的修改意見。特別感謝賈興國等對本書插圖的精心繪制,使得比較復(fù)雜的概念更為直觀清晰。虛擬化團隊技術(shù)專家胡欣蔚、范良、章曉峰、吳斌、王志鋼在本書寫作過程中提供了大量的資源和支持。本書后一章的動手實踐思路主要來自王志鋼。感謝清華大學(xué)出版社盛東亮老師和鐘志芳老師等的大力支持,經(jīng)過多輪修改,使本書質(zhì)量大為提高。
由于虛擬化技術(shù)發(fā)展很快,已經(jīng)深入計算機系統(tǒng)的方方面面,加之作者水平有限,書中難免有疏漏和不足之處,懇請讀者批評指正!
作者
2021年5月
戚正偉,博士,上海交通大學(xué)電信學(xué)院/軟件學(xué)院教授/博導(dǎo),CCF杰出會員, CCF系統(tǒng)軟件和理論計算機專委會委員,微軟亞洲研究院訪問教師、美國CMU大學(xué)訪問學(xué)者(美方教授為Edmund Clarke,計算機圖靈獎得主) 。2011年入選教育部新世紀優(yōu)秀人才計劃,獲得上海市技術(shù)發(fā)明一等獎、教育部科技進步一等獎、教育部技術(shù)發(fā)明一等獎、國家科技進步獎二等獎各一項,出版譯著《UNIX環(huán)境高級編程(第2版)》,為2008、2009年度暢銷榜TOP50(China-Pub)。出版專著《BlewBluePill:深入理解硬件虛擬機》((獲得IBM出版計劃資助)和譯著《UNIX高級環(huán)境編程(第3版)》(計算機與互聯(lián)網(wǎng)圖書2014/2015年度銷售榜Top 100)。
第1章系統(tǒng)虛擬化概述00
1.1系統(tǒng)虛擬化基本概念00
1.2系統(tǒng)虛擬化的發(fā)展歷史和趨勢展望00
1.2.1發(fā)展歷史00
1.2.2趨勢展望0
1.3系統(tǒng)虛擬化的主要功能和分類0
1.3.1虛擬化基本功能0
1.3.2虛擬化分類0
1.3.3系統(tǒng)虛擬化實現(xiàn)方式0
1.4典型虛擬化系統(tǒng)0
1.4.1典型虛擬化系統(tǒng)簡介0
1.4.2openEuler的虛擬化技術(shù)0
本章小結(jié)0
第2章CPU虛擬化0
2.1CPU虛擬化概述0
2.1.1敏感非特權(quán)指令的處理0
2.1.2虛擬機上下文切換0
2.1.3中斷虛擬化0
2.2Intel VTx硬件輔助虛擬化概述0
2.2.1VMX操作模式0
2.2.2VMCS0
2.2.3PIC & APIC0
2.2.4Intel VTx中斷虛擬化0
2.3QEMU/KVM CPU虛擬化實現(xiàn)0
2.3.1KVM模塊初始化0
2.3.2虛擬機創(chuàng)建0
2.3.3vCPU創(chuàng)建0
2.3.4vCPU運行0
2.3.5實驗:CPU虛擬化實例0
2.4QEMU/KVM中斷虛擬化實現(xiàn)0
2.4.1PIC & IOAPIC模擬0
2.4.2PCI設(shè)備中斷0
2.4.3QEMU/KVM中斷路由0
2.4.4虛擬中斷注入0
2.4.5實驗:e1000網(wǎng)卡中斷虛擬化0
2.5GiantVM CPU虛擬化0
2.5.1分布式vCPU0
2.5.2跨節(jié)點中斷轉(zhuǎn)發(fā)0
本章小結(jié)0
第3章內(nèi)存虛擬化
3.1內(nèi)存虛擬化概述
3.2內(nèi)存虛擬化的實現(xiàn)
3.2.1虛擬內(nèi)存的實現(xiàn):頁表
3.2.2內(nèi)存虛擬化的軟件實現(xiàn):影子頁表
3.2.3內(nèi)存虛擬化的硬件支持:擴展頁表
3.2.4擴展頁表與影子頁表的結(jié)合:敏捷頁表
3.2.5內(nèi)存的半虛擬化:直接頁表映射與內(nèi)存氣球
3.3QEMU/KVM內(nèi)存虛擬化源碼
3.3.1QEMU內(nèi)存數(shù)據(jù)結(jié)構(gòu)
3.3.2實驗:打印MemoryRegion樹
3.3.3KVM內(nèi)存數(shù)據(jù)結(jié)構(gòu)
3.3.4實驗:將GVA翻譯為HPA
3.4GiantVM內(nèi)存虛擬化
3.4.1分布式共享內(nèi)存
3.4.2GiantVM中的DSM架構(gòu)
3.4.3GiantVM中DSM的實現(xiàn)
本章小結(jié)
第4章I/O虛擬化
4.1I/O虛擬化概述
4.1.1I/O過程
4.1.2I/O虛擬化的基本任務(wù)
4.1.3軟件實現(xiàn)的I/O虛擬化
4.1.4硬件輔助的I/O虛擬化
4.2I/O虛擬化的實現(xiàn)方式
4.2.1PCI設(shè)備簡介
4.2.2設(shè)備模擬
4.2.3I/O半虛擬化
4.2.4設(shè)備直通訪問
4.2.5VFIO
4.2.6SRIOV
4.3QEMU/KVM虛擬設(shè)備的實現(xiàn)
4.3.1QEMU對象模型
4.3.2主板芯片組與總線模擬
4.3.3QEMU/KVM設(shè)備訪問的模擬
4.3.4實驗:為edu設(shè)備添加設(shè)備驅(qū)動
4.4GiantVM中的I/O處理
4.4.1PIO 轉(zhuǎn)發(fā)
4.4.2MMIO 轉(zhuǎn)發(fā)
4.4.3DMA 的處理
本章小結(jié)
第5章鯤鵬虛擬化
5.1鯤鵬虛擬化框架
5.1.1鯤鵬虛擬化簡介
5.1.2EL2虛擬化框架
5.2鯤鵬CPU虛擬化
5.2.1CPU虛擬化
5.2.2EL2異常級
5.2.3VHE
5.3鯤鵬中斷虛擬化
5.3.1GICv1
5.3.2GICv2
5.3.3GICv3/GICv4
5.3.4GICv3/GICv4中斷虛擬化
5.4鯤鵬內(nèi)存虛擬化
5.4.1VMSAv864架構(gòu)概述
5.4.2地址空間與頁表
5.4.3內(nèi)存屬性、訪問權(quán)限與缺頁異常
5.4.4MPAM
5.5鯤鵬I/O虛擬化
5.5.1MMIO的模擬
5.5.2DMA重映射SMMUv3
5.5.3SMMUv3中的緩存機制
5.6鯤鵬時鐘虛擬化
本章小結(jié)
第6章輕量級虛擬化平臺StratoVirt
6.1StratoVirt概述
6.2發(fā)展背景
6.3StratoVirt架構(gòu)設(shè)計
6.3.1CPU子系統(tǒng)
6.3.2內(nèi)存子系統(tǒng)
6.3.3I/O子系統(tǒng)
6.4從零開始構(gòu)建StratoVirt
6.4.1總體介紹
6.4.2KVM模型
6.4.3內(nèi)存模型
6.4.4CPU模型
6.4.5BootLoader實現(xiàn)
6.4.6串口實現(xiàn)
6.4.7Epoll實現(xiàn)
6.4.8鯤鵬平臺支持
本章小結(jié)
參考文獻
附錄A縮略語