V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
t41372
V2EX  ›  问与答

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

  •  
  •   t41372 · 2023-02-19 11:16:45 +08:00 via Android · 2864 次点击
    这是一个创建于 644 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,

    已知在 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

    12 条回复    2023-02-20 11:27:54 +08:00
    agagega
        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
    tyzandhr
        2
    tyzandhr  
       2023-02-19 11:49:01 +08:00 via Android
    我猜 rosetta 会有转译,生成 native binary code 。
    kekxv
        3
    kekxv  
       2023-02-19 12:12:29 +08:00 via iPhone
    有没有可能 qemu 模拟的是整个 win7 而不是单个软件包括其依赖?
    Ayahuasec
        4
    Ayahuasec  
       2023-02-19 12:18:36 +08:00 via Android
    rosetta 其实应该类比 qemu-user 和 qemu-user-binfmt ,而不是 qemu-system
    mikewang
        5
    mikewang  
       2023-02-19 13:50:02 +08:00
    因为操作系统还是以原生的形式在工作的,只有应用程序本身负责的部分是在模拟 x64 。
    Windows on ARM 下,x64 应用程序调用 Windows API ,Windows 将 x64 调用规约转换为 arm64 调用规约,系统层面的很多东西还是以原生性能运行的。

    QEMU 要模拟整个 CPU ,不管什么都需要模拟,性能低也是正常的。
    secondwtq
        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 的客户一件事。
    dingwen07
        7
    dingwen07  
       2023-02-19 18:24:50 +08:00 via iPhone
    M1 处理器似乎有东西能更高效的运行 x86 代码
    ch2
        8
    ch2  
       2023-02-19 18:42:47 +08:00
    -> Rosetta 可以流畅转译并运行 x64 程序
    还是损耗很大的
    hjc4869
        9
    hjc4869  
       2023-02-19 19:29:50 +08:00   ❤️ 1
    Rosetta2 / Windows XtaJIT 本质上是用户态的转译,与之对应的是 qemu-user ,可以在 Linux 下转译执行其它 ISA 的二进制代码。效率虽然不及商业方案但是性能也还算在同一数量级内。
    而 utm 本质上是 qemu-system ,需要转译执行整个 OS kernel ,包括特权指令在内。不仅需要转译的指令更多,其中相比用户态的转译会有额外的 softmmu 开销,代价巨大。
    wanguorui123
        10
    wanguorui123  
       2023-02-19 21:11:54 +08:00
    qemu 应该是全模拟吧,Rosetta 应该是半模拟
    icyalala
        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 一样了)
    iamqk
        12
    iamqk  
       2023-02-20 11:27:54 +08:00
    因为 qemu 是开源的(开发能力不足)
    因为要在 arm 下模拟 x86
    即不能像苹果做出优质的 rossetta
    又不是同一架构的 pd 模拟安装 arm win
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2708 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:27 · PVG 18:27 · LAX 02:27 · JFK 05:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.