为什么CPU仿真很慢[关闭]


3

不同的CPU(IA-32,ARM9等)操作本质上应该是等效的(移动,读取,写入数据等)。对于不同的CPU来说,彼此模仿不应该是痛苦的。但似乎并非如此简单,因为模拟软件运行速度太慢。我们可以简单地转换一个可执行文件,然后执行它吗?为什么它依赖于资源(为什么我需要一个强大的CPU来模拟其他CPU)?不得不说我没有大的低级编程技能。非常感谢。

Answers:


4

首先,尽管肯定存在非常相似的指令,但并不存在某些指令集在不同的CPU架构上总是表现相同的情况。为了准确仿真,它(通常)不足以转换每条指令 - 你必须处理存储器访问,定时,中断......而这只是为了CPU。

看起来你正在考虑的是静态重新编译,但它很难做到(事实上,我认为它归结为停止问题,理论上它实际上是不可能的)。实际上,我们有时可以为程序的一个子集执行此操作,但是您不能编写通用编译器,它将一个体系结构的目标代码作为输入,并为另一个体系结构输出完全相同的代码。例如,使用此方法处理自修改代码很困难。

动态重新编译(在程序执行时即时生成代码)更成功(对于正确的操作仍然是非常重要的)。但具体问题将取决于架构。在许多情况下,模拟CPU不是问题,但是模拟各种外围设备,保持准确的时序(参见例如byuu关于模拟SNES的文章)。

有时你可以忽略很多这些约束,并且仍然可以很好地模拟硬件以使软件的子集工作,但是除非你拥有实际的硬件,否则永远不可能(据我所知)具有100%的准确性和零开销。


静态重新编译与动态有何不同,因为代码将被重新编译(转换)?
user2543574 2014年

不同之处在于动态重新编译在代码运行时发生,因此可以在任何给定时间知道系统的状态。这使您可以根据当前条件以不同方式转换代码,这是静态重新编译器无法实现的。
user55325 2014年

5

不同的CPU(IA-32,ARM9等)操作本质上应该是等效的(移动,读取,写入数据等)。

他们应该但他们不是。CPU架构根据设计人员的设想实现这些基本操作 - 根据设计人员的目标,这可能会有很大不同。在一些CPU上的一条指令中可能完成的事情可能需要许多很多指令。

我们可以简单地转换一个可执行文件,然后执行它吗?为什么它依赖于资源(为什么我需要一个强大的CPU来模拟其他CPU)?

如果您只想模拟CPU,那么这可以相对容易地完成。“动态转换”可执行文件称为“dyamic recompliation”,许多模拟器已经这样做了。通常,人们想要模仿整个平台。这包括除CPU以外的硬件,有时难以模拟硬件(例如Atari 2600 TIA)或文档记录不足(NES PPU视频硬件甚至当前GPU硬件)或两者兼而有之。CPU始终在平台环境中运行,通常软件期望CPU +平台一起以某种方式工作。模拟平台的要求,以及通常需要严格的时序要求,这是困难和资源密集的部分。


是。如果不是因为CPU周围的外围设备的微小细节,例如,不需要为IBM ROM BIOS进行逆向工程的所有努力; 只需在主板上拍一个现成的8086,你就可以买到IBM PC克隆。显然,在实践中并不那么容易。这同样适用于此,尽管比8 KiB ROM芯片具有更大的规模,具有已发布,注释和注释的源代码。
一个CVn 2014年

@MichaelKjörling为什么我们不能在黑盒子类别中思考,因为我们有一些输入数据和任务要做?输入数据应该很容易转换。为什么不呢?
user2543574 2014年

@ user2543574因为正是因为ultrasawblade指出,有一个很大更多的平台的真正有用的仿真不是简单地从一个CPU到其他翻译CPU二进制操作码。编写一个可用的(尽管可能不是很有用)裸机Altair 8800仿真器非常简单,因为它真的只是一个8080 CPU,一堆物理I / O(灯和开关),一块RAM和一个S-100总线连接外围设备到CPU。编写一个有用的NES仿真器是一个完全不同的任务,即使6502 CPU与8080处于类似的水平。
一个CVn 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.