內容簡介
本書針對在Intel處理器端的虛擬化技術(Intel Virtualization Technology for x86,即Intel VT-x)進行全面講解。在Intel VT-x技術下實現了VMX(Virtual-Machine Extensions,虛擬機擴展)架構平台來支持對處理器的
虛擬化管理。因此,VMX架構是Intel VT-x技術的核心。本書內容圍繞VMX架構實現細節展開全面講解。但Intel VT-d(Virtualization Technology for Directed I/O)和Intel VT-c(Virtualization Technology for Connectivity)技術並不在本書的描述範圍。同時,也不針對AMD-v技術進行討論。
全書共分為7章,書的整體結構也較為規整,可讀性比較強。本書共提供14個例子,對VMX架構的一些特色功能進行輔助講解。
讀者閱讀本書,可以學習Intel VT-x技術的VMX架構知識,並且對整個x86/x64體系有更深入的了解!可以說,不了解VMX架構,根本算不上對x86/x64體系熟悉,因為,在處理器的虛擬化技術里需要使用全方位的體系知識,對處理器在非常細節的地方進行虛擬化處理。
圖書目錄
第1章 系統平台 1
1.1 環境及工具 1
1.1.1 使用vmware 2
1.1.2 使用bochs 4
1.1.3 在真實機器上運行 4
1.1.4 Build工具 4
1.2 64位與32位代碼的混合編譯 7
1.2.1 使用符號__X64 7
1.2.2 指令運算元 8
1.2.3 64-bit模式下其他指令處理 11
1.2.4 函式重定義表 15
1.3 地址空間 17
1.4 數據結構 23
1.4.1 PCB結構 23
1.4.2 LSB結構 37
1.4.3 初始化PCB 38
1.4.4 SDA結構 42
1.4.5 初始化SDA 56
1.4.6 DRS結構 57
1.5 系統啟動 59
1.5.1 Boot階段 59
1.5.2 Stage1階段 62
1.5.2.1 Stage1階段的多處理器初始化 66
1.5.2.2 BSP的收尾工作 68
1.5.2.3 APs的stage1階段工作 70
1.5.3 Stage2階段 73
1.5.3.1 BSP在stage2最後處理 80
1.5.3.2 APs在stage2階段收尾工作 81
1.5.4 Stage3階段 83
1.5.4.1 BSP在stage3階段的最後工作 87
1.5.4.2 APs在stage3階段收尾工作 88
1.5.5 例子1-1 90
1.6 系統機制 91
1.6.1 分頁機制 91
1.6.1.1 PAE分頁模式實現 91
1.6.1.2 IA-32e分頁模式實現 98
1.6.2 多處理器機制 102
1.6.2.1 調度任務 102
1.6.2.2 處理器切換 109
1.6.3 調試記錄機制 113
1.6.3.1 例子1-2 120
1.6.3.2 運行結果 121
第2章 VMX架構基礎 122
2.1 虛擬化概述 123
2.1.1 虛擬設備 124
2.1.2 地址轉換 125
2.1.3 設備的I/O訪問 125
2.2 VMX架構 126
2.2.1 VMM與VM 127
2.2.2 VMXON與VMCS區域 127
2.2.3 檢測VMX支持 128
2.2.4 開啟VMX進入允許 128
2.3 VMX operation模式 129
2.3.1 進入VMX operation模式 130
2.3.2 進入VMX operation的制約 131
2.3.2.1 IA32_FEATURE_CONTROL暫存器 131
2.3.2.2 CR0與CR4固定位 133
2.3.2.3 A20M模式 135
2.3.3 設定VMXON區域 135
2.3.3.1 分配VMXON區域 135
2.3.3.2 VMXON區域初始設定 135
2.3.4 退出VMX operation模式 136
2.4 VMX operation模式切換 137
2.4.1 VM entry 138
2.4.2 VM exit 139
2.4.3 SMM雙重監控處理下 140
2.5 VMX能力的檢測 141
2.5.1 檢測是否支持VMX 141
2.5.2 通過MSR組檢查VMX能力 141
2.5.3 例子2-1 146
2.5.4 基本信息檢測 147
2.5.5 允許為0以及允許為1位 149
2.5.5.1 決定VMX支持的功能 150
2.5.5.2 控制欄位設定算法 150
2.5.6 VM-execution控制欄位 151
2.5.6.1 Pin-based VM-execution control欄位 151
2.5.6.2 primary processor-based VM-execution control欄位 152
2.5.6.3 secondary processor-based VM-execution control欄位 152
2.5.7 VM-exit control欄位 152
2.5.8 VM-entry control欄位 153
2.5.9 VM-function control欄位 153
2.5.10 CR0與CR4的固定位 154
2.5.10.1 CR0與CR4暫存器設定算法 155
2.5.11 VMX雜項信息 156
2.5.12 VMCS區域欄位index值 157
2.5.13 VPID與EPT能力 157
2.6 VMX指令 158
2.6.1 VMX指令執行環境 159
2.6.2 指令執行的狀態 159
2.6.3 VMfailValid事件原因 160
2.6.4 指令異常優先權 161
2.6.5 VMCS管理指令 161
2.6.5.1 VMPTRLD指令 162
2.6.5.2 VMPTRST指令 162
2.6.5.3 VMCLEAR指令 162
2.6.5.4 VMREAD指令 163
2.6.5.5 VMWRITE指令 165
2.6.6 VMX模式管理指令 166
2.6.6.1 VMXON指令 167
2.6.6.2 VMXOFF指令 167
2.6.6.3 VMLAUNCH指令 167
2.6.6.4 VMRESUME指令 168
2.6.6.5 返回到executive monitor 168
2.6.7 cache刷新指令 169
2.6.7.1 INVEPT指令 170
2.6.7.2 INVVPID指令 170
2.6.8 調用服務例程指令 171
2.6.8.1 VMCALL指令 171
2.6.8.2 VMFUNC指令 172
第3章 VMCS結構 173
3.1 VMCS狀態 173
3.1.1 activity屬性 174
3.1.2 current屬性 174
3.1.3 launch屬性 174
3.2 VMCS區域 175
3.2.1 VMXON區域 176
3.2.2 Executive-VMCS與SMM-transfer VMCS 176
3.2.3 VMCS區域格式 176
3.3 訪問VMCS欄位 177
3.3.1 欄位ID格式 178
3.3.2 不同寬度的欄位處理 179
3.4 欄位ID值 181
3.4.1 16位欄位ID 181
3.4.2 64位欄位ID 182
3.4.3 32位欄位ID 184
3.4.4 natural-width欄位ID 185
3.5 VM-execution控制類欄位 187
3.5.1 Pin-based VM-execution control欄位 188
3.5.2 processor-based VM-execution control欄位 190
3.5.2.1 primary processor-based VM-execution control欄位 191
3.5.2.2 secondary processor-based VM-execution control欄位 195
3.5.3 exception bitmap欄位 200
3.5.4 PFEC_MASK與PFEC_MATCH欄位 200
3.5.5 I/O bitmap address欄位 202
3.5.6 TSC offset欄位 202
3.5.7 guest/host mask與read shadow欄位 202
3.5.8 CR3-target欄位 203
3.5.9 APIC-access address欄位 203
3.5.10 virtual-APIC address欄位 204
3.5.11 TPR threshold欄位 204
3.5.12 EOI-exit bitmap欄位 204
3.5.13 posted-interrupt notification vector欄位 205
3.5.14 posted-interrupt descriptor address欄位 205
3.5.15 MSR bitmap address欄位 205
3.5.16 executive-VMCS pointer 206
3.5.17 EPTP欄位 206
3.5.18 virtual-processor identifier欄位 207
3.5.19 PLE_Gap與PLE_Window欄位 207
3.5.20 VM-function control欄位 209
3.5.21 EPTP-list address欄位 210
3.6 VM-entry控制類欄位 210
3.6.1 VM-entry control欄位 211
3.6.2 VM-entry MSR-load欄位 214
3.6.3 事件注入控制欄位 214
3.6.3.1 VM-entry interruption information欄位 215
3.6.3.2 VM-entry exception error code欄位 217
3.6.3.3 VM-entry instruction length欄位 217
3.7 VM-exit控制類欄位 218
3.7.1 VM-exit control欄位 218
3.7.2 VM-exit MSR-store與MSR-load欄位 220
3.8 guest-state區域欄位 221
3.8.1 段暫存器欄位 224
3.8.1.1 access rigth欄位 224
3.8.2 GDTR與IDTR欄位 229
3.8.3 MSR欄位 229
3.8.4 SMBASE欄位 229
3.8.5 activity state欄位 230
3.8.6 interruptibility state欄位 232
3.8.7 pending debug exceptions欄位 235
3.8.7.1 #DB異常的處理 237
3.8.8 VMCS link pointer欄位 243
3.8.9 VMX-preemption timer value欄位 243
3.8.10 PDPTEs欄位 243
3.8.11 guest interrupt status欄位 244
3.9 host-state區域欄位 245
3.10 VM-exit信息類欄位 247
3.10.1 基本信息類欄位 248
3.10.1.1 Exit reason欄位 248
3.10.1.2 VM-exit原因 249
3.10.1.3 Exit qualification欄位 255
3.10.1.4 由某些指令引發的VM-exit 256
3.10.1.5 由#DB異常引發的VM-exit 256
3.10.1.6 由#PF異常引發的VM-exit 257
3.10.1.7 由SIPI引發的VM-exit 257
3.10.1.8 由I/O SMI引發的VM-exit 257
3.10.1.9 由任務切換引發的VM-exit 258
3.10.1.10 訪問控制暫存器引發的VM-exit 259
3.10.1.11 由MOV-DR指令引發的VM-exit 260
3.10.1.12 由
I/O指令引發的VM-exit 260
3.10.1.13 由於訪問APIC-access page引發的VM-exit 261
3.10.1.14 由EPT violation引發的VM-exit 262
3.10.1.15 由EOI虛擬化引發的VM-exit 264
3.10.1.16 由APIC-write引發的VM-exit 264
3.10.1.17 guest-linear address欄位 264
3.10.1.18 guest-physical address欄位 265
3.10.2 直接向量事件類信息欄位 265
3.10.2.1 VM-exit interruption information欄位 265
3.10.2.2 VM-exit interruption error code欄位 267
3.10.3 間接向量事件類信息欄位 267
3.10.3.1 IDT-vectoring information欄位 268
3.10.3.2 IDT-vectoring error code欄位 269
3.10.4 指令類信息欄位 269
3.10.4.1 VM-exit instruction length欄位 269
3.10.4.2 VM-exit instruction information欄位 272
3.10.5 I/O SMI信息類欄位 280
3.10.6 指令錯誤類欄位 280
3.11 VMM初始化實例 280
3.11.1 VMCS相關的數據結構 281
3.11.1.1 VMB結構 281
3.11.1.2 VSB結構 284
3.11.1.3 VMCS buffer結構 287
3.11.2 初始化VMXON區域 288
3.11.3 初始化VMCS區域 289
3.11.3.1 分配VMCS區域 290
3.11.3.2 VMCS初始化模式 291
3.11.3.3 VMCS buffer初始化 293
3.11.4 例子3-1 297
第4章 VM-entry處理 301
4.1 發起VM-entry操作 302
4.2 VM-entry執行流程 303
4.3 指令執行的基本檢查 303
4.4 檢查控制區域及host-state區域 305
4.4.1 VM-execution控制區域檢查 305
4.4.1.1 檢查pin-based VM-execution control欄位 306
4.4.1.2 檢查primary processor-based VM-execution control欄位 306
4.4.1.3 檢查secondary processor-based VM-execution欄位 307
4.4.1.4 檢查CR3-target欄位 308
4.4.2 VM-exit控制區域檢查 308
4.4.2.1 VM-exit control欄位的檢查 308
4.4.2.2 MSR-store與MSR-load相關欄位的檢查 308
4.4.3 VM-entry控制區域檢查 309
4.4.3.1 VM-entry control欄位的檢查 309
4.4.3.2 MSR-load相關欄位的檢查 309
4.4.3.3 事件注入相關欄位的檢查 309
4.4.4 Host-state區域的檢查 310
4.4.4.1 Host控制暫存器欄位的檢查 310
4.4.4.2 Host-RIP的檢查 310
4.4.4.3 段selector欄位的檢查 311
4.4.4.4 段基址欄位的檢查 311
4.4.4.5 MSR欄位的檢查 311
4.5 檢查guest-state區域 311
4.5.1 檢查控制暫存器欄位 312
4.5.2 檢查RIP與RFLAGS欄位 312
4.5.3 檢查DR7與IA32_DEBUGCTL欄位 313
4.5.4 檢查段暫存器欄位 313
4.5.4.1 virtual-8086模式下的檢查 314
4.5.4.2 unrestricted guest位為0時的檢查 315
4.5.4.3 unrestricted guest位為1時的檢查 318
4.5.5 檢查GDTR與IDTR欄位 320
4.5.6 檢查MSR欄位 320
4.5.7 檢查activity state欄位 321
4.5.8 檢查interruptibility state欄位 321
4.5.9 檢查pending debug exception欄位 322
4.5.10 檢查VMCS link pointer欄位 322
4.5.11 檢查PDPTE欄位 323
4.5.11.1 由載入CR3引發的PDPTE檢查 323
4.6 檢查guest state引起的VM-entry失敗 324
4.7 載入guest環境信息 324
4.7.1 載入控制暫存器 325
4.7.2 載入DR7與IA32_DEBUGCTL 325
4.7.3 載入MSR 325
4.7.4 SMBASE欄位處理 326
4.7.5 載入段暫存器與描述符表暫存器 326
4.7.5.1 unusable段暫存器 327
4.7.5.2 載入GDTR與IDTR 327
4.7.6 載入RIP、RSP和RFLAGS 327
4.7.7 載入PDPTE表項 327
4.8 刷新處理器cache 328
4.9 更新Vritual-APIC狀態 328
4.9.1 PPR虛擬化 329
4.9.2 虛擬中斷評估與delivery 329
4.10 載入MSR-load列表 329
4.10.1 IA32_EFER的載入處理 330
4.10.2 其他MSR欄位的載入處理 331
4.11 由載入guest state引起的VM-entry失敗 331
4.12 事件注入 332
4.12.1 注入事件的delivery 335
4.12.1.1 保護模式下的事件注入 335
4.12.1.2 實模式下的事件注入 338
4.12.1.3 virtual-8086模式下的事件注入 338
4.12.2 注入事件的間接VM-exit 339
4.13 執行pending debug exception 341
4.13.1 注入事件下的#DB異常delivery 342
4.13.2 例子4-1 346
4.13.3 非注入事件下的#DB異常delivery 351
4.14 使用MTF VM-exit功能 354
4.14.1 注入事件下的MTF VM-exit 354
4.14.2 非注入事件下的MTF VM-exit 355
4.14.3 MTF VM-exit與其他VM-exit 355
4.14.4 MTF VM-exit的優先權別 356
4.14.5 例子4-2 356
4.15 VM-entry後直接導致VM-exit的事件 362
4.15.1 VM-exit事件的優先權別 362
4.15.2 TPR below threshold VM-exit 363
4.15.3 pending MTF VM-exit 364
4.15.4 由pending debug exception引發的VM-exit 364
4.15.5 VMX-preemption timer 364
4.15.6 NMI-window exiting 366
4.15.7 interrupt-window exiting 367
4.16 處理器的可中斷狀態 367
4.16.1 中斷的阻塞狀態 367
4.16.2 阻塞狀態的解除 368
4.16.3 中斷的阻塞 369
4.16.4 VM-entry後的可中斷狀態 370
4.17 處理器的活動狀態 370
4.17.1 active與inactive狀態 371
4.17.2 事件的阻塞 371
4.17.3 inactive狀態的喚醒 372
4.17.4 VM-entry後的活動狀態 372
4.18 VM-entry的機器檢查事件 373
第5章 VM-exit處理 374
5.1 無條件引發VM-exit的指令 374
5.2 有條件引發VM-exit的指令 375
5.3 引發VM-exit的事件 377
5.4 由於VM-entry失敗導致的VM-exit 380
5.5 例子5-1 380
5.6 指令引發的異常與VM-exit 385
5.6.1 優先權高於VM-exit的異常 386
5.6.2 VM-exit優先權高於指令的異常 387
5.6.3 例子5-2 387
5.7 VM-exit的處理流程 389
5.8 記錄VM-exit的相關信息 390
5.9 更新VM-entry區域欄位 391
5.10 更新處理器狀態信息 391
5.10.1 直接VM-exit事件下的狀態更新 393
5.10.2 間接VM-exit事件下的狀態更新 394
5.10.3 其他情況下的狀態更新 395
5.11 保存guest環境信息 397
5.11.1 保存控制暫存器,debug暫存器及MSR 397
5.11.2 保存RIP與RSP 397
5.11.3 保存RFLAGS 399
5.11.4 保存段暫存器 399
5.11.5 保存GDTR與IDTR 400
5.11.6 保存activity與interruptibility狀態信息 400
5.11.7 保存pending debug exception信息 400
5.11.8 保存VMX-preemption timer值 402
5.11.9 保存PDPTE 402
5.11.10 保存SMBASE與VMCS-link pointer 403
5.12 保存MSR-store列表 403
5.13 載入host環境 404
5.13.1 載入控制暫存器 404
5.13.2 載入DR7與MSR 405
5.13.3 載入host段暫存器 405
5.13.3.1 載入selector 406
5.13.3.2 載入base 406
5.13.3.3 載入limit 406
5.13.3.4 載入access rights 407
5.13.4 載入GDTR與IDTR 408
5.13.5 載入RIP,RSP及RFLAGS 408
5.13.6 載入PDPTE 408
5.14 更新host處理器狀態信息 409
5.15 刷新處理器cache信息 409
5.16 載入MSR-load列表 410
5.17 VMX-abort 411
第6章 記憶體虛擬化 412
6.1 EPT(擴展頁表)機制 412
6.1.1 EPT機制概述 413
6.1.1.1 guest分頁機制與EPT 413
6.1.2 EPT頁表結構 416
6.1.3 guest-physical address 417
6.1.4 EPTP 417
6.1.5 4K頁面下的EPT頁表結構 418
6.1.6 2M頁面下的EPT頁表結構 422
6.1.7 1G頁面下的EPT頁表結構 424
6.1.8 EPT導致的VM-exit 425
6.1.8.1 EPT violation 426
6.1.8.2 EPT misconfiguration 427
6.1.8.3 EPT 頁故障的優先權 428
6.1.8.4 修復EPT頁故障 431
6.1.9 accessed與dirty標誌位 436
6.1.10 EPT記憶體類型 438
6.1.11 EPTP switching 440
6.1.12 實現EPT機制 442
6.2 Cache管理 454
6.2.1 linear mapping(線性映射) 455
6.2.2 guest-physical mapping(guest物理映射) 456
6.2.3 combined mapping(合併映射) 456
6.2.4 cache域 458
6.2.5 cache建立 463
6.2.6 cache刷新 465
6.2.6.1 INVLPG指令刷新cache 467
6.2.6.2 INVPCID指令刷新cache 468
6.2.6.3 INVVPID指令刷新cache 469
6.2.6.4 INVEPT指令刷新cache 470
6.2.6.5 INVVPID指令使用指南 470
6.2.6.6 INVEPT指令使用指南 471
6.3 記憶體虛擬化管理 473
6.3.1 分配物理記憶體 473
6.3.2 實模式guest OS記憶體處理 475
6.3.3 guest記憶體虛擬化 476
6.3.3.1 guest虛擬地址轉換 477
6.3.3.2 guest OS的cache管理 479
6.4 例子6-1 482
6.4.1 GuestBoot模組 483
6.4.2 GuestKernel模組 486
6.4.3 VSB結構 495
6.4.4 VMM初始化guest 498
6.4.5 使用VMX-preemption timer 503
6.4.6 host處理流程 507
6.4.7 運行結果 511
第7章 中斷虛擬化 522
7.1 異常處理 522
7.1.1 反射異常給guest 523
7.1.2 恢復guest異常 526
7.1.2.1 直接恢復 526
7.1.2.2 例子7-1 527
7.1.2.3 恢復原始向量事件 533
7.1.3 處理任務切換 535
7.1.3.1 檢查任務切換條件 535
7.1.3.2 VMM處理任務切換 537
7.1.3.3 恢復guest運行 547
7.1.3.4 例子7-2 551
7.2 Local APIC虛擬化 554
7.2.1 監控guest訪問local APIC 554
7.2.1.1 例子7-3 555
7.2.2 local APIC虛擬化機制 571
7.2.3 APIC-access page 573
7.2.3.1 APIC-access page的設定 574
7.2.4 虛擬化x2APIC MSR組 577
7.2.5 virtual-APIC page 578
7.2.6 APIC-access VM-exit 581
7.2.6.1 APIC-access VM-exit優先權別 581
7.2.7 虛擬化讀取APIC-access page 582
7.2.8 虛擬化寫入APIC-access page 584
7.2.9 虛擬化基於MSR讀local APIC 587
7.2.10 虛擬化基於MSR寫local APIC 588
7.2.11 虛擬化基於CR8訪問TPR 589
7.2.12 local APIC虛擬化操作 589
7.2.12.1 TPR虛擬化 590
7.2.12.2 PPR虛擬化 591
7.2.12.3 EOI虛擬化 591
7.2.12.4 Self-IPI虛擬化 593
7.2.13 虛擬中斷的評估與delivery 593
7.2.13.1 虛擬中斷的評估 594
7.2.13.2 虛擬中斷的delivery 596
7.2.14 posted-interrupt處理 597
7.3 中斷處理 601
7.3.1 攔截INT指令 601
7.3.1.1 處理IDTR.limit 602
7.3.1.2 處理#GP異常 605
7.3.1.3 處理中斷delivery 608
7.3.1.4 完成中斷的delivery操作 618
7.3.1.5 例子7-4 628
7.3.2 處理NMI 632
7.3.2.1 攔截NMI 632
7.3.2.2 虛擬NMI 634
7.3.3 處理外部中斷 634
7.3.3.1 攔截外部中斷 634
7.3.3.2 轉發外部中斷 635
7.3.3.3 監控guest設定8259 637
7.3.3.4 例子7-5 642