我很好奇使用 Rosetta 2 与仿真在 Apple M1 平台上运行 x86-64 二进制文件的性能特征截然不同,例如 Docker Desktop 目前使用QEMU所做的事情。
我理解为什么仿真这么慢,但是在这个 Twitter 线程中详细解释了为什么 Rosetta 2 这么快:https ://twitter.com/ErrataRob/status/1331735383193903104
该解释的要点是,在通常情况下,arm 和 x86 具有相反(且不兼容)的内存寻址方案,这需要大量的仿真开销,但 M1 芯片通过硬件优化解决了这个问题,允许它使用两种寻址方案访问内存。实际上,当运行 Rosetta 2 仿真指令时,会设置一个标志以让处理器知道使用 x86 样式的寻址方案。
假设这个解释是合理的(如果有人有比上面的 Twitter 线程更好的来源报告,我会在评论中包含它),从技术上讲,这种优化是否可以用于完整的硬件仿真,例如运行 x86- 64 个 Linux Docker 容器,还是运行一个完整的 x86-64 Windows 桌面虚拟机,比如VMware Fusion/VirtualBox?或者,这些场景中的单独操作系统层是否排除了利用内存排序优化的能力?
另外,此处理器模式(标志或指令)是否已记录并发布以供第 3 方使用,还是仅对 Apple 私有?