KVM虚拟化技术中如何进行Hypervisor的实现
更新:HHH   时间:2023-1-7


KVM虚拟化技术中如何进行Hypervisor的实现,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

KVM 虚拟化技术之Hypervisor的实现

VMM(VirtualMachineMonitor)对物理资源的虚拟可以划分为三个部分:

CPU虚拟化、内存虚拟化和I/O设备虚拟化,其中以CPU的虚拟化最为关键。经典的虚拟化方法:现代计算机体系结构一般至少有两个特权级(即用户态和核心态,x86有四个特权级Ring0~Ring3)用来分隔系统软件和应用软件。那些只能在处理器的最高特权级(内核态)执行的指令称之为特权指令,一般可读写系统关键资源的指令(即敏感指令)决大多数都是特权指令(X86存在若干敏感指令是非特权指令的情况)。如果执行特权指令时处理器的状态不在内核态,通常会引发一个异常而交由系统软件来处理这个非法访问(陷入)。经典的虚拟化方法就是使用“特权解除”和“陷入-模拟”的方式,即将GuestOS运行在非特权级,而将VMM运行于最高特权级(完全控制系统资源)。解除了GuestOS的特权级后,GuestOS的大部分指令仍可以在硬件上直接运行,只有执行到特权指令时,才会陷入到VMM模拟执行(陷入-模拟)。“陷入-模拟”的本质是保证可能影响VMM正确运行的指令由VMM模拟执行,大部分的非敏感指令还是照常运行。

因为X86指令集中有若干条指令是需要被VMM捕获的敏感指令,但是却不是特权指令(称为临界指令),因此“特权解除”并不能导致他们发生陷入模拟,执行它们不会发生自动的“陷入”而被VMM捕获,从而阻碍了指令的虚拟化,这也称之为X86的虚拟化漏洞。

X86架构虚拟化的实现方式可分为:

1、X86“全虚拟化”(指所抽象的VM具有完全的物理机特性,OS在其上运行不需要任何修改)Full派秉承无需修改直接运行的理念,对“运行时监测,捕捉后模拟”的过程进行优化。该派内部之实现又有些差别,其中以VMWare为代表的基于二进制翻译(BT)的全虚拟化为代表,其主要思想是在执行时将VM上执行的GuestOS指令,翻译成x86指令集的一个子集,其中的敏感指令被替换成陷入指令。翻译过程与指令执行交叉进行,不含敏感指令的用户态程序可以不经翻译直接执行。

2、X86“半虚拟化”(指需OS协助的虚拟化,在其上运行的OS需要修改)半虚拟化的基本思想是通过修改GuestOS的代码,将含有敏感指令的操作,替换为对VMM的超调用Hypercall,类似OS的系统调用,将控制权转移到VMM,该技术因VMM项目而广为人知。该技术的优势在于VM的性能能接近于物理机,缺点在于需要修改GuestOS(如:Windows不支持修改)及增加的维护成本,关键修改GuestOS会导致操作系统对特定hypervisor的依赖性,因此很多虚拟化厂商基于VMM开发的虚拟化产品部分已经放弃了Linux半虚拟化,而专注基于硬件辅助的全虚拟化开发,来支持未经修改的操作系统。

3、X86“硬件辅助虚拟化”:其基本思想就是引入新的处理器运行模式和新的指令,使得VMM和GuestOS运行于不同的模式下,GuestOS运行于受控模式,原来的一些敏感指令在受控模式下全部会陷入VMM,这样就解决了部分非特权的敏感指令的“陷入-模拟”难题,而且模式切换时上下文的保存恢复由硬件来完成,这样就大大提高了“陷入-模拟”时上下文切换的效率。

以IntelVT-x硬件辅助虚拟化技术为例,该技术增加了在虚拟状态下的两种处理器工作模式:根(Root)操作模式和非根(Non-root)操作模式。VMM运作在Root操作模式下,而GuestOS运行在Non-root操作模式下。这两个操作模式分别拥有自己的特权级环,VMM和虚拟机的GuestOS分别运行在这两个操作模式的0环。这样,既能使VMM运行在0环,也能使GuestOS运行在0环,避免了修改GuestOS。Root操作模式和Non-root操作模式的切换是通过新增的CPU指令(如:VMXON,VMXOFF)来完成。

硬件辅助虚拟化技术消除了操作系统的ring转换问题,降低了虚拟化门槛,支持任何操作系统的虚拟化而无须修改OS内核,得到了虚拟化软件厂商的支持。硬件辅助虚拟化技术已经逐渐消除软件虚拟化技术之间的差别,并成为未来的发展趋势。

²  vCPU机制

vCPU调度机制

对虚拟机来说,不直接感知物理CPU,虚拟机的计算单元通过vCPU对象来呈现。虚拟机只看到VMM呈现给它的vCPU。在VMM中,每个vCPU对应一个VMCS(Virtual-MachineControlStructure)结构,当vcpu被从物理CPU上切换下来的时候,其运行上下文会被保存在其对应的VMCS结构中当vcpu被切换到pcpu上运行时,其运行上下文会从对应的VMCS结构中导入到物理CPU上。通过这种方式,实现各vCPU之间的独立运行。从虚拟机系统的结构与功能划分可以看出,客户操作系统与虚拟机监视器

共同构成了虚拟机系统的两级调度框架,如图所示是一个多核环境下虚拟机系统的两级调度框架。客户操作系统负责第2级调度,即线程或进程在vCPU上的调度(将核心线程映射到相应的虚拟CPU上)。虚拟机监视器负责第1级调度,即vCPU在物理处理单元上的调度。两级调度的调度策略和机制不存在依赖关系。vCPU调度器负责物理处理器资源在各个虚拟机之间的分配与调度,本质上即把各个虚拟机中的vCPU按照一定的策略和机制调度在物理处理单元上可以采用任意的策略来分配物理资源,满足虚拟机的不同需求。vCPU可以调度在一个或多个物理处理单元执行(分时复用或空间复用物理处理单元),也可以与物理处理单元建立一对一固定的映射关系(限制访问指定的物理处理单元)。

²  内存虚拟化

内存虚拟化三层模型

因为VMM(VirtualMachineMonitor)掌控所有系统资源,因此VMM握有整个内存资源,其负责页式内存管理,维护虚拟地址到机器地址的映射关系。因GuestOS本身亦有页式内存管理机制,则有VMM的整个系统就比正常系统多了一层映射:

A.虚拟地址(VA),指GuestOS提供给其应用程序使用的线性地址空间;B.物理地址(PA),经VMM抽象的、虚拟机看到的伪物理地址;

C.机器地址(MA),真实的机器地址,即地址总线上出现的地址信号;映射关系如下:GuestOS:PA=f(VA)、VMM:MA=g(PA)VMM维护一

套页表,负责PA到MA的映射。GuestOS维护一套页表,负责VA到PA的映射。实际运行时,用户程序访问VA1,经GuestOS的页表转换得到PA1,再由VMM介入,使用VMM的页表将PA1转换为MA1。

²  页表虚拟化技术

普通MMU只能完成一次虚拟地址到物理地址的映射,在虚拟机环境下,经过MMU转换所得到的“物理地址”并不是真正的机器地址。若需得到真正的机器地址,必须由VMM介入,再经过一次映射才能得到总线上使用的机器地址。如果虚拟机的每个内存访问都需要VMM介入,并由软件模拟地址转换的效率是很低下的,几乎不具有实际可用性,为实现虚拟地址到机器地址的高效转换,现普遍采用的思想是:由VMM根据映射f和g生成复合的映射fg,并直接将这个映射关系写入MMU。当前采用的页表虚拟化方法主要是MMU类虚拟化(MMUParavirtualization)和影子页表,后者已被内存的硬件辅助虚拟化技术所替代。

1、MMUParavirtualization

其基本原理是:当GuestOS创建一个新的页表时,会从它所维护的空闲内存中分配一个页面,并向VMM注册该页面,VMM会剥夺GuestOS对该页表的写权限,之后GuestOS对该页表的写操作都会陷入到VMM加以验证和转换。VMM会检查页表中的每一项,确保他们只映射了属于该虚拟机的机器页面,而且不得包含对页表页面的可写映射。后VMM会根据自己所维护的映射关系,将页表项中的物理地址替换为相应的机器地址,最后再把修改过的页表载入MMU。如此,MMU就可以根据修改过页表直接完成虚拟地址到机器地址的转换。

2、内存硬件辅助虚拟化

内存硬件辅助虚拟化技术原理图

内存的硬件辅助虚拟化技术是用于替代虚拟化技术中软件实现的“影子页表”的一种硬件辅助虚拟化技术,其基本原理是:GVA(客户操作系统的虚拟地址)->GPA(客户操作系统的物理地址)->HPA(宿主操作系统的物理地址)两次地址转换都由CPU硬件自动完成(软件实现内存开销大、性能差)。以VT-x技术的页表扩充技术ExtendedPageTable(EPT)为例,首先VMM预先把客户机物理地址转换到机器地址的EPT页表设置到CPU中;其次客户机修改客户机页表无需VMM干预;最后,地址转换时,CPU自动查找两张页表完成客户机虚拟地址到机器地址的转换。使用内存的硬件辅助虚拟化技术,客户机运行过程中无需VMM干预,去除了大量软件开销,内存访问性能接近物理机。

I/O设备虚拟化

VMM通过I/O虚拟化来复用有限的外设资源,其通过截获GuestOS对I/O设备的访问请求,然后通过软件模拟真实的硬件,目前I/O设备的虚拟化方式主要有三种:设备接口完全模拟、前端/后端模拟、直接划分。

1、设备接口完全模拟:

即软件精确模拟与物理设备完全一样的接口,GuestOS驱动无须修改就能驱动这个虚拟设备。

优点:没有额外的硬件开销,可重用现有驱动程序;

缺点:为完成一次操作要涉及到多个寄存器的操作,使得VMM要截获每个寄存器访问并进行相应的模拟,这就导致多次上下文切换;由于是软件模拟,性能较低。

2、前端/后端模拟:

VMM提供一个简化的驱动程序(后端,Back-End),GuestOS中的驱动程序为前端(Front-End,FE),前端驱动将来自其他模块的请求通过与GuestOS间的特殊通信机制直接发送给GuestOS的后端驱动,后端驱动在处理完请求后再发回通知给前端,VMM即采用该方法。

优点:基于事务的通信机制,能在很大程度上减少上下文切换开销,没有额外的硬件开销;

缺点:需要GuestOS实现前端驱动,后端驱动可能成为瓶颈。

3、直接划分:

即直接将物理设备分配给某个GuestOS,由GuestOS直接访问I/O设备(不经VMM),目前与此相关的技术有IOMMU(IntelVT-d,PCI-SIG之SR-IOV等),旨在建立高效的I/O虚拟化直通道。

优点:可重用已有驱动,直接访问减少了虚拟化开销;

缺点:需要购买较多额外的硬件。

关于KVM虚拟化技术中如何进行Hypervisor的实现问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注天达云行业资讯频道了解更多相关知识。

返回云计算教程...