《QEMU/KVM源碼解析與應用》從源碼層面對當今重要的虛擬化方案QEMU與KVM的實現(xiàn)進行了詳細分析。涉及的源碼包括QEMU程序的基本組成與重要組件、主板與固件虛擬化、CPU虛擬化、內(nèi)存虛擬化、中斷虛擬化、設備虛擬化等。本書的內(nèi)容以QEMU和KVM代碼分析為主,也涉及其他與虛擬化密切相關的代碼,例如SeaBIOS和Linux內(nèi)核中的virtio與VFIO的驅(qū)動代碼。對虛擬化安全、容器與安全容器技術、虛擬化技術的下一步發(fā)展也做了簡單介紹。
《QEMU/KVM源碼解析與應用》可供從事云計算,特別是從事IaaS層相關工作的人員閱讀和使用,也適合對底層計算機系統(tǒng)、虛擬機技術、操作系統(tǒng)技術感興趣的讀者學習和使用。虛擬化技術如今已經(jīng)廣泛應用于安全領域,本書還可供安全研究人員參考和使用。
第1章 QEMU與KVM概述1
1.1 虛擬化簡介1
1.1.1 虛擬化思想1
1.1.2 虛擬機簡介2
1.1.3 系統(tǒng)虛擬化的歷史3
1.2 QEMU與KVM架構介紹4
1.2.1 QEMU與KVM歷史4
1.2.2 QEMU與KVM架構5
1.3 KVM API使用實例8
第2章 QEMU基本組件12
2.1 QEMU事件循環(huán)機制12
2.1.1 glib事件循環(huán)機制12
2.1.2 QEMU中的事件循環(huán)機制13
2.1.3 QEMU自定義事件源17
2.1.4 QEMU事件處理過程21
2.1.5 QEMU主循環(huán)監(jiān)聽的fd解析23
2.2 QEMU線程模型25
2.2.1 QEMU線程模型簡介25
2.2.2 QEMU線程介紹26
2.3 QEMU參數(shù)解析27
2.4 QOM介紹32
2.4.1 類型的注冊33
2.4.2 類型的初始化36
2.4.3 類型的層次結(jié)構39
2.4.4 對象的構造與初始化42
2.4.5 屬性44
2.5 hmp與qmp介紹52
2.5.1 hmp與qmp52
2.5.2 qmp的使用53
2.5.3 qmp源碼分析54
2.5.4 qmp命令添加56
第3章 主板與固件模擬58
3.1 Intel 440FX主板簡介58
3.1.1 i440fx與piix3介紹58
3.1.2 QEMU模擬主板架構59
3.2 QEMU的主板模擬與初始化61
3.2.1 虛擬機初始化61
3.2.2 i440fx初始化64
3.2.3 中斷和其他設備的初始化66
3.3 fw_cfg設備介紹67
3.3.1 fw_cfg設備的初始化67
3.3.2 向fw_cfg設備添加數(shù)據(jù)69
3.3.3 添加用戶自定義數(shù)據(jù)74
3.3.4 數(shù)據(jù)的讀取75
3.4 SeaBIOS分析79
3.4.1 SeaBIOS簡介79
3.4.2 QEMU加載SeaBIOS80
3.4.3 SeaBIOS源碼結(jié)構84
3.4.4 SeaBIOS的編譯與調(diào)試91
第4章 CPU虛擬化93
4.1 CPU虛擬化介紹93
4.1.1 CPU虛擬化簡介93
4.1.2 VMX架構簡介93
4.1.3 VMCS介紹94
4.2 KVM模塊初始化介紹97
4.2.1 KVM源碼組織97
4.2.2 KVM模塊初始化98
4.3 虛擬機的創(chuàng)建105
4.3.1 QEMU側(cè)虛擬機的創(chuàng)建105
4.3.2 KVM側(cè)虛擬機的創(chuàng)建107
4.4 QEMU CPU的創(chuàng)建110
4.4.1 CPU模型定義110
4.4.2 CPU對象的初始化113
4.4.3 CPU的創(chuàng)建120
4.5 KVM CPU的創(chuàng)建122
4.5.1 KVM創(chuàng)建VCPU流程122
4.5.2 QEMU與KVM之間的共享
數(shù)據(jù)126
4.5.3 VCPU CPUID構造128
4.6 VCPU的運行133
4.7 VCPU的調(diào)度144
第5章 內(nèi)存虛擬化149
5.1 內(nèi)存虛擬化簡介149
5.2 QEMU內(nèi)存初始化150
5.2.1 基本結(jié)構150
5.2.2 QEMU虛擬機內(nèi)存初始化154
5.2.3 分配虛擬機RAM過程157
5.3 內(nèi)存布局的提交161
5.3.1 內(nèi)存更改通知161
5.3.2 虛擬機內(nèi)存平坦化過程164
5.3.3 向KVM注冊內(nèi)存169
5.4 內(nèi)存的分派174
5.4.1 內(nèi)存分派表的構建174
5.4.2 頁表簡化182
5.4.3 地址分派184
5.5 KVM內(nèi)存虛擬化186
5.5.1 虛擬機MMU初始化186
5.5.2 虛擬機物理地址的設置189
5.5.3 EPT頁表的構建193
5.6 MMIO機制200
5.6.1 虛擬設備MMIO實現(xiàn)原理200
5.6.2 coalesced MMIO203
5.7 虛擬機臟頁跟蹤205
第6章 中斷虛擬化210
6.1 中斷機制簡介210
6.1.1 中斷分發(fā)方式210
6.1.2 中斷線與中斷向量211
6.2 中斷模擬211
6.2.1 虛擬化環(huán)境下的中斷注入212
6.2.2 PIC中斷模擬214
6.2.3 I/O APIC中斷模擬225
6.2.4 MSI中斷模擬234
6.3 APIC虛擬化236
6.3.1 APICv簡介236
6.3.2 APICv源碼分析238
第7章 設備虛擬化245
7.1 設備虛擬化簡介245
7.1.1 總線數(shù)據(jù)類型245
7.1.2 總線的創(chuàng)建248
7.1.3 設備數(shù)據(jù)類型249
7.1.4 設備的創(chuàng)建251
7.1.5 設備的樹形結(jié)構252
7.2 PCI設備模擬258
7.2.1 PCI設備簡介258
7.2.2 PCI設備的模擬260
7.2.3 PCI設備中斷模擬270
7.3 設備模擬后端274
7.3.1 網(wǎng)卡模擬介紹275
7.3.2 網(wǎng)卡參數(shù)解析277
7.3.3 前端網(wǎng)卡設備的創(chuàng)建286
7.3.4 虛擬機網(wǎng)卡發(fā)包流程294
7.3.5 虛擬機網(wǎng)卡接收數(shù)據(jù)包297
7.4 virtio設備模擬298
7.4.1 virtio簡介298
7.4.2 virtio設備的初始化300
7.4.3 virtio驅(qū)動的加載314
7.4.4 virtio驅(qū)動的初始化320
7.4.5 virtio設備與驅(qū)動的通信330
7.5 ioeventfd和irqfd347
7.5.1 eventfd原理347
7.5.2 ioeventfd351
7.5.3 irqfd358
7.6 vhost net簡介362
7.6.1 vhost net介紹362
7.6.2 vhost的初始化363
7.6.3 vhost net網(wǎng)絡模塊367
7.6.4 vhost net的啟動376
7.6.5 vhost net的收發(fā)包378
7.7 設備直通與VFIO380
7.7.1 VFIO簡介380
7.7.2 VFIO相關內(nèi)核模塊分析387
7.7.3 VFIO與設備直通404
第8章 虛擬化雜項425
8.1 QEMU Guest Agent425
8.1.1 QEMU Guest Agent的使用425
8.1.2 qga源碼分析426
8.1.3 qga的QEMU側(cè)源碼解析431
8.2 QEMU虛擬機熱遷移439
8.2.1 熱遷移的用法與基本原理439
8.2.2 熱遷移流程分析441
8.2.3 熱遷移中的臟頁同步454
8.2.4 熱遷移中的相關參數(shù)控制459
8.3 QEMU及虛擬化安全460
8.3.1 QEMU軟件安全460
8.3.2 QEMU安全思考466
8.4 容器與虛擬化466
8.4.1 Docker容器467
8.4.2 gVisor467
8.4.3 nemu468
8.4.4 crosvm、Firecracker與
cloud-hypervisor468
附錄 重要術語470