你真的了解虚拟机吗?
管理计算机系统复杂性的关键是通过一些定义明确的接口把计算机系统划分成不同的抽象层次。抽象层次允许忽略或简化系统设计的底层实现细节,从而简化高层组件的设计。例如,真实的硬盘设备被划分成不同的磁道和扇区,但是经过系统的抽象之后我们看到的其实是一些文件的集合,我们在使用的过程中不用关心硬盘是如何运作的。
由此我们可以简单的将计算机系统抽象成两个层次,底层由物理硬件实现,上层由软件实现,在硬件层,所有的东西都是真实的物理硬件,他们之间通过接口连接在一起。在软件层,组件都是逻辑的,很少受到硬件的物理特性限制。
软件层是通过这些定义明确的接口管理硬件层的行为,这个定义明确的接口其实就是指令集,只要遵循这个指令集的规范,任何人都可以将编译好的软件在实现相同指令集的不同平台上运行。
但是定义明确的接口也有一定的局限性。为某个接口规范设计的子系统或者组件不能和那些为其他接口规范设计的子系统或者组件一起工作。有不同的指令集(如PowerPC、DPS等),也有不同的操作系统(如Windows、Linux、VxWorks等)。应用程序以二进制文件分发后,就与特定的指令集进行了绑定。这些问题对于开发和测试都造成了很大的困扰。
虚拟化就为这些问题提供了一些解决方案,我们将硬件层进行虚拟化,实现相应的接口,通过接口可见的资源都被映射到实现它的真实系统接口和资源上,将软件层运行在虚拟的硬件上,这样就能够解决一些兼容性问题和对硬件资源的限制 ,从而获得更大的灵活性与移植性,也可以利用仿真技术提供跨平台的软件兼容性,例如我们可以在x86指令平台上运行一个PowerPC指令集的应用。
虚拟机基础
从进程角度看,机器由操作系统与底层的用户级硬件组合而成,ABI提供了进程与机器之间的接口。
▲应用二进制接口(ABI)
从操作系统角度看,整个系统由底层机器支撑,一个系统是一个完整的运行环境,机器仅由底层硬件实现,指令集提供了系统和机器之间的接口。
▲指令集体系结构(ISA)接口
如同前面所说的那样,虚拟化的过程包含两个部分:(1)把虚拟资源或者状态,如寄存器、存储器、文件,映射成底层机器中的真实资源;
(2)使用真实机器上的指令和系统调用来执行虚拟机的指令和系统调用规定的活动,如对虚拟机ABI和ISA的仿真。
根据前面的分类相应的虚拟机也有进程级和系统级的虚拟机,进程虚拟机就是能够支持运行一个独立的进程,在进程虚拟机中,虚拟软件放在ABI接口处,操作系统和硬件结合部的上层,虚拟软件同时运行仿真用户级指令和操作系统调用。
▲进程虚拟机
与进程虚拟机不同,系统虚拟机提供的是一套完成的系统环境,这个环境可以支持操作系统及运行在其上的用户进程,操作系统可以访问底层的硬件资源。
▲系统虚拟机
进程虚拟机
进程虚拟机就是为用户的应用程序提供虚拟的ABI环境,根据实现的不同又有一些区分。
多道程序设计
它是由操作系统调用接口和用户指令集组合成的机器,运行在上面的每个进程都以为自己拥有的是全部的系统资源,每个进程都有自己的地址空间和对文件结构的访问,实际上现在大部分操作系统都是通过这个方法支持多的用户进程的。
仿真器和动态二进制翻译器
它其实就是在某个指令集的硬件上仿真另一个指令集。最简单的方式是解释,执行目标指令集的解释器程序取指、译码和仿真独立的源指令的执行。但是这个方式效率会很慢,由此提出了二进制翻译技术,就是将源指令块翻译成执行同样功能的目标指令,翻译好的指令被缓存起来,运行时可以重复执行,这个方式翻译时的开销比较高,但是翻译好之后,能够获得比解释执行更快的执行速度。
相同指令集下的二进制优化器
这个方式与上一种基本类似,包括分阶段的优化和对优化后的代码进行缓存,不同的是这个是在相同指令集的机器上执行不需要在翻译成其他指令集的目标码。
高级语言虚拟机
传统的系统中我们先将高级语言使用编译器前端编译成中间代码, 然后使用编译器后端编译成目标代码,这样就可以将目标代码分发到支持的指令集架构机器上运行起来。高级语言虚拟机编译步骤类似,但是它会在更高的层次上分发代码,将代码编译成可移植的代码后就进行分发,这个可移植代码其实就是虚拟机的机器代码,只要在不同平台上实现能够执行虚拟ISA机器代码的虚拟机就可以了。
系统虚拟机
系统虚拟机会提供一套完整的系统环境,在这个环境里多用户的多进程是可以共存的。
传统系统虚拟机
它典型的方法是将VMM直接安装在裸机上,上面再装上虚拟机,VMM在最高特权模式下运行,而客户机系统运行时的特权要少一些。在此前提下,VMM以一种完全透明的方式,拦截并执行所有客户机操作系统发出的与硬件资源交互的动作。另一种系统的VMM实现方法是在现有的主机操作系统上构造虚拟软件,构成一台所谓的宿主虚拟机(hosted VM)。现在的VMware就是这种实现方式。
全系统虚拟机-仿真
上一种虚拟机是建立在相同指令集架构上实现的,为了实现异构仿真,我们必须仿真整个硬件环境,仿真处理器的所有指令,将目标指令操作转化为主机操作系统上的等价操作,模仿目标代码在目标系统中的各种行为。
协同设计虚拟机:硬件优化
设计这种虚拟机的目的是为了能够创建新的指令集,以及改善硬件实现的性能和功耗或者在现有指令集的基础上进行增删。
全数字实时仿真软件SkyEye
由我司自主研发的SkyEye属于系统虚拟机的仿真方式,能够在通用的x86平台中快速构建一个虚拟的目标系统运行各种架构的嵌入式软件如:PowerPC、DSP、ARM等。利用SkyEye可以在不具备目标硬件的情况下,并且不需要修改源代码,就可以进行嵌入式软件的开发和测试。
经过十多年的迭代开发,SkyEye能够仿真市面上绝大部分的嵌入式处理器,构建了成百上千种外设设备,同时对于国产嵌入式处理器也有部分支持,如:飞腾、龙芯等,能够极大满足客户的仿真需求。
SkyEye全数字实时仿真软件能够很好的解决目前软件开发和验证带来的在软件仿真、功能测试、性能分析、代码调试、代码覆盖率几方面带来的技术挑战。能够为软件开发和验证提供一个功能强大、高效、易用的平台,从而有效的提高软件开发和验证的质量和效率。
参考文献:
[1] James E. Smith,Ravi Nair著;安虹,张昱,吴俊敏译 虚拟机系统与进程的通用平台[M] 北京:机械工业出版社,2009.3