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