虚拟化介绍

讨论的是计算机领域的虚拟化,我们这样定义虚拟化「虚拟化是将单一物理设备模拟为相互隔离的多个虚拟设备,同时保证这些虚拟设备的高效性」。这个概念的定义里还包含了对虚拟化的要求,也就是这里的隔离性(isolated)和有效性(efficient)。我们常说的hypervisor,有些书也把它称为VMM(virtual machine monitor)则是一个直接运行在物理硬体上的软体,它的功能就是管理物理硬体,以便在不同的虚拟机之间共享这些物理资源(cpu,内存,外设等等),既然hypervisor直接给物理外设打交道,那它当然需要运行在特权模式了,在过去没有virtualization extesion的情况下,guest os和guest application只能都运行在de-privileged模式。

虚拟化的种类

Type-0 Hardware virtualization 硬体虚拟化

最复杂的虚拟化实现技术。可以在宿主系统上创建一个硬体VM 来模拟所想要的硬体。每条指令都必须在底层硬体上进行模拟,因此速度会减慢100 倍甚至1000 倍。但优点是可以在一个ARM 处理器主机上运行为模拟系统 设计的操作系统,而不需要任何修改。 主要应用在硬体开发。

完全虚拟化

Pure virtualization(完全虚拟化):完全虚拟化要求硬体架构是可虚拟化的(符合经典可虚拟化模型),当trap进入hypervisor后,由hypervisor去模拟敏感指令的执行,这项技术也被称为trap-and-emulate。当一个guest os想要去访问特权资源(物理外设),就会产生一个trap唤醒hypervisor,hypervisor去模拟这个访问,然后返回到guest os的下一条指令去继续执行。可以看出,每一条特权指令都需要很多条指令去模拟,对系统性能有些影响。

  • Type-1 hypervisors直接运行在硬体系统之上,控制和管理硬体系统和客户操作系统。
  • Type-2 hypervisors运行在一个传统的操作系统之上想计算机的一个程序

Type-1 hypervisors Type-2 hypervisors

Paravirtualization 半虚拟化

半虚拟化。是另外一种流行的虚拟化技术,它与完全虚拟化有一些类似。这种方法使用了一个hypervisor 来实现对底层硬体的共享访问,还将与虚拟化有关的代码集成到了操作系统本身中。这种方法不再需要重新编译或捕获特权指令,因为操作系统本身在虚拟化进程中会相互紧密协作 。半虚拟化技术需要为hypervisor 修改客户操作系统,这是它的一个缺点。但是半虚拟化提供了与未经虚拟化的系统相接近的性能,对系统性能和guest os都有影响。

ARM处理器模式和TrustZone

ARM v7包含8种处理器模式(在v8已经变成4种exception level了,从EL0到El3),其中包含1种非特权模式和7种特权模式:

  • 特权模式(privileged):FIQ、IRQ、supervisor、monitor、abort、undefined、system;
  • 非特权模式(de-privileged):user。

显然,除了应用程序运行在user模式以外,其他全部运行在特权模式。ARM的virtualization extension需要处理器支持TrustZone extension,我们来看一下TrustZone是什么。TrustZone将处理器的执行状态分为两个世界:

· secure world:用于运行可信软体;

· non-secure world:用于运行不可信软体。

这里的两个世界和处理器模式是重叠的,软体可以在任何模式、任何世界上运行。那么secure world和non-secure world的区别在哪呢?这里的secure又从何而来?是这样的,secure world有自己独有的内存和外设,这部分内容只有运行在secure world的软体可以访问,运行在non-secure world的软体是不可以访问的。这里引入了一个新的处理器模式,monitor mode,它运行在secure world,被用于做双系统(secure and non-secure world)之间的切换,如下图所示。

我们可以基于TrustZone去做虚拟化,因为它能够隔离内存、中断并且确保non-secure world的特权软体也不可能访问或者修改运行在secure world的软体的配置信息。然后这样做的缺陷是,在non-secure world只能运行一个guest os,在secure world运行一个hypervisor。Green Hill的INTEGRITY就是这样做的,感兴趣的读者可以去Google一下。

标准的ARM架构是不符合可虚拟化模型的,有很多敏感指令在非特权模式下执行却不会产生trap。比如CPS指令,这条指令的作用是改变处理器状态,当这条指令在用户态执行时不会产生trap,甚至没有任何效果,可以认为是简单的跳过。即使所有的敏感指令都会产生trap,在ARM架构上用上述的trap-and-emulate技术也是很困难的,因为ARM的敏感指令非常多,只要和特权资源交互的指令都是敏感指令,比如虚拟内存子系统,中断控制子系统和协处理器,用上述方式的话开销太大,对系统性能有很大冲击。比如,arm-v7架构不支持页表访问的虚拟化,那么就需要影子页表,每次访问guest pa都需要trap,同样地,中断控制器也需要被模拟,当中断很频繁的时候(timer tick),这种模拟的开销也是非常大的,为了克服这种种弊端,ARM推出了virtualization extension就是arm-V8。ARM-v8(当前只有A系列,即ARMv8-A)架构,是ARM公司为满足新需求而重新设计的一个架构,是近20年来,ARM架构变动最大的一次。它引入的Execution State、Exception Level、Security State等新特性,已经和我们对旧的ARM架构的认知,有很大差距了。

ARM虚拟化和Intel虚拟化技术的对比如下图所示。

目前市面上主流晶元的介绍

域控制器晶元功率基本都在十几瓦左右,CPU主要是ARM A53/A72、Intel、高通、Nvidia等自由行的CPU架构,这些GPU在主频和系统性能上各有千秋,但在GPU领域主要有IMR、TBR以及TBDR等三种主流架构,选IMR等CPU都比较烫,散热难处理,选TBR都需要对3D建模要优化,不然散热也比较麻烦,选TBDR对好像会好些。恩智浦i.mx系列、Nvidia Tegra的GPU都是使用 IMR架构,后来Nvidia的Maxwell和pascal将GPU的架构改为TBR架构,能力提升的同时功耗下降。高通820/855使用自己的GPU Adreno外加DSP,瑞萨Rcar-H3使用imagination PowerVR GX6650,GPU使用TBDR架构,Intel Apollo lake 和Nvidia使用自己研究的GPU,恩智浦的I.MX8使用 Vivante GC7000系列,CPU架构是IMR架构类型,下面是目前市面几款晶元的性能比较。


推荐阅读:
相关文章