|
想要查看内容赶紧注册登陆吧!
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
内容简介编辑 播报
本书针对在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架构的一些特色功能进行辅助讲解。 [1]
读者阅读本书,可以学习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
回复可见:
|
|