assembly M1上的其他x86-64仿真器是否可以利用Rosetta 2使用的相同优化?

iqxoj9l9  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(138)

我对使用Rosetta 2和仿真在Apple M1平台上运行x86-64二进制文件的性能特征有很大不同感到好奇,例如Docker桌面目前使用QEMU做了什么。
我理解为什么模拟这么慢,但为什么Rosetta 2这么快的解释已经在这个Twitter线程中详细说明:https://twitter.com/ErrataRob/status/1331735383193903104
这种解释的要点是,在通常情况下,arm和x86具有相反的(和不兼容的)存储器寻址方案,其需要显著的仿真开销,但是M1芯片通过允许其使用两种寻址方案来访问存储器的硬件优化来解决这个问题。设定旗标以让处理器知道使用x86型寻址方案。
假设这个解释是合理的(如果有人有比上面的Twitter帖子更好的报告来源,我希望能在评论中包含它),从技术上讲,这种优化可以用于完全硬件仿真,例如运行x86-64 Linux Docker容器,或运行完全x86-64 Windows桌面虚拟机 a la VMware Fusion/VirtualBox吗?或者,在那些场景中的单独的操作系统层是否排除了能够利用存储器排序优化?
另外,此处理器模式(标志或指令)是否记录并发布供第三方使用,或者仅限于Apple使用?

编辑,截至2023-01-31备查:

苹果可能在2022年6月左右发布了对使用虚拟化框架的Rosetta 2 Linux VM的支持:
https://developer.apple.com/documentation/virtualization/running_intel_binaries_in_linux_vms_with_rosetta
此外,Docker Desktop for Mac在2023年1月12日发布了x86容器的beta功能,在版本4.16.0中使用了此功能。

csbfibhn

csbfibhn1#

不是内存 * 寻址 *,内存 * 排序 *,即用于线程间同步的无锁原子-在x86中,每个asm加载/存储都分别是acquire/release。(对于真正的x86 CPU,执行推测性早期加载,因此在正常情况下,当单个线程在其他线程没有写入的内存上操作时,性能不会受到影响。
M1有硬件支持这样的模式,以及一个弱序模式,以最有效地运行原生AArch64代码。

是的,https://github.com/saagarjha/TSOEnabler是一个开源软件,可以切换这种支持。但它是一个内核扩展,代码签名使得MacOS很难允许它,你必须对它进行签名或禁用签名验证或其他操作:
假设,如果您构建并签署内核扩展,您应该能够使用它(如果你不使用KEXT签名证书,则禁用SIP)并将其拖到/Library/Extensions中。此时会出现一个对话框,提示你在"安全与隐私"首选项窗格中启用该扩展,你从那里允许它并重新启动,它将被安装。(如果您没有看到它,则可能是扩展的权限不正确:尝试一个chown-r root:wheel。)在实践中,这可能会在许多方面出错,我已经幸运地"重置一切",并尝试在完成以下操作后安装:
[...]有关步骤列表,请参阅链接

    • 因此,QEMU的x86仿真可以使用与Rosetta-2的x86仿真相同的硬件支持。**它们都是x86仿真器。

正如你所说,主要的问题是苹果提供了公共API来启用硬件模式,这样人们就不必手动安装这个内核模块;我相信大多数人都不想这么做。我对软件的情况了解不多,我对CPU架构的细节更感兴趣。

相关问题