仿真器(emulator)和模拟器(simulator)是比较容易混淆的概念,这两个概念不仅针对计算机体系结构,在很多方面都有所应用,例如航空模拟器、街机仿真器等。
模拟器(simulator)是用于分析研究目标系统本身,模拟器系统本身要跟目标系统保持一致。例如飞行模拟器对于用户来讲其本身要跟真正的飞机一致;再比如gem5模拟器,其本身要跟CPU所有内部行为一致(包括内部运行原理都要一致)。好的模拟器本身也可以仿真其目标系统,但不是所有模拟器都有这个特性。
仿真器(emulator)的目的是作为目标系统的替代品,可以完全替代目标系统,完成其对外的功能,即仿真器系统只需要保证呈现给外部的行为跟目标系统一致(不需要保证内部运行原理一致)。例如想在电脑上玩小时候玩的街机游戏,就需要在电脑上安装一个街机仿真器(虽然很多人喜欢称其为“街机模拟器”)。使用仿真器的目的是模拟目标系统呈现出的运行环境,仿真器保证的是完成目标系统相同的行为,不在乎其内部实现原理,再例如EMU8086仿真器,可以在另一台非8086电脑上仿真8086微处理器的行为。即使再好的仿真器也不能作为模拟器用于研究目标系统内部运行原理。
针对gem5,其本身是一个CPU模拟器,但是因为其也能做到仿真器可以完成的工作(gem5运行于Atmoic模式), 尽管其运行速度相比真正CPU差很多,也可以认为其是一个类似于EMU8086的CPU仿真器。但是尽管gem5运行于乱序(Out Of Order, 简称O3)时,gem5可以被看做CPU模拟器,其内部模拟的CPU各个模块也不是完全一样,所以也可以任务,gem5是由仿真多个部件的仿真器构成的。总之,模拟器针对目标系统内部进行模拟(对目标系统软件行为的模拟),仿真器用于仿真目标系统对外的行为(对目标系统软件和硬件的方针,看起来的目标系统一样)。
首先,我们先看两者相同之处吧。Simulator和Emulator两者都可以在灵活的软件定义网络的环境中执行软件测试。而且这种方式比在真机中测试更快速更简单。真机测试往往在软件发布以用于生产力之前。
它们具体工作方式不同。
Simulator用于创建包含了应用程序真实生产环境中的变量和配置的模拟环境。但是Simulator不会尝试仿真生产环境中真实的硬件,因为Simulator只是创建软件环境,这种环境可以通过高级编程语言实现。
而Emulator会尝试模拟生产环境种所有的硬件功能和软件功能。通常你需要使用汇编语言来编写emulator来实现这个目的。
从某种程度来说,你可以认为Emulator是Simualtor和真机之间的一层。Simulator只是模拟了可以用软件定义或配置的功能环境,而Emulator模拟了软硬件功能。当然因为Emulator可能模拟生产环境中软硬件环境不到位,所以它们不是真机环境的替代品哦。
通常,Simulator最好用于软件测试场景中,这时你只需要关注程序与外部程序或环境交互时的执行结果是否和预期一致即可。例如,你想测试一款应用程序是否可以向其它应用程序发送数据,此时,Simulator足够了,因为底层硬件配置不太可能会影响数据传送。
在你需要测试软件如何与底层硬件交互或者需要软硬件结合环境时,Emulator将会更合适。例如,你想知道固件(firmware)更新,对你的应用程序时候会造成影响,你就可以使用Emulator了。再者,你想知道在不同的CPU种类或者不同内存分配下,你的应用程序的表现如何,都可以使用Emulator。
总结就是:Simulator提供了快速简单的方式设置软件环境以测试应用程序,而不关心硬件。Emulator既模拟软件,也模拟硬件。两者都很有用,但是都不足以代替真机环境。
Simulator | Emulator |
---|---|
一定程度上模拟其它系统 | 精确模仿其它系统 |
不一定遵循所有的被模拟系统的规则 | 严格遵循被模拟系统的参数和规则 |
应用程序和事件的模型 | 就是其它系统的拷贝 |
参考
[1] Simulators vs. Emulators: What’s the Difference, Anyway?
[2] Difference between Simulator and Emulator
[3] Difference Between Emulator and Simulator