VMCS研究总结
来源:互联网 发布:淘宝垃圾流量突然暴涨 编辑:程序博客网 时间:2024/05/11 22:18
再来看kvm分配与初始化vmcs的代码路径。我发现有两个路径都是要分配vmcs的:
第一是kvm内核模块加载时,在hardware_setup中调用alloc_kvm_area,进而对每一个cpu调用alloc_vmcs_cpu。这里的每一个cpu应该是物理cpu了,为什么要对每个物理cpu都分配一个页的vmcs空间觉得有点奇怪,还没想明白。另外,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,所以我就觉得奇怪,既然每个vcpu都分配了vmcs页,为什么pcpu也要每个都分配一个vmcs页,不是可以像页表那样,用一个寄存器指向当前vcpu的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的物理地址。具体的配置这里就不说了。
我现在关心的vmcs配置是: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中固定配置比较少,现在也不太关心,以后再总结。
0 0
- VMCS研究总结
- VMCS研究总结
- Intel VMCS学习总结
- 操作系统虚拟化原理总结篇——VMCS详解
- 2.3 VMCS
- 看操作系统虚拟化原理总结篇——VMCS详解
- 看操作系统虚拟化原理总结篇——VMCS详解
- VMX学习-VMCS
- VMX和VMCS
- VT VMCS结构信息
- VT系列:VMCS表填写
- SNMP/SMI研究总结
- NDK的研究总结
- smartgwt研究总结
- 复眼研究周总结
- onvif研究总结
- Javascript研究心得总结
- Java容器研究总结
- nyoj题目153:king VS king
- 延迟菜单函数
- 公司要使用php做一些开发,开始学习php
- Android中Activity中使用ListView与ListActivity中使用ListView的区别与联系
- 多图片滚动
- VMCS研究总结
- 图片抖动
- 关于条件编译的简单总结
- struts2:Action、interceptor继承的基类和获得作用域的方式
- matlab的输入输出常见语句
- 解决sudo 命令,提示 command not found 问题
- BeginPaint 和GetDC的区别
- C语言二分图匹配(4)___棋盘游戏(Hdu 1281)
- 容器中clear()和erase()的区别