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

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

  •  
  •   t41372 · 221 天前 via Android · 1851 次点击
    这是一个创建于 221 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,

    已知在 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  
       221 天前 via iPhone
    因为 Rosetta 不支持用在虚拟机上,不过他们给 Linux VM 开了个洞: https://developer.apple.com/documentation/virtualization/running_intel_binaries_in_linux_vms_with_rosetta
    tyzandhr
        2
    tyzandhr  
       221 天前 via Android
    我猜 rosetta 会有转译,生成 native binary code 。
    kekxv
        3
    kekxv  
       221 天前 via iPhone
    有没有可能 qemu 模拟的是整个 win7 而不是单个软件包括其依赖?
    Ayahuasec
        4
    Ayahuasec  
       221 天前 via Android
    rosetta 其实应该类比 qemu-user 和 qemu-user-binfmt ,而不是 qemu-system
    mikewang
        5
    mikewang  
       221 天前
    因为操作系统还是以原生的形式在工作的,只有应用程序本身负责的部分是在模拟 x64 。
    Windows on ARM 下,x64 应用程序调用 Windows API ,Windows 将 x64 调用规约转换为 arm64 调用规约,系统层面的很多东西还是以原生性能运行的。

    QEMU 要模拟整个 CPU ,不管什么都需要模拟,性能低也是正常的。
    secondwtq
        6
    secondwtq  
       221 天前
    这里存在两个层面的问题,一个是接口上的问题,另一个是实现上的问题。
    注意主题中的说法有缺陷,准确来说应该是:

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