假设您有一台 ARM 嵌入式设备和一台基于 x64 的笔记本电脑。两个系统都运行 GNU/Linux。如果您决定将“ls”二进制文件从笔记本电脑复制到嵌入式设备并在嵌入式设备上运行它,它会起作用吗?请解释您的理由。
答案1
假设您有一台 ARM 嵌入式设备和一台基于 x64 的笔记本电脑。两个系统都运行 GNU/Linux。
好的。
如果您决定将“ls”二进制文件从笔记本电脑复制到嵌入式设备并在嵌入式设备上运行它,它会起作用吗?
这就是问题的关键。它显然不会按原样运行;指令集完全不同。
然而,它就可以运行了。
显而易见的选择是某种形式的虚拟化或仿真。通过仿真 CPU 和周围的支持电路,您可以运行任何可执行二进制文件,只要您可以编写一个足够接近原始硬件和固件的仿真器来产生您想要的结果。
这种方法一直都在使用;这就是世嘉或任天堂的老游戏、苹果 ][ 软件和其他东西如何在现代电脑上运行的原因。当目标平台的处理能力比原始平台强得多,并且有足够详细的硬件和固件文档时,模拟通常相对容易。考虑一下用 Javascript 编写的 IBM 5150 模拟器在您的 Web 浏览器中运行的示例。交叉编译和仿真是开发嵌入式平台软件时相对常见的方法。
另一种方法是使用编译器将机器代码转换为目标(在本例中为基于 ARM 的设备)架构。根据架构之间的差异程度,这可能很简单,也可能非常困难。如果周围的电路有很大不同,那么这将特别成问题;例如,依赖于游戏机的专用精灵和声音处理硬件的视频游戏可能无法轻松转换到没有这些功能的平台上。
真正的问题是:为什么你一开始想做这样的事?
使用为目标平台原生构建的二进制文件(如果可用)几乎肯定会最简单的解决办法。
答案2
不。因为二进制文件是为另一个处理器编译的。它基于 Intel x86 指令集,对 ARM 或任何其他处理器来说毫无意义。