KVM面试前总结

1,框架

KVM 分为了两个模块,一个是KVM Driver, 另一个是QEMU。前者负责CPU和内存的虚拟化,后者负责IO的虚拟化。用户空间的QEMU调用一系列的ioctl() 函数进入内核空间,然后内核控件再调用一系列函数进入Guest OS客户空间运行虚拟机。

问题:为什么分为两部分? IO设备用KVM不能被虚拟化么?
因为KVM是linux内核加载的一个模块,modprobe kvm执行之后呢,kernel马上就变成了Hypervisor。这里kvm能利用linux本身的系统调用,内存管理等进程管理的办法,提升了很大的效率,也很简便。
IO设备一般都是用QEMU来虚拟的,在不支持硬件虚拟化的机器上,QEMU也可以用来虚拟CPU,只是采用二进制动态翻译效率不是很好。远不及KVM.


2,kvm各模式说明

有三种模式:用户模式,内核模式,客户模式。 QEMU运行在用户模式,用户模式就是一般意义上运行的进程的模式,QEMU调用一系列的ioctl就可以进入内核模式,这里内核模式再调用kvm_create等函数就可以进入客户模式,客户模式也就是虚拟机运行的模式。

但是如果虚拟机出现了异常或者常见的缺页中断或者IO操作的时候呢,他是没有权限对全局资源进行操作的,这样就会被VMM,这里也就是KVM进行捕获,然后捕获之后呢再跳转到用户模式调用QEMU进行IO操作。所以说内核模式其实是个中间变量,专门用来进行错误发现的时候的转换的。


3,CPU虚拟化

CPU的虚拟化本质上是时间分片。这里我们用的是KVM来虚拟的。流程如下:
QEMU调用ioctl进入内核,内核读取VMCS,(这里先解释下VMCS,VMCS是异常处理的关键结构,里面存储了客户机,宿主机,陷入退出的各种状态。)把客户机的状态装在到CPU的CS:EIP,然后执行 kvm_exit_handler. 如果是IO引起的,则进入用户模式,执行QEMU.


4,内存虚拟化

一般的内存虚拟化都经过了两次的页表转换。 客户机线性地址到 客户机物理地址, 然后再到宿主机物理地址。 这样经过了两次转换,效率很难提高。于是就出现了影子页表。
这里就不得不说影子页表了。 这里有一张hash表,维护者物理机和客户机的内存地址映射表。 那么如何被建立的呢?

当发生页故障的时候,VMM搜索客户页表,如果不存在客户线性地址VGA 到 客户机物理地址 GPA的转换,那么则返回给虚拟机异常,由虚拟机处理页故障。
如果存在映射关系,则先去寻找QEMU地址空间的主机线性地址 HVA, 如果不存在 HVA 映射到 HPA, 那么kernel 去分配物理地址。 然后VMM可以使用该HPA构建影子页表。 至此,影子页表建立完成。


你可能感兴趣的:(Sina实习篇)