设为首页 收藏本站
查看: 1159|回复: 0

[经验分享] 内核虚拟化KVM——overview

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2015-12-24 15:25:17 | 显示全部楼层 |阅读模式
KVM(Kernel-Based Virtual Machine)是基于Linux内核的虚拟机。2006年10月,由以色列的Qumranet组织开发的一种新的“虚拟机”实现方案。2007年2月发布的Linux2.6.20内核第一次包含了KVM。


下图是KVM,VMM,Guest通信的流程:
DSC0000.gif

在3者通信中,KVM主要做了两件事儿:


  • 把VMM的一些配置,配置到guest上
  • 把guest的一些events根据情况交给VMM处理

VMM(Virtual Machine Monitor)要启动一个VCPU,那么VMM就会向KVM发一个command,那么KVM就会把VCPU启动起来。如果VCPU运行期间遇到特殊events,那么它会中断运行,把事件传给KVM,KVM来修正。如果KVM不能修正这个事儿,就传给VMM。VMM可以看作KVM上层的工具。VMM向KVM发送请求通过KVM API,比如:
System IOCTL:
system_fd = open("/dev/kvm", ...)
vm_fd = ioctl(system_fd, KVM_CREATE_VM, ...)
创建一个VM
VM IOCTL:
vcpu_fd = ioctl(vm_fd, KVM_CREATE_VCPU,...)
创建一个VCPU
VCPU IOCTL:
status = ioctl(vcpu_fd, KVM_RUN, ...)
VCPU运行起来




CPU Virtualization:


VCPU的运行概述:
DSC0001.gif
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, ...
DSC0002.gif


这里guest的physical address实际映射到host的虚拟内存,而不是物理内存
这里看一下虚拟地址到物理地址的转换,shadow page与EPT:
DSC0003.gif
在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。
DSC0004.gif

这个是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,进行模拟
DSC0005.gif


当从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:
DSC0006.gif

MMIO在Guest OS的page table中是没有映射的,每次访问都会产生一个异常,这个异常会被KVM捕获,然后再对应到相应的设备上,然后对设备进行模拟。如果引起异常的物理地址在register的memory中找不到,则认为是MMIO。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-155833-1-1.html 上篇帖子: kvm-kmod-2.6.33.1数据结构 下篇帖子: Qemu-KVM TSC研究总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表