kernel hacker修炼之道之内核虚拟化KVM——overview_OpenStack, 云计算等杂项讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  OpenStack, 云计算等杂项讨论区 »
总帖数
12
每页帖数
101/2页12
返回列表
0
发起投票  发起投票 发新帖子
查看: 10440 | 回复: 11   主题: kernel hacker修炼之道之内核虚拟化KVM——overview        上一篇   下一篇 
    本主题由 赖文婷 于 2012-11-15 16:37:34 加亮
barry
注册用户
等级:中校
经验:1534
发帖:236
精华:2
注册:2012-1-13
状态:离线
发送短消息息给barry 加好友    发送短消息息给barry 发消息
发表于: IP:您无权察看 2012-2-15 11:11:08 | [全部帖] [楼主帖] 楼主

         内核虚拟化KVM——overview
                                                    作者    李万鹏

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处理
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的运行概述:
北京联动北方科技有限公司
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:
北京联动北方科技有限公司
MMIO在Guest OS的page table中是没有映射的,每次访问都会产生一个异常,这个异常会被KVM捕获,然后再对应到相应的设备上,然后对设备进行模拟。如果引起异常的物理地址在register的memory中找不到,则认为是MMIO。

该贴由koei转至本版2012-2-15 19:25:43



赞(0)    操作        顶端 
dream007
注册用户
等级:少校
经验:1086
发帖:53
精华:0
注册:2015-7-2
状态:离线
发送短消息息给dream007 加好友    发送短消息息给dream007 发消息
发表于: IP:您无权察看 2015-9-7 21:55:44 | [全部帖] [楼主帖] 2  楼

学习了,感谢分享



赞(0)    操作        顶端 
容景93
注册用户
等级:上士
经验:254
发帖:0
精华:0
注册:2015-12-4
状态:离线
发送短消息息给容景93 加好友    发送短消息息给容景93 发消息
发表于: IP:您无权察看 2015-12-4 17:40:24 | [全部帖] [楼主帖] 3  楼

都是大神啊,小弟甘拜下风~



赞(0)    操作        顶端 
云浅月93
注册用户
等级:少尉
经验:328
发帖:0
精华:0
注册:2015-12-4
状态:离线
发送短消息息给云浅月93 加好友    发送短消息息给云浅月93 发消息
发表于: IP:您无权察看 2015-12-4 17:43:16 | [全部帖] [楼主帖] 4  楼

oo   闹太套~~~顶楼主~~~~大神



赞(0)    操作        顶端 
风一样的菇凉
注册用户
等级:上等兵
经验:142
发帖:0
精华:0
注册:2015-12-8
状态:离线
发送短消息息给风一样的菇凉 加好友    发送短消息息给风一样的菇凉 发消息
发表于: IP:您无权察看 2015-12-8 17:52:56 | [全部帖] [楼主帖] 5  楼



赞(0)    操作        顶端 
人诛一梦
注册用户
等级:下士
经验:154
发帖:0
精华:0
注册:2016-1-13
状态:离线
发送短消息息给人诛一梦 加好友    发送短消息息给人诛一梦 发消息
发表于: IP:您无权察看 2016-2-1 14:59:14 | [全部帖] [楼主帖] 6  楼



赞(0)    操作        顶端 
jinggege
注册用户
等级:中士
经验:241
发帖:0
精华:0
注册:2016-2-26
状态:离线
发送短消息息给jinggege 加好友    发送短消息息给jinggege 发消息
发表于: IP:您无权察看 2016-3-10 20:24:00 | [全部帖] [楼主帖] 7  楼

1. KVM架构

kvm基本结构有2个部分构成:

kvm 驱动,现在已经是linux kernel的一个模块了。其主要负责虚拟机的创建,虚拟内存的分配,VCPU寄存器的读写以及VCPU的运行。

另个组成是Qemu,用于模拟虚拟机的用户空间组件,提供I/O设备模型,访问外设的途径。

图1 kvm基本结构

kvm基本结构如上图。kvm已经是内核模块,被看作是一个标准的linux 字符集设备(/dev/kvm)。Qemu通过libkvm应用程序接口,用fd通过ioctl向设备驱动来发送创建,运行虚拟机命令。设备驱动kvm就会来解析命令(kvm_dev_ioctl函数在kvm_main.c文件中),如下图:

图2 kvm_dev_ioctl函数

kvm 模块让Linux主机成为一个虚拟机监视器(VMM),并且在原有的Linux两种执行模式基础上,新增加了客户模式,客户模式拥有自己的内核模式和用户模式。在虚拟机运行时,三种模式的工作各为:

客户模式: 执行非I/O的客户代码,虚拟机运行在这个模式下。

用户模式:代表用户执行I/O指令,qemu运行在这个模式下。

内核模式:实现客户模式的切换,处理因为I/O或者其他指令引起的从客户模式退出(VM_EXIT)。kvm 模块工作在这个模式下。

在kvm的模型中,每一个Gust OS都是作为一个标准的linux进程,都可以使用linux进程管理命令管理。

这里假如qemu通过ioctl发出KVM_CREATE_VM 指令,创建了一个VM后,qemu需要需要发送一些命令给VM,如KVM_CREATE_VCPU。这些命令当然也是通过ioctl发送的,用户程序中用ioctl发送KVM_CREATE_VM得到的返回值就是新创建的VM对应的fd(kvm_vm),fd是创建的指向特定虚拟机实例的文件描述符,之后利用这个fd发送命令给VM进行访问控制。kvm解析这些命令的函数是kvm_vm_ioctl。

2. KVM 工作原理

kvm基本工作原理概述:

用户模式的qemu利用libkvm通过ioctl进入内核模式,kvm模块未虚拟机创建虚拟内存,虚拟CPU后执行VMLAUCH指令进入客户模式。加载Guest OS并执行。如果Guest OS 发生外部中断或者影子页表缺页之类的情况,会暂停Guest OS的执行,退出客户模式出行异常处理,之后重新进入客户模式,执行客户代码。如果发生I/O事件或者信号队列中有信号到达,就会进入用户模式处理。(如下图)




赞(0)    操作        顶端 
filogra
注册用户
等级:少校
经验:1408
发帖:13
精华:0
注册:2015-6-2
状态:离线
发送短消息息给filogra 加好友    发送短消息息给filogra 发消息
发表于: IP:您无权察看 2016-4-26 9:38:18 | [全部帖] [楼主帖] 8  楼



赞(0)    操作        顶端 
山友木樨
注册用户
等级:少校
经验:1040
发帖:9
精华:0
注册:2015-6-1
状态:离线
发送短消息息给山友木樨 加好友    发送短消息息给山友木樨 发消息
发表于: IP:您无权察看 2016-4-27 8:29:11 | [全部帖] [楼主帖] 9  楼

顶一个



赞(0)    操作        顶端 
beefly
注册用户
等级:上尉
经验:758
发帖:1
精华:0
注册:2015-7-27
状态:离线
发送短消息息给beefly 加好友    发送短消息息给beefly 发消息
发表于: IP:您无权察看 2016-4-27 20:23:39 | [全部帖] [楼主帖] 10  楼

学习一下



赞(0)    操作        顶端 
总帖数
12
每页帖数
101/2页12
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论