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