kernel hacker修炼之道之内核虚拟化KVM——overview
转载于:http://blog.csdn.net/woshixingaaa/article/details/7256180 KVM(Kernel-Based Virtual Machine)是基于Linux内核的虚拟机。2006年10月,由以色列的Qumranet组织开发的一种新的“虚拟机”实现方案。2007年2月发布的Linux2.6.20内核第一次包含了KVM。下图是
转载于:http://blog.csdn.net/woshixingaaa/article/details/7256180
KVM(Kernel-Based Virtual Machine)是基于Linux内核的虚拟机。2006年10月,由以色列的Qumranet组织开发的一种新的“虚拟机”实现方案。2007年2月发布的Linux2.6.20内核第一次包含了KVM。
下图是KVM,VMM,Guest通信的流程:
在3者通信中,KVM主要做了两件事儿:
- 把VMM的一些配置,配置到guest上
- 把guest的一些events根据情况交给VMM处理
CPU Virtualization:
VCPU的运行概述:
Guest OS运行起来后VMM就会产生一个VCPU,VCPU靠一个thread运行。VMM实际是HOST中的一个进程,而VCPU就是其中一个thread。VMM调用VCPU运行的API后,会陷入内核,VCPU就开始运行了,此时VCPU运行在guest中。KVM中会调用VM运行的API让VM运行起来,如果此时产生什么events,那么KVM中调用VM退出的API,使VM停止,检查原因,如果KVM能fix这个events,那么在KVM中fix,否则退到VMM中,如果能fix就fix,VCPU重新运行,否则VCPU停止。
也有一些APIs可以读写VCPU的属性,当然也是通过ioctl函数,传递的参数如:KVM_SET_REG,KVM_GET_REG,KVM_GET_SREG ,KVM_GET_SREG.......
Memory Virtualization:
可以通过API注册guest physical address到host userspace address的映射。
ioctl(vm_fd, KVM_SET_USER_MEMORY_REGION,....)
-guest_phys_addr, memory_size, userspace_addr, ...
这里guest的physical address实际映射到host的虚拟内存,而不是物理内存
这里看一下虚拟地址到物理地址的转换,shadow page与EPT:
在Guest OS中要访问physical address的时候,会产生page fault,这时KVM会根据Guest OS的page table填充shadow page。shadow page中存放了Guest OS virtual address到HOST OS physical address的转换。这里的write-protected主要的作用是写Guest OS的page table的时候会产生异常,这样就会同步shadow page了。Guest CR3是不会被加载的,只用于帮助KVM修正shadow page,实际加载的是shadow page的CR3。
这个是EPT,是intel的地址转换技术。EPT也是由KVM一层层修正的。
shadow page与EPT比较:
- shadow page会比较浪费,每次context swtich shadow page就没了,但是如果一个进程如果有多个线程,那么可以共享这个进程的shadow page
- 所有VCPU都加载同一个EPT,如果转换被cache了可以直接用,否则去EPT中找。如果EPT没有,则VCPU退出到guest,进入KVM中修正
在有EPT支持的时候,就可以关掉shadow page了。
IO Virtualization:
当访问guest IO的时候会引发VM-EXIT,然后KVM会解释这个退出event,进行模拟
当从VMM中退出后,检查时候是否是IO访问引起的,如果是获得端口号,长度和方向。如果是端口是被KVM emulate的,则进入KVM中emulate。如果端口是被VMM emuate的,则进入VMM中emulate。那么IO emulate放在KVM中比较好呢,还是放在VMM中emulate比较好呢?比如VM-EXIT了,此时VCPU要退出guest,进入KVM,如果不是KVM emulate的,那么则进入VMM,处理完后再退入KVM,然后再退入guest。如果emulate在KVM中,就省去了进入VMM了。
MMIO的emulation:
更多推荐
所有评论(0)