不同的 CPU(IA-32、ARM9 等)操作在本质上应该是等效的(移动、读取、写入数据等)。不同的 CPU 相互模拟应该不会那么麻烦。但似乎没那么容易,因为模拟的软件运行速度太慢了。我们可以简单地转换可执行文件,然后执行它吗?为什么它如此依赖资源(为什么我需要一个强大的 CPU 来模拟其他 CPU)?不得不说我没有很强的低级编程技能。非常感谢。
答案1
首先,虽然确实存在非常相似的指令,但并非总有一组指令在不同 CPU 架构上的行为方式相同。为了实现准确的模拟,翻译每条指令(通常)是不够的 - 您必须处理内存访问、时序、中断……而这还只是针对 CPU 而言的。
看起来你正在考虑的是静态重新编译,但这很难做到(事实上,我认为它归结为停机问题,这在理论上实际上是不可能的)。实际上,我们有时可以对程序的子集执行此操作,但您无法编写一个通用编译器,将一种体系结构的目标代码作为输入,并输出另一种体系结构的完全等效代码。例如,使用此方法很难处理自修改代码。
动态重新编译(在程序执行时即时生成代码)更为成功(但正确执行仍然并非易事)。不过,具体问题将取决于架构。在许多情况下,模拟 CPU 不是问题,但模拟各种外围设备并保持准确的时序才是问题(参见例如byuu 关于模拟 SNES 的文章)。
有时,您可以忽略许多这些限制,并且仍然可以很好地模拟硬件以使软件的子集正常运行,但除非您拥有实际的硬件,否则永远不可能(据我所知)以零开销实现 100% 的准确度。
答案2
不同的CPU(IA-32,ARM9等)操作本质上应该是等效的(移动,读取,写入数据等)。
应该如此,但事实并非如此。CPU 架构根据其设计者的设想来实现这些基本操作 - 这可能因设计者想要实现的目标而有很大不同。在某些 CPU 上一条指令就能完成的事情,在其他 CPU 上可能需要很多条指令。
我们可以简单地转换可执行文件然后执行它吗?为什么它如此依赖资源(为什么我需要一个强大的 CPU 来模拟其他 CPU)?
如果您只想模拟 CPU,那么这可以做到,而且相对容易。“转换”可执行文件的过程称为“动态重新编译”,许多模拟器已经做到了这一点。但通常情况下,人们希望模拟整个平台。这包括除 CPU 之外的硬件,有时该硬件难以模拟(例如 Atari 2600 TIA)或文档记录不全(NES PPU 视频硬件甚至当前的 GPU 硬件),或者两者兼而有之。CPU 始终在平台环境中运行,并且通常软件期望 CPU + 平台以某种方式协同工作。模拟平台的要求以及通常需要的严格时间要求是困难且资源密集的部分。