模拟器是如何工作的,它们是如何编写的?

966

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

http://www.tommowalker.co.uk/snemzelda.png

您是否需要通过解释其特定的汇编指令来模拟这些机器的处理器?还有哪些因素需要考虑?它们通常是如何设计的?

针对有兴趣编写模拟器(尤其是游戏系统)的人,您能给出一些建议吗?


15
你需要找到的最重要的东西是该系统的“程序员手册”,因为它详细说明了硬件供应商与程序员之间的“契约”,并隐藏了不相关且可能会改变的细节。你的成功机会取决于该系统的流行程度。 - Uri
155
好的游戏选择。 - Cristián Romo
2
是的,我相信是这样的:http://zh.wikipedia.org/wiki/%E9%98%BF%E5%82%B3%E4%BC%A0%E8%AF%B4%EF%BC%9A%E6%9E%97%E5%85%8B%E7%9A%84%E5%A5%87%E8%BF%B9%EF%BC%88%E6%B8%B8%E6%88%8F%EF%BC%89 - mmcdole
16
任何人想知道模拟和仿真的区别,请查看以下链接:https://dev59.com/8nI-5IYBdhLWcg3w-9sK。 - Lazer
8
自从我第一次玩那个游戏以来,我一直想知道为什么海拉鲁充满了“8球”大石头 :-) - Vivian River
16个回答

7

我从未做过像模拟游戏控制台这样花哨的事情,但我曾经参加过一门课程,作业是为 Andrew Tanenbaum 的 Structured Computer Organization 中描述的机器编写仿真器。那很有趣,给了我很多灵光乍现的时刻。在开始编写真正的仿真器之前,你可能想先看看那本书。


4
Shared Source Device Emulator 是一个包含可构建源代码的 PocketPC/Smartphone 模拟器(需要 Visual Studio,在 Windows 上运行)。我参与了二进制版本 V1 和 V2 的开发。
它解决了许多仿真问题: - 从客户机虚拟地址到客户机物理地址到主机虚拟地址的有效地址转换 - JIT 编译客户机代码 - 模拟外围设备,如网络适配器、触摸屏和音频 - UI 集成,适用于主机键盘和鼠标 - 状态保存/恢复,用于模拟从低功耗模式恢复

4

关于模拟真实系统或自己的东西,我可以说模拟器通过模拟整个硬件来工作。也许不是到电路的级别(因为像硬件一样移动位会有很多变化。移动字节是最终结果,所以复制字节是可以的)。模拟器非常难创建,因为你需要模拟许多黑科技(例如不寻常的效果)、时间问题等。如果一个(输入)部分出错,整个系统可能会崩溃,最好情况下只会有一个错误/故障。


1
我如何开始模拟。
1.获取基于低级编程的书籍,这对于“假装”任天堂...游戏男孩的操作系统是必需的。
2.获取专门关于模拟和可能的操作系统开发的书籍。(你不会制作操作系统,但最接近它)
3.查看一些开源模拟器,尤其是您想要为其创建模拟器的系统的模拟器。
4.将更复杂的代码片段复制到您的IDE /编译器中。这将节省您编写长代码的时间。这就是我在操作系统开发中所做的,使用Linux的一个区域。

1
我写了一篇关于用JavaScript模拟Chip-8系统的文章。
这是一个非常好的起点,因为该系统并不是非常复杂,但您仍然可以学习操作码、堆栈、寄存器等知识。
我很快会为NES撰写更长的指南。

1

添加@Cody Brocious提供的答案
在虚拟化的背景下,当您模拟一个新系统(CPU,I/O等)到虚拟机中时,我们可以看到以下类别的仿真器。

解释:bochs是解释器的一个例子,它是一个x86 PC仿真器,它从客户系统中获取每个指令并将其翻译成另一组指令(主机ISA的指令),以产生预期的效果。是的,它非常慢,它不缓存任何东西,因此每个指令都要经过相同的周期。

动态仿真器:Qemu是一种动态仿真器。它对客户指令进行即时翻译,并缓存结果。最好的部分是直接在主机系统上执行尽可能多的指令,以使仿真更快。正如Cody所提到的那样,它将代码分成块(1个单独的执行流)。

静态仿真器:据我所知,在虚拟化方面没有静态仿真器可以帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接