仿真器(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是由仿真多个部件的仿真器构成的。总之,模拟器针对目标系统内部进行模拟,仿真器用于仿真目标系统对外的行为。