为什么明明同样是在 arm 下运行 x64 代码, qemu 与 Rosetta 2 和 Parallel 下虚拟 arm 版 windows 转译运行 x64 代码差距会这么大

2023-02-19 11:16:45 +08:00
 t41372

如题,

已知在 m1 平台下,Rosetta 可以流畅转译并运行 x64 程序,使用 parallel 运行 arm 版 windows 11 也可以用 win11 arm 的转译功能流畅运行 x64 程序

那为什么使用 qemu (utm)模拟 x64 版 win7 会卡的不可用?

arm 模拟 x64 操作系统与

arm 模拟 x64 程序与

arm 虚拟 arm 操作系统运行 x64 程序

他们的效率为什么会差的如此之多?

灵感源自 https://www.v2ex.com/t/917074

2977 次点击
所在节点    问与答
12 条回复
agagega
2023-02-19 11:26:53 +08:00
因为 Rosetta 不支持用在虚拟机上,不过他们给 Linux VM 开了个洞: https://developer.apple.com/documentation/virtualization/running_intel_binaries_in_linux_vms_with_rosetta
tyzandhr
2023-02-19 11:49:01 +08:00
我猜 rosetta 会有转译,生成 native binary code 。
kekxv
2023-02-19 12:12:29 +08:00
有没有可能 qemu 模拟的是整个 win7 而不是单个软件包括其依赖?
Ayahuasec
2023-02-19 12:18:36 +08:00
rosetta 其实应该类比 qemu-user 和 qemu-user-binfmt ,而不是 qemu-system
mikewang
2023-02-19 13:50:02 +08:00
因为操作系统还是以原生的形式在工作的,只有应用程序本身负责的部分是在模拟 x64 。
Windows on ARM 下,x64 应用程序调用 Windows API ,Windows 将 x64 调用规约转换为 arm64 调用规约,系统层面的很多东西还是以原生性能运行的。

QEMU 要模拟整个 CPU ,不管什么都需要模拟,性能低也是正常的。
secondwtq
2023-02-19 15:37:30 +08:00
这里存在两个层面的问题,一个是接口上的问题,另一个是实现上的问题。
注意主题中的说法有缺陷,准确来说应该是:

1. AArch64 macOS + Rosetta 2 + x86-64 macOS 程序 - 在 AArch64 操作系统上模拟 x86-64 程序
2. AArch64 macOS + PD + AArch64 Windows 11 + WOW64 + x86-64 Windows 程序 - 在 AArch64 操作系统上虚拟 AArch64 操作系统再模拟 x86-64 程序
3. AArch64 macOS + QEMU + x86-64 Windows + x86-64 程序 - 在 AArch64 操作系统上模拟 x86-64 操作系统运行 x86-64 程序

接口上的问题就是右半部分,“模拟”的是整个操作系统还是单个程序,前者要比后者更复杂。3 天然地就不占优势。特别地,3 连 MMU 可能都是软件模拟的。
实现上的问题是左半部分,使用什么样的程序来实现这一需求,程序的实现方式是怎样的。不同的实现会存在性能的差异。

另外值得一提的是,QEMU 和 Rosetta 2 的设计原则是不同的,例如 https://dougallj.wordpress.com/2022/11/09/why-is-rosetta-2-fast 这里描述了 Rosetta 2 的一些实现细节,其中提到了 Rosetta 2 利用了 x86 、AArch64 和 Apple Silicon 的特征,这就是它的独特之处(所谓“something only Apple can do”)——它只需要专注做好“在 Apple Silicon 实现的 AArch64 上模拟 x86”这一件事情就可以。而 QEMU 则是一个有很强通用性的软件。此外,QEMU 支持插件等形式来用于非常规模拟之外的开发等用途,Rosetta 2 ... 依然只需要做好服务 Apple Silicon 的客户一件事。
dingwen07
2023-02-19 18:24:50 +08:00
M1 处理器似乎有东西能更高效的运行 x86 代码
ch2
2023-02-19 18:42:47 +08:00
-> Rosetta 可以流畅转译并运行 x64 程序
还是损耗很大的
hjc4869
2023-02-19 19:29:50 +08:00
Rosetta2 / Windows XtaJIT 本质上是用户态的转译,与之对应的是 qemu-user ,可以在 Linux 下转译执行其它 ISA 的二进制代码。效率虽然不及商业方案但是性能也还算在同一数量级内。
而 utm 本质上是 qemu-system ,需要转译执行整个 OS kernel ,包括特权指令在内。不仅需要转译的指令更多,其中相比用户态的转译会有额外的 softmmu 开销,代价巨大。
wanguorui123
2023-02-19 21:11:54 +08:00
qemu 应该是全模拟吧,Rosetta 应该是半模拟
icyalala
2023-02-20 00:36:53 +08:00
PD 硬件虚拟化 ARM Win7 ,这是有硬件虚拟化支持的,针对的是 OS ,单论 CPU 的性能损失可以忽略不计。

Rosetta 或者 Win11 自带的转译功能,针对的是 App 。第一次运行 App 时,系统把 x86 的二进制指令一次性翻译为 ARM 缓存下来。之后每次运行,都是直接执行那个翻译后的 ARM binary ,CPU 直接执行的就是 ARM 指令。所以翻译得好,性能损失就不大。这种方式需要系统的支持,而且翻译并不一定都正确,所以可能会有崩溃。

UTM/QEMU 在 ARM 上跑 x86 那套是模拟整个硬件,指令跑起来都是用软件实时模拟执行的,性能当然不是一个等级的。( UTM/QEMU 在 ARM 上跑原生 ARM 的系统时,底层用的是硬件虚拟化,这时就和 PD 一样了)
iamqk
2023-02-20 11:27:54 +08:00
因为 qemu 是开源的(开发能力不足)
因为要在 arm 下模拟 x86
即不能像苹果做出优质的 rossetta
又不是同一架构的 pd 模拟安装 arm win

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/917310

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX