【问题标题】:Why can I run x86 binary on ARM? [closed]为什么我可以在 ARM 上运行 x86 二进制文件? [关闭]
【发布时间】:2021-11-25 09:13:01
【问题描述】:

我最近在我的 x86 英特尔 MacBook 上编译了一个用 gcc 编写的 C 程序 - 我将这个二进制文件下载到我的 M1 MacBook 上,它似乎运行良好......这挑战了我的理解,因为我认为它必须遵守特定指令集(在这种情况下为 x86).. 我想知道我的 MacBook 中是否有一些软件层自动将 x86“组装”到 ARM 中

有什么想法吗?

【问题讨论】:

    标签: macos x86 executable arm64 rosetta-2


    【解决方案1】:

    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 代码。)

    【讨论】:

    • 也许您想进一步扩展您的答案,使其不会显示为大部分链接。特别是“你可以在这里阅读更多”+链接不是一个好兆头。
    • @Jean-FrançoisFabre:公平地说,这个问题基本上可以通过重新标记来回答,因为 SO 有一个相关软件的标签,其标签 wiki 链接到维基百科。 :P 关于全局,真的没有什么比这更要多说的了:它是一个软件 翻译层(尽管在我编辑之前没有那个关键词,所以公平点)。另一个主要有趣的事情是,为了支持多线程 x86 代码,M1 CPU 内核可以使用强排序内存模型(x86 TSO)而不是普通的 AArch64,因此它不必弄清楚哪些存储需要释放/获取同步。
    • infoq.com/news/2020/11/rosetta-2-translation / reddit.com/r/hardware/comments/i0mido/… / github.com/saagarjha/TSOEnabler - 所以它是用于内存排序的硬件软件翻译。 (qemu 只是忽略了一些东西,并希望做到最好!)
    【解决方案2】:

    Apple 决定从 Intel 过渡到 Arm 处理器,这是一个重大决定,因为多年来为 Intel 架构开发的应用程序数量众多。

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

    Rosetta是这个指令集不兼容问题的解决方案。 Rosetta 是一种指令翻译,可将 Intel 指令转换为 arm 指令。由于 M1 芯片的性能,性能影响可以忽略不计,但长期解决方案是将 x86_64 应用程序重新编译到 M1 架构。 XCode 已经为此发布了toolchain

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

    【讨论】:

      猜你喜欢
      • 2014-02-24
      • 1970-01-01
      • 2021-05-26
      • 2012-07-08
      • 1970-01-01
      • 2010-09-08
      • 2017-09-19
      • 1970-01-01
      • 2011-10-08
      相关资源
      最近更新 更多