记得我刚上研究生的时候,在阅读外文资料时总是分不清楚“Simulation”和“Emulation”的区别。于是我就去问导师,导师解释的也很简单:“Simulation就是模拟,Emulation就是仿真嘛!”其实很多人一开始研究模拟器时也会遇到同样的问题,面对文献中大量的“Simulation”和“Emulation”不知所措,结果就越看越糊涂。当时上网又不方便,不像现在“Google”一下就搞定了,自己对这个问题的理解基本上是无师自通的,所幸的是理解并没有错,后来论文落到某位专家的手中也没有对这个问题对我提出异议。
做模拟器首先就要搞清楚“Simulation”、“Emulation”、模拟和仿真这四者的区别和关系,下面我谈谈我个人的理解。
Simulation,是指用软件去模拟某个系统的功能,并不要求实现该系统的内部细节,只要在同样的输入下,软件的输出和所模拟系统的输出一致就可以了。比如你在PC机上用一个软件去simulate红白机的游戏“超级玛莉”,你只要让你的软件运行出来的效果和红白机上“超级玛莉”游戏一样就可以,至于这个软件你是怎么实现则无关紧要。
Emulation,是指用软件去模拟出某个系统中各个部件的组成,真实地模拟出系统的运行机制。这就要求软件的作者需要非常了解所模拟系统的内部结构,能够利用各种数据结构实现出各个部件的模型。同样去emulate红白机的游戏“超级玛莉”,首先就要用软件模拟出红白机中的各种硬件,如CPU、内存、图形处理芯片、声音处理芯片以及游戏手柄等,再通过将加载游戏的ROM来运行该游戏。现在各种游戏模拟器,如MAME、VirtualNes都是采用emulation的手段去实现游戏的模拟,所以它们又叫做emulator。
模拟就是指用在某个平台上用纯软件的方法去模拟另一个平台上程序的运行,模拟包含“Simulation”和“Emulation”,通过上面对这两者的分析大家可以知道,“Simulation”是一种高层次上的模拟,类似于“黑盒”,而“Emulation”更注重于对底层的模拟,类似于“白盒”。
仿真的解释就比较多了,有的说仿真是指用机器底层的微指令来解释执行另一个平台的指令,有的说仿真是软件结合硬件来模拟另一种平台程序的运行,即“硬件仿真+软件模拟”。其实这两者是针对不同仿真对象和宿主平台而言的:前者具体的是讲系统仿真,是以大型机CPU(现在也可以指PC机)为仿真对象的,通常在研制CPU的过程中,用宿主机的CPU去仿真其软件的运行,这样可以使硬件和软件的研发过程同步,加快整体系统的研发进度;后者一般指嵌入式仿真,做过嵌入式开发的朋友都知道,开发过程中经常要用仿真器去调试程序,我们可以在PC机上调试嵌入式系统中的某个程序,通过仿真器向嵌入式微控制器发送调试信号(如JTAG),使微控制器执行某条指令,而PC机上会相应地显示出该条指令执行的结果,看上去似乎是PC在“执行”这条指令一样,这样来达到仿真的目的。但不管怎样,仿真总是与硬件相关的,这一点与模拟是有区别的。
现在还出现了“虚拟机”一词,在我看来,虚拟机更多地采用了模拟技术,而不是仿真,但是虚拟机相对于一个模拟器而言要复杂很多,像Bochs这样的虚拟机实质上应该是一个emulator,而像VirtualPC、VMWare和VirtualBox这样的虚拟机,则采用了更为复杂的技术,既有simulation,也有emulation,甚至还有系统仿真,所以不能单纯地将它认为是一个模拟器。
做模拟器首先就要搞清楚“Simulation”、“Emulation”、模拟和仿真这四者的区别和关系,下面我谈谈我个人的理解。
Simulation,是指用软件去模拟某个系统的功能,并不要求实现该系统的内部细节,只要在同样的输入下,软件的输出和所模拟系统的输出一致就可以了。比如你在PC机上用一个软件去simulate红白机的游戏“超级玛莉”,你只要让你的软件运行出来的效果和红白机上“超级玛莉”游戏一样就可以,至于这个软件你是怎么实现则无关紧要。
Emulation,是指用软件去模拟出某个系统中各个部件的组成,真实地模拟出系统的运行机制。这就要求软件的作者需要非常了解所模拟系统的内部结构,能够利用各种数据结构实现出各个部件的模型。同样去emulate红白机的游戏“超级玛莉”,首先就要用软件模拟出红白机中的各种硬件,如CPU、内存、图形处理芯片、声音处理芯片以及游戏手柄等,再通过将加载游戏的ROM来运行该游戏。现在各种游戏模拟器,如MAME、VirtualNes都是采用emulation的手段去实现游戏的模拟,所以它们又叫做emulator。
模拟就是指用在某个平台上用纯软件的方法去模拟另一个平台上程序的运行,模拟包含“Simulation”和“Emulation”,通过上面对这两者的分析大家可以知道,“Simulation”是一种高层次上的模拟,类似于“黑盒”,而“Emulation”更注重于对底层的模拟,类似于“白盒”。
仿真的解释就比较多了,有的说仿真是指用机器底层的微指令来解释执行另一个平台的指令,有的说仿真是软件结合硬件来模拟另一种平台程序的运行,即“硬件仿真+软件模拟”。其实这两者是针对不同仿真对象和宿主平台而言的:前者具体的是讲系统仿真,是以大型机CPU(现在也可以指PC机)为仿真对象的,通常在研制CPU的过程中,用宿主机的CPU去仿真其软件的运行,这样可以使硬件和软件的研发过程同步,加快整体系统的研发进度;后者一般指嵌入式仿真,做过嵌入式开发的朋友都知道,开发过程中经常要用仿真器去调试程序,我们可以在PC机上调试嵌入式系统中的某个程序,通过仿真器向嵌入式微控制器发送调试信号(如JTAG),使微控制器执行某条指令,而PC机上会相应地显示出该条指令执行的结果,看上去似乎是PC在“执行”这条指令一样,这样来达到仿真的目的。但不管怎样,仿真总是与硬件相关的,这一点与模拟是有区别的。
现在还出现了“虚拟机”一词,在我看来,虚拟机更多地采用了模拟技术,而不是仿真,但是虚拟机相对于一个模拟器而言要复杂很多,像Bochs这样的虚拟机实质上应该是一个emulator,而像VirtualPC、VMWare和VirtualBox这样的虚拟机,则采用了更为复杂的技术,既有simulation,也有emulation,甚至还有系统仿真,所以不能单纯地将它认为是一个模拟器。