第1章 CPU虚拟化 1
3 _, I. w3 V; `( o) Y; h# g1.1 x86架构CPU虚拟化 1
: ]( a. p7 l# L0 ]6 i1.1.1 陷入和模拟模型 2$ s w/ i! d( f
1.1.2 x86架构虚拟化的障碍 2; Z9 B- O+ E* l1 y6 q' _# B2 z
1.1.3 VMX 3+ m) t* ?) N/ h2 i' Y$ ?- l0 P
1.1.4 VCPU生命周期 53 K+ y2 E2 U; y# C
1.2 虚拟机切入和退出 8" M: ]" W% g5 K# [0 d
1.2.1 GCC内联汇编 8
" A4 ~9 W) s4 f1 x+ |% `/ V7 t1.2.2 虚拟机切入和退出及相关的上下文保存 109 ?8 Y9 Y3 f" p& c( i- q: e
1.3 陷入和模拟 15
" J# F8 H! p5 D) e7 B1.3.1 访问外设 15
$ j) M- K8 P6 Y0 y% ]# f; Y1.3.2 特殊指令 22
4 L' w# j" N2 {: u1.3.3 访问具有副作用的寄存器 27
: v# D+ a9 S- K- V! o% S# @! h1.4 对称多处理器虚拟化 28! E9 n- z7 {* b; s
1.4.1 MP Table 28 U) S7 l8 u0 K9 @
1.4.2 处理器启动过程 33+ P5 f+ I; |' r
1.5 一个简单KVM用户空间实例 41+ ~' p7 ?8 b+ ~( D
1.5.1 创建虚拟机实例 43
2 E. `2 _! w7 q6 R1.5.2 创建内存 43, M/ B0 B. r7 {: y" i
1.5.3 创建处理器 44
7 w) y3 U) `9 V6 d$ S8 V1.5.4 Guest 46( j8 [( o c( U6 G2 i
1.5.5 加载Guest镜像到内存 47
5 `! [. a9 w7 C: |+ d" ]3 q, Y0 E1.5.6 运行虚拟机 47
2 Z7 M9 `/ O9 w3 [7 C1 D2 G/ ]第2章 内存虚拟化 49
6 [) V7 w8 v: o5 }2.1 内存寻址 49
; {- G" j0 w8 G0 w v' W2.1.1 段式寻址 50
- X0 s/ `! a( q. C9 F2.1.2 平坦内存模型 50
; C5 O3 G8 `" R( i0 n _3 e2.1.3 页式寻址 544 H3 y' u! V5 W+ m2 H- v
2.1.4 页式寻址实例 55( x% e) j+ y. O6 n8 i) z% j$ u7 V
2.2 VMM为Guest准备物理内存 61& c$ a/ X; c7 ~ r- D9 E( M
2.2.1 内核是如何获取内存的 62. A2 h& L$ ~, Z8 Q+ X* [
2.2.2 建立内存段信息 64
3 v0 j3 p4 a; A# {2.2.3 准备中断0x15的处理函数以及设置IVT 65% W: E6 j& @9 E5 e1 p
2.2.4 中断0x15的处理函数实现 688 a9 p; k/ W( N1 r5 @0 G; n3 I
2.2.5 虚拟内存条 69
& e' ~, @( A% O/ y8 m$ c9 A7 |; G' \2.3 实模式Guest的寻址 72
4 M& S- W) v1 S2.3.1 设置CPU运行于Virtual-8086模式 74
" [9 c: p7 w; ?7 a! a4 B4 N2.3.2 设置Guest模式下的cr3寄存器 75
( E$ g: Y: e) c" w2 ]$ W4 ^" _ X' ^; }& T2.3.3 虚拟MMU的上下文 75# x3 u8 _ q" D$ W; o/ ^7 \
2.3.4 缺页异常处理 77
2 O2 }9 m6 x; ]8 K6 d9 l5 ^2.4 保护模式Guest的寻址 81
7 }) G! w* x+ s. v# X2.4.1 偷梁换柱cr3 83, W% V8 H$ \ p+ A6 }2 Y, R) C M
2.4.2 影子页表缺页异常处理 868 {6 U* l. d4 L, F
2.5 EPT 927 |+ ^' O( A; d5 a
2.5.1 设置EPT页表 93# W/ C1 r9 g7 N* W: k
2.5.2 EPT异常处理 95
! G/ n A u( B2.5.3 EPT支持下的地址翻译过程 97& H6 {. T0 [6 q0 f
第3章 中断虚拟化 99
4 a1 x3 n. Z6 |4 S! @/ |1 M+ u3.1 虚拟中断 99
1 `) c8 d1 b2 t# C8 n3.2 PIC虚拟化 102
$ X2 ~8 S# n( B5 J" y3.2.1 可编程中断控制器8259A 103 j( l7 A( ]/ D' Y8 B
3.2.2 虚拟设备向PIC发送中断请求 106: g3 B/ q, f8 O1 U
3.2.3 记录中断到IRR 107. @; D7 J& h6 P0 F
3.2.4 设置待处理中断标识 1085 q: Y4 V2 I& d2 j
3.2.5 中断评估 110
; V, E/ C6 ^# X" P9 @3.2.6 中断ACK 112& M, |: t* I0 r$ o1 ^6 C2 |
3.2.7 关于EOI的处理 1137 f( _- `- y9 v" f, g+ f
3.2.8 中断注入 114# v+ U8 q9 b, |1 u3 Z
3.3 APIC虚拟化 1165 |( N! l% Q. D/ \
3.3.1 外设中断过程 1187 Z7 k7 p) u$ ^) Y( d
3.3.2 核间中断过程 123; ^+ \" P7 J2 P
3.3.3 IRQ routing 125, i9 Z& a- q t# s6 v
3.4 MSI(X)虚拟化 128% l; `- A7 m3 q/ x
3.4.1 MSI(X)Capability数据结构 1295 ~5 h$ r4 C4 E. \' a
3.4.2 建立IRQ routing表项 131
$ a+ E' M* Q$ H6 T3 S% a3.4.3 MSI设备中断过程 132
I0 j* l+ M- L# R3.5 硬件虚拟化支持 134
* G4 Z8 o- C- J$ a3.5.1 虚拟中断寄存器页面(virtual-APIC page) 134
9 C# y5 H/ o+ j4 |- X3.5.2 Guest模式下的中断评估逻辑 136; ~* v' i0 P1 K+ y$ S' b
3.5.3 posted-interrupt processing 139
" G7 v- ^& w1 S% J第4章 设备虚拟化 1425 v4 L& F+ ?! y
4.1 设备虚拟化模型演进 142' s( Q' \% q6 J2 x- B2 z
4.2 PCI配置空间及其模拟 1447 z7 t0 n c& d5 `% `) ?
4.3 设备透传 152
5 U3 ^, ?9 B m% j1 u3 T, W4.3.1 虚拟配置空间 153
" j' V/ q1 @/ [2 Y, C1 {$ H5 q' R4.3.2 DMA重映射 157
% ~( T$ o" Y) a& i8 F; Y+ Y4.3.3 中断重映射 160: ] O; c* u" r' p7 c! M. N4 j
4.4 完全虚拟化 166
1 A" Q( a* A* L3 ]: L1 |4.4.1 Guest发送数据 167
, w \" Q! q# [4.4.2 Guest接收数据 173- T5 E3 i% K. w- J2 j6 R+ W
第5章 Virtio虚拟化 182
* U& t9 X @0 K; c5.1 I/O栈 1829 m0 p9 ^7 t" k0 J
5.1.1 文件系统 182
2 [8 U A( ?; T) k o5.1.2 通用块层 190
3 N; J7 K( k; D4 H4 Y+ A9 z: P5.1.3 块设备驱动 194" l4 F' V) k, O) B
5.1.4 page cache 196
% o5 J3 s. M" `9 y) d5.1.5 bio 201
9 Z) e; M: r( x( w) s+ K" A/ m9 i5.1.6 I/O调度器 2021 \3 j3 v% k; a3 R
5.2 Virtio协议 204
: ]1 I. Q6 q% V/ G8 _3 I, O, Z- y5.2.1 描述符表 205. j! G8 D6 V- k' @3 h% v9 C& y
5.2.2 可用描述符区域 207
5 u' L- [$ j5 z( M* h4 m+ h a& i5.2.3 已用描述符区域 208
" y/ e" i" v% f. e5.2.4 Virtio设备的PCI配置空间 209 j0 ^* R7 J l) p& d1 }
5.3 初始化Virtqueue 210
( @7 U) @: t' _4 r2 O, C5.4 驱动根据I/O请求组织描述符链 216
+ X1 E2 j0 V; X* x8 U5.5 驱动通知设备处理请求 221
$ z1 @' d6 E1 Q2 |3 \0 i5.6 设备处理I/O请求 2227 i- m' `1 t% J( g. F% ~
5.7 驱动侧回收I/O请求 2265 g. _! b: Z7 p2 ~5 x. T4 G- p
5.8 设备异步处理I/O 229, u- S0 L+ L7 Q7 Y3 z; }
5.9 轻量虚拟机退出 231
+ x ] {; Z8 n T2 O) E/ F5.9.1 创建eventfd 2327 ?( K; _0 x. f
5.9.2 kvmtool监听eventfd 235
% j! }+ l" u0 R7 o; g5.9.3 VM exit处理函数唤醒I/O任务 236
( \# d1 H( x/ q; E" x+ e. }第6章 网络虚拟化 239
/ w/ d. F( _$ i" w [6.1 基于Overlay的虚拟网络方案 239! m; `; ?* d$ T9 u
6.1.1 计算节点 240
$ N2 Y3 W6 r9 u5 w8 a4 L6 x6.1.2 网络节点 247 java8.com2 n* \0 y' ? L' i2 U3 R
6.1.3 Open vSwitch 251
7 g9 T1 f$ H1 D0 o7 h' O& z6.2 虚拟机访问外部主机 255
' g2 j/ c, q+ U" E% y! D, r6.2.1 数据包在计算节点Linux网桥中的处理 256
3 ?/ V& W0 _6 ^6 w4 `0 t6.2.2 数据包在计算节点的Open vSwitch中的处理 257, G. Y7 C4 u8 b) g/ J# K$ e+ g
6.2.3 数据包在网络节点的Open vSwitch中的处理 265
( Q. ?7 n& A6 q9 K# t6.3 外部主机访问虚拟机 2726 k9 a" B- G" z( `
6.3.1 数据包在网关中的处理过程 273: t! _4 g$ R4 W3 f" @/ L
6.3.2 数据包在网络节点的Open vSwitch中的处理 274& n$ t* I9 @, ]3 T! e, u" K
6.3.3 数据包在计算节点的Open vSwitch中的处理 279, x3 q: @3 u9 A* D3 {
6.3.4 数据包在Linux网桥中的处理 283
7 Y A8 ?& M5 ] N' [1 ? i