如题,
已知在 m1 平台下,Rosetta 可以流畅转译并运行 x64 程序,使用 parallel 运行 arm 版 windows 11 也可以用 win11 arm 的转译功能流畅运行 x64 程序
那为什么使用 qemu (utm)模拟 x64 版 win7 会卡的不可用?
arm 模拟 x64 操作系统与
arm 模拟 x64 程序与
arm 虚拟 arm 操作系统运行 x64 程序
他们的效率为什么会差的如此之多?
1
agagega 2023-02-19 11:26:53 +08:00 via iPhone
因为 Rosetta 不支持用在虚拟机上,不过他们给 Linux VM 开了个洞: https://developer.apple.com/documentation/virtualization/running_intel_binaries_in_linux_vms_with_rosetta
|
2
tyzandhr 2023-02-19 11:49:01 +08:00 via Android
我猜 rosetta 会有转译,生成 native binary code 。
|
3
kekxv 2023-02-19 12:12:29 +08:00 via iPhone
有没有可能 qemu 模拟的是整个 win7 而不是单个软件包括其依赖?
|
4
Ayahuasec 2023-02-19 12:18:36 +08:00 via Android
rosetta 其实应该类比 qemu-user 和 qemu-user-binfmt ,而不是 qemu-system
|
5
mikewang 2023-02-19 13:50:02 +08:00
因为操作系统还是以原生的形式在工作的,只有应用程序本身负责的部分是在模拟 x64 。
Windows on ARM 下,x64 应用程序调用 Windows API ,Windows 将 x64 调用规约转换为 arm64 调用规约,系统层面的很多东西还是以原生性能运行的。 QEMU 要模拟整个 CPU ,不管什么都需要模拟,性能低也是正常的。 |
6
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 的客户一件事。 |
7
dingwen07 2023-02-19 18:24:50 +08:00 via iPhone
M1 处理器似乎有东西能更高效的运行 x86 代码
|
8
ch2 2023-02-19 18:42:47 +08:00
-> Rosetta 可以流畅转译并运行 x64 程序
还是损耗很大的 |
9
hjc4869 2023-02-19 19:29:50 +08:00 1
Rosetta2 / Windows XtaJIT 本质上是用户态的转译,与之对应的是 qemu-user ,可以在 Linux 下转译执行其它 ISA 的二进制代码。效率虽然不及商业方案但是性能也还算在同一数量级内。
而 utm 本质上是 qemu-system ,需要转译执行整个 OS kernel ,包括特权指令在内。不仅需要转译的指令更多,其中相比用户态的转译会有额外的 softmmu 开销,代价巨大。 |
10
wanguorui123 2023-02-19 21:11:54 +08:00
qemu 应该是全模拟吧,Rosetta 应该是半模拟
|
11
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 一样了) |
12
iamqk 2023-02-20 11:27:54 +08:00
因为 qemu 是开源的(开发能力不足)
因为要在 arm 下模拟 x86 即不能像苹果做出优质的 rossetta 又不是同一架构的 pd 模拟安装 arm win |