模拟器是如何工作的?当我看到NES/SNES或C64模拟器时,我很震惊。

您是否必须通过解释特定的组装指令来模拟这些机器的处理器?还有什么?它们通常是如何设计的?

你能给那些对编写模拟器(特别是游戏系统)感兴趣的人一些建议吗?


当前回答

共享源设备模拟器包含PocketPC/智能手机模拟器的可构建源代码(需要Visual Studio,在Windows上运行)。我参与了二进制版本的V1和V2。

它解决了许多仿真问题: -从虚拟客户端到物理客户端再到虚拟主机的高效地址转换 - JIT编译客户代码 -模拟周边设备,如网络适配器、触摸屏和音频 - UI集成,主机键盘和鼠标 -保存/恢复状态,用于模拟从低功耗模式恢复

其他回答

模拟可能看起来令人生畏,但实际上比模拟容易得多。

任何处理器通常都有一个编写良好的描述状态、交互等的规范。

如果您根本不关心性能,那么您可以使用非常优雅的面向对象程序轻松地模拟大多数老式处理器。例如,X86处理器需要一些东西来维护寄存器的状态(简单),需要一些东西来维护内存的状态(简单),还需要一些东西来接收每个传入的命令并将其应用到机器的当前状态。如果您真的需要准确性,您还可以模拟内存转换、缓存等,但这是可行的。

In fact, many microchip and CPU manufacturers test programs against an emulator of the chip and then against the chip itself, which helps them find out if there are issues in the specifications of the chip, or in the actual implementation of the chip in hardware. For example, it is possible to write a chip specification that would result in deadlocks, and when a deadline occurs in the hardware it's important to see if it could be reproduced in the specification since that indicates a greater problem than something in the chip implementation.

当然,电子游戏的模拟器通常关心性能,所以它们不会使用简单的实现,它们还包括与主机系统的操作系统接口的代码,例如使用绘图和声音。

考虑到老式电子游戏(NES/SNES等)非常缓慢的性能,在现代系统上进行仿真相当容易。事实上,更令人惊讶的是,你可以下载一套SNES游戏或Atari 2600游戏,考虑到当这些系统流行时,免费访问每个卡带都是一个梦想。

添加@Cody Brocious提供的答案 在虚拟化环境中,您正在向虚拟机模拟一个新系统(CPU、I/O等),我们可以看到以下类别的模拟器。

解释:bochs是解释器的一个例子,它是一个x86 PC模拟器,它把来自客户系统的每条指令翻译成另一组指令(主机ISA的指令)来产生预期的效果。是的,它非常慢,它不缓存任何东西,所以每条指令都经过相同的周期。

动态仿真器:Qemu是一个动态仿真器。它可以实时翻译客户指令,也可以缓存结果。最好的部分是直接在主机系统上执行尽可能多的指令,这样模拟就更快了。正如Cody所提到的,它将代码划分为块(一个单独的执行流)。

静态模拟器:据我所知,没有静态模拟器可以帮助虚拟化。

我从来没有做过像模拟游戏机这样奇特的事情,但我曾经上过一门课程,作业是为Andrew Tanenbaums结构化计算机组织中描述的机器编写模拟器。这很有趣,给了我很多顿悟的时刻。在开始编写一个真正的模拟器之前,您可能需要先阅读一下这本书。

是的,你必须“手工”解释整个二进制机器码的混乱。不仅如此,大多数情况下,您还必须模拟一些在目标机器上没有等效硬件的外来硬件。

简单的方法是一个接一个地解释指令。这工作得很好,但是很慢。一种更快的方法是重新编译——将源机器码转换为目标机器码。这比较复杂,因为大多数指令都不是一对一映射的。相反,您将不得不制定涉及额外代码的详细变通方案。但最终还是要快得多。大多数现代模拟器都是这样做的。

模拟器很难创建,因为有很多黑客(在不寻常的 效果),时间问题,等等,你需要模拟。

有关示例,请参见http://queue.acm.org/detail.cfm?id=1755886。

这也会告诉你为什么你需要一个多ghz的CPU来模拟一个1MHz的CPU。