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

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

  •  
  •   t41372 Feb 19, 2023 via Android 4359 views
    This topic created in 1184 days ago, the information mentioned may be changed or developed.

    如题,

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

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

    arm 模拟 x64 操作系统与

    arm 模拟 x64 程序与

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

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

    灵感源自 t/917074

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

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

    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  
       Feb 19, 2023 via iPhone
    M1 处理器似乎有东西能更高效的运行 x86 代码
    ch2
        8
    ch2  
       Feb 19, 2023
    -> Rosetta 可以流畅转译并运行 x64 程序
    还是损耗很大的
    hjc4869
        9
    hjc4869  
       Feb 19, 2023   1
    Rosetta2 / Windows XtaJIT 本质上是用户态的转译,与之对应的是 qemu-user ,可以在 Linux 下转译执行其它 ISA 的二进制代码。效率虽然不及商业方案但是性能也还算在同一数量级内。
    而 utm 本质上是 qemu-system ,需要转译执行整个 OS kernel ,包括特权指令在内。不仅需要转译的指令更多,其中相比用户态的转译会有额外的 softmmu 开销,代价巨大。
    wanguorui123
        10
    wanguorui123  
       Feb 19, 2023
    qemu 应该是全模拟吧,Rosetta 应该是半模拟
    icyalala
        11
    icyalala  
       Feb 20, 2023
    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  
       Feb 20, 2023
    因为 qemu 是开源的(开发能力不足)
    因为要在 arm 下模拟 x86
    即不能像苹果做出优质的 rossetta
    又不是同一架构的 pd 模拟安装 arm win
    About     Help     Advertise     Blog     API     FAQ     Solana     2984 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 58ms UTC 12:47 PVG 20:47 LAX 05:47 JFK 08:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86