ARMv7中 KVM对虚拟化的实现(上篇)

本文介绍了KVM/ARM,首个在ARM架构上运行未修改操作系统的虚拟化系统,利用ARM硬件虚拟化扩展,实现接近原生执行效率的虚拟机性能。通过分裂模式虚拟化设计,KVM/ARM集成于Linux内核,简化开发与维护,实测显示其在性能和功耗上优于X86虚拟化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文为译文,原文链接如下:http://systems.cs.columbia.edu/files/wpid-asplos2014-kvm.pdf

摘要

ARM架构的CPU在移动设备和服务器中使用得越来越普遍,为基于ARM架构的设备提供虚拟化的新需求也越来越大。我们介绍了构建Linux ARM hypervisor KVM/ARM的经验,这是第一个完整的ARM虚拟化系统解决方案,可以在ARM多核硬件上运行未经修改的guest操作系统。KVM/ARM引入了分裂模式虚拟化,运行hypervisor跨CPU模式分割执行,并将其集成到Linux内核中。这样运行KVM/ARM利用现有的Linux硬件支持和功能来简化虚拟化的开发和维护,同时利用ARM硬件虚拟化的扩展来运行性能与本机执行效率相当的虚拟机。KVM/ARM已经成功合并到Linux内核中,确保该方案得到广泛的使用。我们对在一个真实ARM硬件虚拟化支持的完整hypervisor的性能进行了测量,结果表明,与X86的多核硬件Linux虚拟化相比,KVM/ARM在性能和功耗方面都具有优势。

 

1. 介绍

基于ARM架构的设备在智能手机、上网本和嵌入式计算机领域都出现了巨大的增长。虽然ARM的CPU在这些领域的发展受益于其在功耗方面的优势,但ARM的CPU在性能方面也在不断提高。这就促进了新的基于ARM架构的微服务器芯片和CPU进入到传统的服务器、PC和网络系统中。

为了给基于ARM的设备提供更好的虚拟化支持,ARM架构提供了对虚拟化的硬件支持。尽管虚拟化通常用于X86的系统,但是ARM和X86虚拟化之间是由一些关键的区别的。第一,ARM和X86虚拟化扩展有重要的区别,比如X86 hypervisor的设计不能直接适用于ARM,这些差异会影响hypervisor的性能和设计,特别是对于多核系统,但是这点尚未在真实的硬件设备上进行评估。第二,与基于X86的系统不同,ARM并没有PC硬件标准。ARM市场的碎片化很严重,有许多不同的垂直集成的ARM平台,他都是非标准的硬件。在没有任何实际硬件标准的情况下,以一种能够跨ARM硬件多样性工作的方式虚拟化ARM是一个关键的挑战。

我们介绍了在主线Linux内核中构建ARM hypervisor (KVM/ARM[13,23])的经验。KVM/ARM是第一个利用ARM硬件虚拟化运行未经修改的guest操作系统的hypervisor。我们的工作主要由四个贡献。第一,我们引入了分裂模式虚拟化(split-mode virtualization),这是一种新的hypervisor的设计,它使系统能跨不同的特权CPU模式运行,从而利用每个CPU模式提供的特定优点和功能。这种方法为ARM虚拟化上下文提供了关键的益处。ARM为运行虚拟机监控程序引入了一种新的CPU模式,称为HYP模式,但是HYP模式具有与现有内核模式不同的独立特性。HYP模式的目标是在操作系统内核下运行一个独立的hypervisor程序,在hypervisor被集成到主内核的情况下,该种设计不能很好的与主hypervisor一起工作。例如,其需要对Linux的标准操作系统机制进行重大的重新设计,以便其在HYP模式下运行。split-mode的虚拟化方式可利用托管hypervisor设计的优点,即在正常的特权CPU模式下运行未经修改的操作系统机制,同时十四用HYP模式来运行ARM硬件虚拟化的特性程序。第二,我们从头开始设计并实现KVM/ARM机制,它是一个开源项目,易于维护并集成到Linux内核中,这一点对于ARM系统尤为重要,因为其缺乏集成硬件组件的标准方法、硬件探测的特性(如标准BIOS或PCI总线),以及安装低级软件的标准机制。将hypervisor移植到一个独立的硬件平台,并对其进行可开发和维护将是一个巨大的挑战。但是,几乎所有ARM平台都支持Linux,通过将KVM/ARM与Linux内核进行集成,KVM/ARM可自动地跟随LInux内核版本进行更新。通过使用分列式的虚拟化方案,我们可以利用LInux中现有的基于内核的虚拟机(KVM)hypervisor接口,并可重用大量现有内核代码和接口,以降低该方案的实现复杂度。KVM/ARM需要向Linux内核添加不到6000行的ARM代码,这比hypervisor的代码量要小得多。KVM/ARM作为Linux 3.9内核的主要ARM hypervisor,这确保了其能被广泛使用,因为Linux在ARM平台上占据了主导地位。基于我们的开源经验,我们提供了一些有用的提水,可将研究思想转换为开源社区可能采用的实现。第三,我们证明了KVM/ARM在实际多核ARM硬件上的有效性,我们的结果是使用在真实硬件ARM虚拟化支持的hypervisor进行测量的。我们将其与标准的KVM x86架构的hypervisor进行对比,并评估虚拟机中运行的应用程序的工作负载与本机非虚拟化执行的性能开销,结果表明,在大多的情况下,KVM/ARM实现了类似的性能开销,并且显著降低了Apache和MySQL两个重要应用程序的性能开销。这些结果首次比较了ARM和X86在实际硬件上的虚拟化扩展,定量地展示了不同的设计选择如何影响虚拟化的性能。测量结果表明KVM/ARM也KVM/x86具有更低的功耗。最后,我们根据构建和评估一个完整的ARM hypervisor的经验,就虚拟化的未来硬件支持提出了一些建议。我们确认了一些特性,其将对降低hypervisor实现的软件复杂性至关重要,并讨论了一些有益的机制,使其能最大化hypervisor性能,特别是在多核系统的上下文方面。

本文将介绍KVM/ARM的设计和实现。第二章概述了ARM虚拟化的扩展,并与X86进行比较。第三章将描述KVM/ARM hypervisor的设计。第四章将讨论KVM/ARM的实现以及将其发布到Linux社区并将其合入到LInux主分支的经验。第五章给出了KVM/ARM定量的性能和能耗测试结果,以及真实ARM硬件和X86硬件虚拟化的定量比较。第六章给出了对未来赢家虚拟化支持的建议。第七章讨论了相关工作,最后给出结束语。

 

2. ARM虚拟化扩展

因为ARM架构不是一个可虚拟化的经典架构,ARM在最新的ARMv7和ARMv8体系架构中引入了可支持虚拟化的扩展选项。例如,Cortex-A15就是支持硬件虚拟化的ARMv7的CPU。我们将简要介绍ARM虚拟化扩展。

CPU虚拟化:图一展示了在ARMv7架构中CPU的各种模式,包括TrustZone和一个新CPU模式,叫作HYP模式。TrustZone将模式分为两种状态,安全态和非安全态。一个特殊的monitor模式提供了两种状态之间的切换

 

尽管ARM架构的CPU总是在安全态启动,但是ARM的bootloader程序通常会在早期就会将CPU切换到非安全态。安全态只用于特定的用例,例如数字版权管理。通过在安全态下运行虚拟机监控程序TrustZone可能对虚拟化很有用,但这样并不合适,因为其不支持trap和模拟。并不存在将非安全态中执行的操作trap到安全安全态的方法。而在非安全态下则可以自由配置,例如虚拟内存。热河运行在最高非安全态的软件都可以访问所有非安全物理内存,从而不可能隔离在飞蛾诶安全环境中运行的多个虚拟机。HYP模式被作为trap和模拟需求被引入,用于在非安全态下支持虚拟化。与其他CPU模式、用户模式和内核模式相比,HYP模式具有更高的特权。在HYP模式下运行的软件可通过配置,使系统能够在触发了敏感指令或硬件中断的情况下从内核模式陷入到HYP模式。为了运行虚拟机,hypervisor程序必须至少有一部分时常驻在HYP模式中。虚拟机将以用户和内核模式正常运行,直到其达到陷入HYP模式的条件为止。此时,CPU将陷入HYP模式,将控制权限交给hypervisor,其可管理硬件资源,并为所有的虚拟机提供所需的隔离。一旦该触发条件被hypervisor处理完毕,CPU将会切换回用户态或内核态,这样虚拟机就可以继续执行。

ARM架构运行每个trap被配额制成直接切换到虚拟机的内核模式,而不是通过HYP模式来完成。例如:系统调用或用户模式的页错误引起的trap可被配置成直接陷入到虚拟机的内核模式,以便它们由guest操作系统处理,而无需hypervisor的参与。这也就避免了每次系统调用或者页错误时进入到HYP模式,减少虚拟化的开销。此外,所有进入HYP模式的trap都可以被禁用,一个非虚拟化的内核可在内核模式下运行,并完全控制系统。

ARM围绕HYP模式对虚拟化的支持进行了设计,HYP模式不同于现有的内核模式,因为其是设想在一个更复杂的rich OS下有一个独立的管理程序。他们希望简化hypervisor开发人员实现hypervisor的过程,因此与内核模式相比,HYP模式将具有更少的控制寄存器。类似地,其要求在页表条目中设置某些位,因为其不会与运行在用户模式的软件共享页表,例如LInux内核在内核模式中所做的事情。

 

内存虚拟化:ARM也提供了对虚拟物理内存的硬件支持。当运行一个虚拟机时,虚拟机管理的物理地址实际是中间物理地址(IPA),也被称作客户物理地址。其需要被转换成实际物理地址,即主机物理地址。类似于X86中的嵌套页表,ARM提供了第二组页表,即二级页表,其分别根据guest和host物理地址将IPA转换成PA。二级转换可以在HYP模式中被禁止或使能。二级页表使用ARM的新的LPAE页表格式,与内核模式使用的页表格式略有不同。

中断虚拟化:ARM定义了通用终端控制器(GIC)的架构。GIC将中断从设备转发到CPU上,CPU通过查询GIC来探测该中断的来源。GIC在多核配置中尤为重要,因为它用于生成处理器间中断(IPI)从一个CPU核到另一个CPU核。GIC分为分发服务器和CPU接口两部分。系统中只有一个分发服务器,但是每个CPU核都有一个CPU接口。CPU接口和分发服务器都是通过内存映射接口(MMIO)来进行访问的。分发服务器被用来配置GIC,例如,配置中断的CPU核与一个中断进行关联,禁止或者使能系统中的所有中断,发送IPI到另外一个CPU核。CPU接口用于确认(ACK)和发出中断接口信号(EOI)。例如当一个CPU核接收到一个中断时,它将读取GIC的CPU接口上的一个特殊寄存器,该寄存器将标记中断,并返回中断数量。在CPU将从ACK寄存器中读取到的值写入CPU接口的EOI寄存器之前,中断不会再次被转发到CPU中。

中断可被配置为使CPU核陷入HYP或者内核模式。将所有中断捕获到内核模式中,并让其被在内核模式下运行的操作系统软件直接处理是很高效的,但是其不能再虚拟机上下文中工作,因为hypervisor将事情对硬件的控制。将所有中断捕获到HYP模式可确保hypervisor保留控制权,但是需要在软件中模拟虚拟中断,以便向虚拟机发出事件信号。这种方式就很麻烦且开销很大,因为处理中断的每一步和虚拟中断的处理,例如ACK和EOI操作都必须通过hypervisor来完成。

GIC v2.0以虚拟化GCI(VGIC)的形式提供了中断硬件虚拟化的支持,因为不需要在hypervisor软件中进行模拟来接收虚拟中断。VGIC为每个CPU引入了VGIC CPU接口,并为每个CPU引入了相应的hypervisor控制接口。虚拟机被配置成查看VGIC CPU接口而再是GIC CPU接口。虚拟中断是通过向VGIC hypervisor控制接口中写入特殊寄存器(list registers)而生成的,VGIC CPU接口将虚拟中断直接引入到虚拟机的内核态中。因为VGIC CPU接口包含对ACK和EOI的支持,所以这些操作不再需要陷入到hypervisor来被模拟,从而减少了在CPU上接收中断的开销。例如,模拟虚拟设备通常通过软阿健API将虚拟中断引入到hypervisor,后者可以利用虚拟中断VGIC将模拟设备的虚拟中断号写入到列表寄存器(list register)中。这样可以让VGIC直接中断虚拟机的内核模式,并在不需要陷入HYP模式的情况下让guest操作系统ACK和EOI虚拟中断。注意,分发服务器仍然必须在软件中进行模拟,虚拟机对分发服务器的所有访问仍然必须捕获到hypervisor中。例如,当一个虚拟CPU发送了一个虚拟IPI到另外一个虚拟CPU,这就会导致陷入hypervisor,其将模拟软件中的分发服务器访问并对接收到的CPU的GIC hypervisor控制接口上的列表寄存器(list register)进行编程。

时钟虚拟化:ARM定义了通用计时器框架,其中包括对计时器虚拟化的支持。通用定时器提供了一个计数器,其可以用来测量系统运行的时间,定时器还可被编程,是其在到达一定的时间后会想CPU发出一个时钟中断。计时器可被hypervisor和guest操作系统使用,但是为了对计时器提供隔离并保留控制权,hypervisor使用的计时器不能直接被guest操作系统配置和操作。如果guest操作系统需要访问此类计时器,则需要让CPU陷入到HYP模式来实现,对于某些工作负载相对频繁的操作则会产生额外的开销。hypervisor也可能希望虚拟化虚拟机的时钟,因为让虚拟机直接访问计时器硬件将是是问题。

ARM通过引入一个新的计数器来实现虚拟化支持。可以将hypervisor配置为使用物理计时器,而将虚拟机配置成使用虚拟计时器。这样就可以使虚拟机在不陷入HYP模式的情况下访问、编程和取消虚拟计时器。从内核态访问物理计时器和计数器是由HYP模式控制的,但是在内核模式下运行的软件总是可以访问虚拟计时器和虚拟计数器。

与X86的比较:Intel和AMD对x86的虚拟化扩展与ARM对虚拟化的扩展以及硬件虚拟化的支持具有许多相似和不同之处。Intel和AMD的扩展是非常相似的,所以我们仅限比较ARM和Intel.。ARM通过一个独立的CPU模式(HYP模式)来实现对虚拟化的支持。其具有比用户模式和内核模式更高的权限。相比之下,Intel使用root和non-root模式来实现虚拟化。在ARM架构中,通过敏感指令和特殊操作让CPU核陷入HYP模式。这两种硬件架构设计的一个关键区别点在于,Intel的root模式支持与non-root模式相同的全部用户和内核模式的功能。而ARM的HYP模式则是一种完全不同的CPU模式,却具有自己的特性。

ARM和Intel都会陷入他们各自的HYP模式和root模式,但是Intel为虚拟控制模块提供了特定的硬件支持,当只使用一条指令切入或者切出root模式时,虚拟机控制块会自动保存和恢复。当guest和hypervisor之间进行切换时,该操作用于自动保存和恢复guesst状态。相比之下,ARM并不提供这样的硬件支持,任何状态的保存和恢复都需要在软件中显式地完成。这为从HYP模式中切入或者切出时保存和恢复状态提供了灵活性。例如,如果没有需要保存的额外状态,ARM陷入到HYP模式可能比Intel切换到root模式更快。

ARM和Intel在支持物理内存虚拟化方面非常类似。两者都引入了一组附加的页表,用于将IPA转换成主机物理地址。ARM受益于后见之明,在最初就将二级地址转换包含在内,而这一点在Intel第二代虚拟化硬件技术才实现。

ARM对虚拟计时器的支持并不是x86实现的翻版,直到最近引入了Intel的虚拟APIC的支持。ARM对虚拟中断的支持也并不是X86实现的翻版。在没有虚拟APIC支持的情况下,x86的虚拟机中的EOI终端需要在root模式下被捕获,而ARM对中断的虚拟化则避免了需要将CPU陷入HYP模式来完成,这一点将减少中断的开销。在x86上执行类似于计时器功能会使其陷入root模式,而在ARM中则无需陷入HYP模式。然而,在x86架构中,读取计数器并不是一个特权操作,即使计数器并不支持虚拟化,该操作也不会让CPU陷入到root模式。

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值