在kvm技术中,应用到的两个东西:qemu和kvm。其中kvm负责cpu虚拟化和内存虚拟化,但是kvm不能模拟其他设备,qemu是模拟IO设备(网卡,磁盘),kvm加上qemu之后就能实现真正意义上的服务器虚拟化

 

kvm运行在完全虚拟化环境中,即硬件,VMM,客户机操作系统。虚拟机发出的指令由VMM进行捕获




kvm虚拟化linux的损耗 kvm虚拟化cpu_kvm虚拟化linux的损耗

 



处理器虚拟化的本质是分时共享。实现虚拟化需要两个必要条件,第一是能够读取和恢复处理器的当前状态,第二是有某种机制防止虚拟机对系统全局状态进行修改。  

第一个必要条件没有必要一定由硬件来实现,虽然硬件实现可能比软件实现更为简单。例如,x86处理器对多任务,也就是应用编程接口虚拟化,提供了硬件的支持,软件通常只需要执行一条指令,就可以实现任务切换,处理器硬件负责保存当前应用编程接口的状态,并为目标任务恢复应用编程接口的状态。但操作系统并不一定要使用处理器提供的这种虚拟化机制,完全可以使用软件来完成应用接口状态的切换。例如,Linux就没有使用x86处理器提提供多任务机制,完全依赖软件实现任务切换。

第二个必要条件一定要由硬件来实现,通常处理器采用多模式操作(multi-mode operation)来确保这一点。在传统x86处理器上,共有4种模式的操作,也就是常说的4个特权级。虚拟机(这里指进程/线程)通常运行在特权级3上,而虚拟机监控器(这里指操作系统)运行于特权级0上,进程/线程的所有访问全局的操作,如访问共享的操作系统所在的地址空间,访问I/O等等,均会导致异常的发生,被操作系统所截获并处理,使操作系统有机会向进程/线程提供一个虚拟的世界

 

传统x86有四个特权级,但许多特权指令要运行在特权级0上,因此对于虚拟机监控器,由于操作系统占用了特权级0,则没有相应的特权级进行分配。所以有许多基于x86的虚拟化技术采用方法将操作系统运行于特权级1上,VMM运行在0上,但通常会带来一些虚拟化安全漏洞问题。  

 

Intel提出了VT-x技术来解决系统虚拟化问题,其主要思路是增加一个新的比0还高的特权级,通常称之为特权级-1,并在硬件上支持系统编程接口状态的保存和恢复。采用VT-x技术。可以从硬件上解决x86虚拟化安全漏洞




kvm虚拟化linux的损耗 kvm虚拟化cpu_虚拟化_02

 

客户真正的访存是通过影子页表进行的,如果影子页表中存在客户线性地址到物理地址的映射,那么访存操作就正常进行了。如果影子页表中

不存在客户线性地址到物理地址的映射,那么将引发一次页故障,从而导致一次VM exit。VMM获得控制后,将首先根据引发异常的客户线性地址去查找客户页表,如果客户页表本身限制这次访问,如到物理地址的映射不存在、违反页级保护规则等,VMM将把异常事件回注给客户,由客户操作系统处理该页故障。 如果客户页表允许本次访问,那么通常本次页故障是由于影子页表中不存在客户线性地址到物理地址的映射引起的,此时就需要根据客户页表的内容来构建相应的影子页表,或称为对客户页表进行影射(Shadowing)。

VMM和Guest OS共享底层的处理器资源,因此硬件需要一个物理内存区域来自动保存或恢复批次执行的上下文,这个区域称为虚拟机控制块(VMCS)

VMCS是由于Intel VT_x引起的,它主要被CPU进行操作,然后保存VCPU相关寄存器信息和内容,即一个物理CPU通过VMCS能够获得每个虚拟CPU的各种信息

在虚拟机中,完成从客户机虚拟机地址到宿主机物理地址的转换可以用影子页表的形式来实现,但该种方式采用软件的方法实现,实现逻辑复杂,编写和调试难度大。故Intel推出了EPT模式,AMD对应的为NPT模式,简而言之EPT就是由处理器来实现客户机物理地址到宿主机物理地址的转换过程。

Libvirt是一套开源的,用于和虚拟化Hypervisor交互的API

写时复制:当进程去修改多个进程的共享内存时,内核会分配一块新的内存区域,并将试图修改的共享内存区域复制到新的内存区域,让进程去修改复制的内存

内核同页合并(KSM):将多个进程相同的进程页进行合并,KSM让内核对其进行标记。若有进程去修改该标志的内存页,内核就为进程复制一个新的内存页供其使用。