这部分只要介绍下虚拟化技术中的内存虚拟化和IO虚拟化两个部分


内存虚拟化:

虚拟化的理论-内存和IO虚拟化_第1张图片




   上图中的做伴部分是正常情况下内存的使用情况,线性地址到物理地址的一个转换,通常应用程序使用的内存地址是线性地址,需要通过MMU地址转换的一个硬件来实现线性地址到物理地址的一个转换。上图的有半部分是虚拟化情况下内存是如何实现线性地址到物理地址的转换,虚拟机中的OS获得是有Host OS分配的线性地址,Guest OS中的应用程序获取的是相对于Guest os来说的线性地址,那么对于这个线性地址来说最终只能转换成线性地址,无法转换成正在的物理地址,虚拟化中就提供了一个虚拟的MMU直接将Guest OS中的线性地址直接转换成真正的物理地址,但是这个虚拟的MMU毕竟是虚拟出来的没有真实的硬件MMU性能好而且虚拟MMU的开发也很复杂,每一个Guest都要有一个MMU,这对内存消耗太大。对于这种技术我们称作是影子页表技术。

   此后Intel开创了EPT(Extended Page Tables)技术,相对于影子页表技术来说EPT技术降低了内存虚拟化的难度,EPT技术是直接在硬件上实现了Guest OS中的线性地址到Guest OS中的物理地址再到Host OS中的物理地址的两次转换。EPT实现过程如下:

虚拟化的理论-内存和IO虚拟化_第2张图片

1.首先Guest OS中的线性地址通过Guest OS中的CR3页目录寄存器实现了线性地址到物理地址的一个转换。

2.Guest OS中的物理地址直接通过EPT表将其转换成真正的Host OS中的物理地址,并且EPT表只需要维护一个即可。

下面介绍一下另外一个概念VPID:

Vm-Entry 和Vm-Exit时,会强制cpu刷新tlb,全部内容失效, 不管是VMM页表, 还是各个虚拟机的ept页表的tlb缓存。

什么是tlb呢?

   tlb又叫联想寄存器,用于保存线性地址到物理地址的转换结果,方便下次相同线性地址直接由tlb中的缓存获取直接转换成物理地址.


什么是VM-Entry和VM-Exit?

VM-Entry:CPU由根模式切换到非根模式,从虚拟机的角度将,CPU从VMM切换到客户机执行。一般有VMM主动发起。

VM-Exit:和VM-Entry相反

CPU虚拟化的内容请参考我的博文:http://forlinux.blog.51cto.com/8001278/1408784


什么是VPID:

   vpid其实就是给每一个vcpu(分配给每一个Guest OS中的CPU)分配的一个唯一标识,用于标识tlb项是属于哪个vcpu的,那么自从有了VPID那么VM-Exit和VM-Entry的切换将不会刷新tlb内容。一定程序上提高了效率。


IO虚拟化:

   IO虚拟化的过程如下:

   



虚拟化的理论-内存和IO虚拟化_第3张图片


最左边IO虚拟化的使用的是仿真技术:

仿真(emulation)是一个完全通过软件程序来模拟硬件的技术。早期虚拟化都才采用这种方案来虚拟网络设备。常见仿真软件有QEMU、VMware WorkStation、VirtualBox。Emulation网


中间的IO虚拟化是Para-virtualization:

Para-virtualization又称半虚拟化,最早由Citrix的Xen提出使用。在半虚拟化模型中,物理硬件资源统一由 Hypervisor管理,由Hypervisor提供资源调用接口。虚拟子机通过特定的调用接口与Hypervisor通信,然后完整I/O资源控制操.


最右边的是直接IO

Hypervisor将一个PCI设备(可以是网卡、USB、光驱)直接分配给指定虚拟子机单独访问。为了安全和稳定性考虑,pass-through使用通常结合intel VT-D(AMD也有类似技术)来使用,通过iommu保证虚拟子机之间内存访问不冲突。这种技术在VMware上叫VMDirectPath I/O,其他方案中没有找到相关专门名词。