VMCS研究总结
2016-05-25 18:04
302 查看
VMCS是Intel VT-x中一个很重要的数据结构,它占用一个page大小,由VMM分配,但是硬件是需要读写的,有点类似于页表。vmcs的各个域在manual中有说明,但是每个域在vmcs页中的具体位置是不知道的,程序员不用关心,只需要用相应的VMWRITE和VMREAD指令去访问。这样做的好处是,vmcs页中结构的具体layout可以透明的进行变动。
下面从三个方面总结一下:
一是vmcs组成部分;
二是kvm中vmcs分配与初始化路径;
三是kvm配置vmcs中一些重要的域。
首先来看vmcs组成部分,这个可以参考"IA32 Intel Architecture Software Developer's Manual Volume 3B System Programming Guide",这里简单总结一下:
* 1. Guest State Area
* 2. Host State Area
* 3. VM Execution Control Fields
* 3.1 32bit pin-based exec ctrl
* 3.2 32bit cpu-based exec ctrl
* 3.3 32bit cpu-based secondary exec ctrl
* 3.4 32bit exeception bitmap
* 3.5 64bit physical addr of I/O bitmaps A and B(each is 4KB in size)
* 3.6 64bit TSC-offset
* 3.7 controls for APIC access
* 4. VM-Exit Control Fields
* 4.1 32bit VM-Exit Controls
* 4.2 32+64bit VM-Exit Controls for MSRs
* 5. VM-Entry Control Fields
* 5.1 32bit VM-Entry Controls
* 5.2 VM-Entry Controls for Event Injection
* 5.2.1 32bit VM-Entry Interruption-information field
* 5.2.2 32bit VM-Entry exception error code
* 5.2.3 32bit VM-Entry instruction length
* 5.3 32+64bit VM-Entry Controls for MSRs
* 6. VM-Exit Information Fields
再来看kvm分配与初始化vmcs的代码路径。我发现有两个路径都是要分配vmcs的:
第一是kvm内核模块加载时,在hardware_setup中调用alloc_kvm_area,进而对每一个cpu调用alloc_vmcs_cpu。另外,setup_vmcs_config很重要,是kvm默认对vmcs的一些配置,第三部分再讲,要注意的是它只是将配置记录到额外的一个结构vmcs_config中,并没有真正就写入vmcs了,后面真正写vmcs会用到这个结构。
vmx_init(vmx.c)
|
kvm_init(kvm_main.c)
|
kvm_arch_init(kvm_main.c) --> kvm_arch_hardware_setup
| |
kvm_timer_init(x86.c) kvm_x86_ops->hardware_setup(vmx.c)
|
setup_vmcs_config(vmx.c) --> alloc_kvm_area(vmx.c)
| for_each_cpu
alloc_vmcs_cpu(vmx.c)
第二是创建vcpu时,因为每个vcpu应该要单独对应一个vmcs。可以看到,这里也是用alloc_vmcs_cpu分配一个页的vmcs.另外,vmx_vcpu_setup很重要,它是真正地将配置写入vmcs页中去了。
KVM_CREATE_VCPU ---> kvm_vm_ioctl (kvm_main.c)
|
kvm_vm_ioctl_create_vcpu(kvm_main.c)
|
kvm_arch_vcpu_create(x86.c)
|
kvm_x86_ops->vcpu_create(vmx_create_vcpu in vmc.c)
|
alloc_vmcs(vmx.c) ---> vmx_vcpu_setup
| |
alloc_vmcs_cpu(vmx.c) vmcs_writel --> guest_write_tsc
最后来看kvm对vmcs的一些重要配置。它几个部分的配置比较的分散:
IO bitmap A and B在vmx_init中配置,毕竟vmcs中记录的只是IO bitmap的物理地址。
VM execution control、VM entry control及VM exit control三个部分。它们的具体配置是在setup_vmcs_config(注意这个是通用配置,后面特定的vcpu可以有修改),其中重要的设置有:
1. PIN_BASED_EXT_INTR_MASK;标志着external interrupt会导致VMExit;
2. 没有RDTSC_EXITING;标志着rdtsc指令不会导致VMExit,guest可以直接读取物理TSC;
3. CPU_BASED_USE_TSC_OFFSETTING;标志着读取的物理TSC还要加上一个TSC_OFFSET才得到guest TSC;
4. CPU_BASED_USE_IO_BITMAPS;标志着每个guest IO指令产不产生VMExit要去查IO bitmap;
5. SECONDARY_EXEC_ENABLE_EPT;标志着默认是打开ept特性的;6. 没有VM_EXIT_ACK_INTR_ON_EXIT;我的理解是这样的—原来在guest模式下,中断是关闭的,但是会导致VMExit(上1配置)。Exit后kvm内核代码立刻开中断,这时必须能检测到这个中断。如果VMExit时就自动ack了,再开中断时就检测不到这个中断了。
7. 1-6都是Execution control,至于Entry和Exit control在setup_vmcs_config中固定配置比较少。
下面从三个方面总结一下:
一是vmcs组成部分;
二是kvm中vmcs分配与初始化路径;
三是kvm配置vmcs中一些重要的域。
首先来看vmcs组成部分,这个可以参考"IA32 Intel Architecture Software Developer's Manual Volume 3B System Programming Guide",这里简单总结一下:
* 1. Guest State Area
* 2. Host State Area
* 3. VM Execution Control Fields
* 3.1 32bit pin-based exec ctrl
* 3.2 32bit cpu-based exec ctrl
* 3.3 32bit cpu-based secondary exec ctrl
* 3.4 32bit exeception bitmap
* 3.5 64bit physical addr of I/O bitmaps A and B(each is 4KB in size)
* 3.6 64bit TSC-offset
* 3.7 controls for APIC access
* 4. VM-Exit Control Fields
* 4.1 32bit VM-Exit Controls
* 4.2 32+64bit VM-Exit Controls for MSRs
* 5. VM-Entry Control Fields
* 5.1 32bit VM-Entry Controls
* 5.2 VM-Entry Controls for Event Injection
* 5.2.1 32bit VM-Entry Interruption-information field
* 5.2.2 32bit VM-Entry exception error code
* 5.2.3 32bit VM-Entry instruction length
* 5.3 32+64bit VM-Entry Controls for MSRs
* 6. VM-Exit Information Fields
再来看kvm分配与初始化vmcs的代码路径。我发现有两个路径都是要分配vmcs的:
第一是kvm内核模块加载时,在hardware_setup中调用alloc_kvm_area,进而对每一个cpu调用alloc_vmcs_cpu。另外,setup_vmcs_config很重要,是kvm默认对vmcs的一些配置,第三部分再讲,要注意的是它只是将配置记录到额外的一个结构vmcs_config中,并没有真正就写入vmcs了,后面真正写vmcs会用到这个结构。
vmx_init(vmx.c)
|
kvm_init(kvm_main.c)
|
kvm_arch_init(kvm_main.c) --> kvm_arch_hardware_setup
| |
kvm_timer_init(x86.c) kvm_x86_ops->hardware_setup(vmx.c)
|
setup_vmcs_config(vmx.c) --> alloc_kvm_area(vmx.c)
| for_each_cpu
alloc_vmcs_cpu(vmx.c)
第二是创建vcpu时,因为每个vcpu应该要单独对应一个vmcs。可以看到,这里也是用alloc_vmcs_cpu分配一个页的vmcs.另外,vmx_vcpu_setup很重要,它是真正地将配置写入vmcs页中去了。
KVM_CREATE_VCPU ---> kvm_vm_ioctl (kvm_main.c)
|
kvm_vm_ioctl_create_vcpu(kvm_main.c)
|
kvm_arch_vcpu_create(x86.c)
|
kvm_x86_ops->vcpu_create(vmx_create_vcpu in vmc.c)
|
alloc_vmcs(vmx.c) ---> vmx_vcpu_setup
| |
alloc_vmcs_cpu(vmx.c) vmcs_writel --> guest_write_tsc
最后来看kvm对vmcs的一些重要配置。它几个部分的配置比较的分散:
IO bitmap A and B在vmx_init中配置,毕竟vmcs中记录的只是IO bitmap的物理地址。
VM execution control、VM entry control及VM exit control三个部分。它们的具体配置是在setup_vmcs_config(注意这个是通用配置,后面特定的vcpu可以有修改),其中重要的设置有:
1. PIN_BASED_EXT_INTR_MASK;标志着external interrupt会导致VMExit;
2. 没有RDTSC_EXITING;标志着rdtsc指令不会导致VMExit,guest可以直接读取物理TSC;
3. CPU_BASED_USE_TSC_OFFSETTING;标志着读取的物理TSC还要加上一个TSC_OFFSET才得到guest TSC;
4. CPU_BASED_USE_IO_BITMAPS;标志着每个guest IO指令产不产生VMExit要去查IO bitmap;
5. SECONDARY_EXEC_ENABLE_EPT;标志着默认是打开ept特性的;6. 没有VM_EXIT_ACK_INTR_ON_EXIT;我的理解是这样的—原来在guest模式下,中断是关闭的,但是会导致VMExit(上1配置)。Exit后kvm内核代码立刻开中断,这时必须能检测到这个中断。如果VMExit时就自动ack了,再开中断时就检测不到这个中断了。
7. 1-6都是Execution control,至于Entry和Exit control在setup_vmcs_config中固定配置比较少。
相关文章推荐
- Linux下三大免费桌面虚拟机评测
- 康诺云推出三款智能硬件产品,为健康管理业务搭建数据池
- 注册表的组织结构
- Ruby on Rails所构建的应用程序基本目录结构总结
- SQLSERVER的非聚集索引结构深度理解
- 调整SQLServer2000运行中数据库结构
- C#基础语法:结构和类区别详解
- 深入c# 类和结构的区别总结详解
- c#结构和类的相关介绍
- C#中结构(struct)的部分初始化和完全初始化实例分析
- C#中类与结构的区别实例分析
- C#枚举类型与结构类型实例解析
- javascript实现表现、结构、行为分离的选项卡效果!
- 实用的js 焦点图切换效果 结构行为相分离
- asp下生成目录树结构的类
- 深入解析C#编程中struct所定义的结构
- 浅谈Android系统的基本体系结构与内存管理优化
- Android编程入门之HelloWorld项目目录结构分析