《处理器虚拟化技术》
基本信息
作者: 邓志
出版社:电子工业出版社
ISBN:9787121230196
上架时间:2014-5-30
出版日期:2014 年6月
开本:16开
页码:646
版次:1-1
所属分类:计算机 > 计算机组织与体系结构 > 微处理器/CPU
更多关于》》》《处理器虚拟化技术》
编辑推荐
《处理器虚拟化技术》一书深入讲解了Intel VT-x技术的VMX架构知识,并且对整个x86/x64体系有更深入的探讨!全书案例丰富,结构规整,可读性强!
内容简介
书籍
计算机书籍
《处理器虚拟化技术》针对在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体系熟悉,因为,在处理器的虚拟化技术里需要使用全方位的体系知识,对处理器在非常细节的地方进行虚拟化处理。
因此,《处理器虚拟化技术》适合有一定x86/x64体系知识基础或者想更深入学习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 right 字段 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 control 字段 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 426
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(合并映射) 457
6.2.4 cache 域 458
6.2.5 cache 建立 463
6.2.6 cache 刷新 465
6.2.6.1 invlpg 指令刷新cache 468
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
《处理器虚拟化技术》