-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

深度探索Linux系統虛擬化:原理與實現

( 簡體 字)
作者:王柏生 謝廣軍 著類別:1. -> 作業系統 -> Linux
譯者:
出版社:機械工業出版社深度探索Linux系統虛擬化:原理與實現 3dWoo書號: 53576
詢問書籍請說出此書號!

缺書
NT售價: 445

出版日:10/1/2020
頁數:283
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787111666066
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

為何寫作本書

大約在2014年底,我參與了一個項目,使用Android模擬器在x86架構的機器上運行各種Android游戲。當時項目遇到的核心問題是游戲運行卡頓嚴重,印象中普通的小游戲每秒大約只能渲染十幾幀,大型游戲則完全無法成功加載。運行模擬器的機器都有頂配的顯卡,因此硬件性能并不存在問題。那么問題就出在軟件架構上了。當時采用的軟件架構是:使用虛擬機運行Android程序,Android中有一個模塊會將數據通過網絡傳送給另外一個本地應用進行渲染。對于游戲這種數據量很大的應用,采用網絡包傳輸顯然不是一個最優的方案。除了網絡包在協議棧中的各種復雜處理外,大量的網絡包傳輸會導致虛擬機和主機之間的頻繁切換,這將耗費大量的計算資源。基于此,我們設計的新方案是在VMM層實現一個虛擬設備,在Guest內部通過這個虛擬設備向渲染程序發送數據。虛擬設備通過IPC方式與負責渲染的程序進行通信。方案實現后,原來無法加載的大型游戲每秒都可以達到Android的渲染上限60幀。

2015年我參與了另外一個項目,將虛擬機的塊設備數據存儲到塊存儲集群。原有的方案是在宿主機上采用SCSI創建一個塊設備,然后將這個塊設備傳給Qemu,SCSI設備再通過iSCSI協議將塊數據傳遞給遠端塊存儲集群。這個方案有很多弊端,塊數據經歷了兩次

I/O棧,一次是Guest內核中的,另外一次是Host內核中的,因此效率很低。另外,這個方案還有個致命的問題:那時偶爾會遇到內核中iSCSI協議的Bug,此時除了重啟宿主機外別無他法,而且那時熱遷移還不是很成熟,可以想象一下重啟宿主機的后果。為了解決這些問題,我們設計了另外一種方案,在Qemu中實現一個虛擬塊設備,繞過內核的I/O棧,在該虛擬塊設備中直接將塊數據通過TCP/IP發給塊存儲集群,從而不再依賴iSCSI協議。方案實現后,IOPS獲得了極大的提升,系統的穩定性也增強了。

經歷了很多類似上述的情況,因此我打算寫一本Linux系統虛擬化方面的書,希望能讓讀者更深刻地認識和理解系統虛擬化,于是我和本書的第二作者謝廣軍博士相約,一起撰寫本書。從2015年開始,歷時近6年,中間歷經多次易稿,從最開始過多地聚焦于煩瑣的技術細節,到嘗試從系統結構、操作系統和硬件等多角度去解釋原委。書中全部采用可以說明問題的早期代碼版本,而不是采用因各種特性迭代而變得紛繁復雜的最新代碼。

在這5年多的時間里,每每不想堅持時,就會想起自己年輕氣盛時經常質疑前輩們為我們留下了什么,而如今我捫心自問,從事了這么多年計算機工作,我又為這個行業做了什么?最后,希望本書能讓大家有所收獲。

讀者對象

虛擬化是云計算的基礎,此書寫給云計算相關從業人員,也寫給希望學習云計算相關技術的院校學生,以及Linux系統虛擬化的愛好者。

如何閱讀本書

本書探討了軟件如何虛擬計算機系統,包括CPU、內存、中斷和外設等。此外,在云計算中,網絡虛擬化也至關重要,因此,本書最后一章探討了網絡虛擬化。

第1章討論CPU虛擬化。這一章介紹了x86架構下的VMX擴展,討論了在VMX下虛擬CPU的完整生命周期。以Guest通過內存映射(MMIO)方式訪問外設為例,展示了KVM如何完整地模擬一個CPU指令。然后,我們探討了KVM是如何模擬多處理器系統的。最后,通過一個具體的KVM用戶空間部分的實例,帶領讀者直觀地體會CPU虛擬化的概念。

第2章討論內存虛擬化。這一章首先簡略地介紹了內存尋址的基本原理,然后分別探討了實模式Guest以及保護模式Guest的內存尋址,包括大家比較熟悉的影子頁表等。最后,我們討論了在硬件虛擬化支持下,即EPT模式下從Guest的虛擬地址到Host的物理地址的翻譯過程。

第3章討論中斷虛擬化。這一章我們從最初IBM PC為單核系統設計的PIC(8259A)開始,討論到為多核系統設計的APIC,再到繞開I/O APIC、從設備直接向LAPIC發送基于消息的MSI。最后,我們討論了Intel為了提高效率是如何從硬件層面對虛擬化中斷進行支持的,以及KVM是如何使用它們的。

第4章和第5章討論外設虛擬化。我們從完全虛擬化開始,討論到半虛擬化,最后討論到Intel的VT-d支持下的硬件輔助虛擬化。其間,我們通過實現一個模擬串口,帶領讀者直觀地體會設備虛擬化的基本原理,然后帶領讀者深入了解Virito標準。最后,我們還探討了支持SR-IOV的DMA重映射和中斷重映射。

第6章以一個典型的Overlay網絡為例,從虛擬機訪問外部主機、外部主機訪問虛擬機兩個方面,分別探討了計算節點、網絡節點上的網絡虛擬化技術。

勘誤和支持

由于作者水平和編寫時間有限,書中難免出現一些錯誤或者不準確的地方,懇請讀者批評指正。來信請發送至郵箱baisheng_wang@163.com或yfc@hzbook.com,我們會盡自己最大努力給予回復。

致謝

特別感謝機械工業出版社華章公司的楊福川編輯,在這5年多的時間里,他不斷地鼓勵我,耐心地支持我寫作。在我每每要放棄時,都是他的鼓勵讓我堅持了下來。同他的一次對話令我印象深刻,我問他如何看待“偏底層的題材比較小眾”這一問題,他堅毅地回答:只要是有價值的知識,總得有人來做,這是他的使命。

同時也要感謝機械工業出版社華章公司的欒傳龍編輯,他為本書花費了大量的個人時間,并在本書編輯階段提出了寶貴的修改意見,感謝他專業且細致的工作。

最后,感謝我的妻子,她擔起全部家務瑣事和教育孩子的重任,讓我把全部精力都放在追求理想上。



王柏生

2020年8月
內容簡介:

云計算的研究和應用已經持續了多年,還在不斷向更多領域擴展。在可預見的未來,幾乎所有的應用都會部署到云端,為我們提供各種各樣的服務,而虛擬化技術是云計算的基石。如果將云平臺看作是管理機器的,那么系統虛擬化就是制造機器的,我們肯定不想僅僅停留在管理機器層面,我們需要優化虛擬機,甚至是“制造”虛擬機。

本書帶領讀者從計算機體系結構、操作系統、硬件等多個維度深度探討在Linux操作系統環境下,軟件是如何虛擬出“物理”計算機的,以及為了提高虛擬效率、減少損耗,硬件從體系結構上是如何支持虛擬化的以及系統軟件是如何使用硬件虛擬化的。涵蓋CPU、內存、中斷、外設、網絡等多個系統的虛擬化,深入闡述了其中的技術原理和實現。



這是一部深度講解如何在Linux操作系統環境下用軟件虛擬出一臺“物理”計算機的著作。

兩位作者都是百度的資深技術專家,一位是百度的主任架構師,一位是百度智能云的副總經理,都在操作系統和虛擬化等領域有多年的實踐經驗。本書從計算機體系結構、操作系統、硬件等多個維度深度探討了從CPU、內存、中斷、外設、網絡5個系統的虛擬化,不僅剖析了其中的關鍵技術原理,而且深入闡述了具體的實現。

全書共6章。

第1章 CPU虛擬化

介紹了x86架構下的VMX擴展,討論了在VMX下虛擬CPU的完整生命周期,著重闡述了Host和Guest的切換、指令的模擬以及KVM是如何虛擬多處理器的。

第2章 內存虛擬化

討論了操作系統如何為虛擬機呈現物理內存,結合影子頁表以及EPT探討了KVM如何完成從GVA到HPA的2層地址映射。

第3章 中斷虛擬化

本章從最初單核系統的8259A,討論到多核系統的APIC,再到繞開I/O APIC、從設備直接向LAPIC發送基于消息的MSI的虛擬化原理和實現。然后,討論了Intel為了提高效率,是如何從硬件層面對虛擬化中斷進行支持的,以及KVM是如何使用它們的。

第4、5章 外設虛擬化

從完全虛擬化開始,依次講解了半虛擬化(Virtio)和Intel的VT-d支持下的硬件輔助虛擬化。通過實現一個模擬串口帶領讀者直觀體會了設備虛擬化的基本原理,然后深入闡述了Virtio標準和實現,以及支持SR-IOV的DMA重映射和中斷重映射。

第6章 網絡虛擬化

討論了在通用硬件網絡的基礎上,操作系統如何虛擬出專用的網絡設備,為租戶組建虛擬網絡。
目錄:

前 言
第1章 CPU虛擬化 1
1.1 x86架構CPU虛擬化 1
1.1.1 陷入和模擬模型 2
1.1.2 x86架構虛擬化的障礙 2
1.1.3 VMX 3
1.1.4 VCPU生命周期 5
1.2 虛擬機切入和退出 8
1.2.1 GCC內聯匯編 8
1.2.2 虛擬機切入和退出及相關的上下文保存 10
1.3 陷入和模擬 15
1.3.1 訪問外設 15
1.3.2 特殊指令 22
1.3.3 訪問具有副作用的寄存器 27
1.4 對稱多處理器虛擬化 28
1.4.1 MP Table 28
1.4.2 處理器啟動過程 33
1.5 一個簡單KVM用戶空間實例 41
1.5.1 創建虛擬機實例 43
1.5.2 創建內存 43
1.5.3 創建處理器 44
1.5.4 Guest 46
1.5.5 加載Guest鏡像到內存 47
1.5.6 運行虛擬機 47
第2章 內存虛擬化 49
2.1 內存尋址 49
2.1.1 段式尋址 50
2.1.2 平坦內存模型 50
2.1.3 頁式尋址 54
2.1.4 頁式尋址實例 55
2.2 VMM為Guest準備物理內存 61
2.2.1 內核是如何獲取內存的 62
2.2.2 建立內存段信息 64
2.2.3 準備中斷0x15的處理函數以及設置IVT 65
2.2.4 中斷0x15的處理函數實現 68
2.2.5 虛擬內存條 69
2.3 實模式Guest的尋址 72
2.3.1 設置CPU運行于Virtual-8086模式 74
2.3.2 設置Guest模式下的cr3寄存器 75
2.3.3 虛擬MMU的上下文 75
2.3.4 缺頁異常處理 77
2.4 保護模式Guest的尋址 81
2.4.1 偷梁換柱cr3 83
2.4.2 影子頁表缺頁異常處理 86
2.5 EPT 92
2.5.1 設置EPT頁表 93
2.5.2 EPT異常處理 95
2.5.3 EPT支持下的地址翻譯過程 97
第3章 中斷虛擬化 99
3.1 虛擬中斷 99
3.2 PIC虛擬化 102
3.2.1 可編程中斷控制器8259A 103
3.2.2 虛擬設備向PIC發送中斷請求 106
3.2.3 記錄中斷到IRR 107
3.2.4 設置待處理中斷標識 108
3.2.5 中斷評估 110
3.2.6 中斷ACK 112
3.2.7 關于EOI的處理 113
3.2.8 中斷注入 114
3.3 APIC虛擬化 116
3.3.1 外設中斷過程 118
3.3.2 核間中斷過程 123
3.3.3 IRQ routing 125
3.4 MSI(X)虛擬化 128
3.4.1 MSI(X)Capability數據結構 129
3.4.2 建立IRQ routing表項 131
3.4.3 MSI設備中斷過程 132
3.5 硬件虛擬化支持 134
3.5.1 虛擬中斷寄存器頁面(virtual-APIC page) 134
3.5.2 Guest模式下的中斷評估邏輯 136
3.5.3 posted-interrupt processing 139
第4章 設備虛擬化 142
4.1 設備虛擬化模型演進 142
4.2 PCI配置空間及其模擬 144
4.3 設備透傳 152
4.3.1 虛擬配置空間 153
4.3.2 DMA重映射 157
4.3.3 中斷重映射 160
4.4 完全虛擬化 166
4.4.1 Guest發送數據 167
4.4.2 Guest接收數據 173
第5章 Virtio虛擬化 182
5.1 I/O棧 182
5.1.1 文件系統 182
5.1.2 通用塊層 190
5.1.3 塊設備驅動 194
5.1.4 page cache 196
5.1.5 bio 201
5.1.6 I/O調度器 202
5.2 Virtio協議 204
5.2.1 描述符表 205
5.2.2 可用描述符區域 207
5.2.3 已用描述符區域 208
5.2.4 Virtio設備的PCI配置空間 209
5.3 初始化Virtqueue 210
5.4 驅動根據I/O請求組織描述符鏈 216
5.5 驅動通知設備處理請求 221
5.6 設備處理I/O請求 222
5.7 驅動側回收I/O請求 226
5.8 設備異步處理I/O 229
5.9 輕量虛擬機退出 231
5.9.1 創建eventfd 232
5.9.2 kvmtool監聽eventfd 235
5.9.3 VM exit處理函數喚醒I/O任務 236
第6章 網絡虛擬化 239
6.1 基于Overlay的虛擬網絡方案 239
6.1.1 計算節點 240
6.1.2 網絡節點 247
6.1.3 Open vSwitch 251
6.2 虛擬機訪問外部主機 255
6.2.1 數據包在計算節點Linux網橋中的處理 256
6.2.2 數據包在計算節點的Open vSwitch中的處理 257
6.2.3 數據包在網絡節點的Open vSwitch中的處理 265
6.3 外部主機訪問虛擬機 272
6.3.1 數據包在網關中的處理過程 273
6.3.2 數據包在網絡節點的Open vSwitch中的處理 274
6.3.3 數據包在計算節點的Open vSwitch中的處理 279
6.3.4 數據包在Linux網橋中的處理 283
序: