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

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

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


当前回答

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

其他回答

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

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

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

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

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

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

一个叫维克多·莫亚·德尔·巴里奥的人写了一篇关于这个主题的论文。152页里有很多有用的信息。你可以在这里下载PDF文件。

如果您不想注册scribd,您可以谷歌获取PDF标题,“模拟编程技术的研究”。PDF文档有几个不同的来源。

我写过一篇关于用JavaScript模拟Chip-8系统的文章。

这是一个很好的开始,因为系统不是很复杂,但你仍然了解操作码、堆栈、寄存器等是如何工作的。

我将很快为NES写一篇更长的指南。

关于模拟真实系统或你自己的东西的建议? 我可以说模拟器通过模拟整个硬件来工作。也许不是电路(像HW那样四处移动比特)。移动字节是最终结果,所以复制字节是好的)。模拟器是很难创建的,因为有很多黑客(如在不寻常的效果),时间问题,等等,你需要模拟。如果一个(输入)部分是错误的,那么整个系统就会崩溃,或者最多出现一个bug/小故障。