为什么我可以在 ARM 上 运行 x86 二进制文件?

Why can I run x86 binary on ARM?

我最近在我的 x86 intel MacBook 上编译了一个我用 gcc 编写的 C 程序 - 我将这个二进制文件下载到我的 M1 MacBook 上,它似乎 运行 很好......这挑战了我的理解,因为我认为它必须针对特定指令集(在本例中为 x86)进行编译。我想知道我的 MacBook 中是否有一些软件层自动 'assembling' x86 进入 ARM

有什么想法吗?

MacOS 包含 Rosetta 2 从 x86 进行动态二进制转换的软件,因此 x86 软件可以 运行 在 M1 CPU 上。不如直接从 C 编译为 AArch64 机器代码的代码高效,但它可以工作。

您可以在这里阅读更多内容: https://developer.apple.com/documentation/apple-silicon/about-the-rosetta-translation-environment

Stack Overflow 有一个标签:

Apple 网站上还有一个问题:How does Rosetta 2 work? 答案指出翻译完成一次并缓存,因此它可以花费大量时间来优化翻译。 (对于非 JITed x86 代码。)

A​​pple 决定从英特尔过渡到 arm 处理器,考虑到多年来为英特尔架构开发的应用程序数量,这是一个重大决定。

A​​rm 和 Intel 指令集不同,针对 Intel 架构编译的程序不能在 Arm 架构上原生 运行。指令集是受保护的,公司复制竞争对手的指令集是违法的。

Rosetta is the solution to this instruction set incompatibility problem. Rosetta is an instruction translation that transforms Intel instructions into arm instructions. The performance impact can be negligible due to the performances of the M1 chip but the long term solution is to recompile the x86_64 application to the M1 architecture. XCode has already released the toolchain为此。

如果您想深入研究这个主题,我建议您this article了解 Intel 和 Arm 架构之间的区别。