[OS] 仿真

仿真技术

许多虚拟机都是基于仿真来实现的。
所谓仿真就是在一个具有某种接口和功能的系统或子系统上,实现另一种与之具有不同的接口和功能的系统或子系统的过程。
例如,一个运行在PC窗口里的VT100终端仿真器,向它的使用者展现了一个几乎与真实的VT100终端一样的接口和功能。

实际上,一般可以认为虚拟化本身就是一种简单形式的仿真。
但在这里,我们给出的仿真是狭义上的,是特定的将它应用于指令集的。

指令集仿真

指令集仿真是许多虚拟机实现的一个主要方面,其原因在于虚拟机必须支持为一种指令集编译的程序二进制代码,
而这种指令集与主机处理器实现的指令集有所不同。

例如,由于Intel的IA-32程序二进制代码比任何其他指令集的二进制代码使用的都要广泛,
因此,用户希望使用虚拟机在某一其他平台上执行IA-32程序二进制代码,
例如,Apple公司的Macintosh,它采用PowerPC处理器。

对于高级语言虚拟机,二进制类(使用Java术语)采用了一个基于栈的,字节码指令集,
它可以在许多不同的主机平台上被仿真。

在指令集方面,仿真允许实现一个软件,该软件将一种指令集编译到另一种指令集。
被仿真的指令集称为源指令集,用于仿真的指令集称为目标指令集

对于许多虚拟机应用,有效的进行指令集的仿真是十分重要的。
仿真的开销越低,虚拟机将越有吸引力。

一个完整的ISA由许多部分组成,包括寄存器集和存储器结构,指令,陷阱,和中断结构。
虚拟机的实现通常涉及ISA仿真的各个方面。

在某种程度上,指令仿真技术可以被应用于几乎每种类型的虚拟机,
虽然我们主要对源指令集和目标指令集不同的情形感兴趣,但是仍有许多指令集相同的虚拟机应用。
在这些情况下,严格的说,可以不进行仿真,但是出于其他目的而使用了这种技术。

一种应用就是相同ISA的动态二进制优化,其中程序二进制代码在运行时被优化,
起运行平台与原先编译时的一样。

另一个例子是系统虚拟机,它通过VMM来控制和管理某些客户机操作系统的特权指令的执行,
为了达到这一目的,采取了与仿真类似的技术。

仿真方法

指令集仿真可以使用多种方法来实现,这需要不同数量的计算资源,
并且提供不同的性能和可移植特性。

其中的一个极端就是直接的解释技术,而另一个极端就是二进制翻译

解释包括取一条源指令,对其进行分析,执行需要的操作,
再取下一条源指令这样一个循环的过程,
所有工作都是由软件完成的。

另一方面,二进制翻译试图分摊取指和分析的代价,它将源指令块翻译为目标指令块,
并且将翻译后的代码保存起来以便反复使用。

与解释相对比,二进制翻译有较大的初始翻译代价,但是执行代价较小。
两者之间选择哪一个取决于客户机软件期望执行源代码块的时间。

可以预见,在这两个极端之间仍有其他的技术,
例如,线索化解释消除了与前面提到的循环相对应的解释器循环,
并且可以通过将源指令预译码为更加高效的可解释的中间形式来进一步提高效率。


参考

虚拟机 : 系统与进程的通用平台

你可能感兴趣的:([OS] 仿真)