V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
levelworm
V2EX  ›  程序员

请问如何学习苹果 Rosetta 的技术?

  •  
  •   levelworm · 13 天前 · 3047 次点击

    为了提高问题的质量,我做了一些研究。

    参考资料:

    1 - https://dougallj.wordpress.com/2022/11/09/why-is-rosetta-2-fast/

    2 - https://en.wikipedia.org/wiki/Binary_translation#Dynamic_binary_translation

    3 - https://github.com/laniku/sys71src

    Rosetta 1/2 的技术,主要是动态二进制转译( Dynamic Binary Translation )。资料 1 中提到,系统在转译 x86-64 的二进制文件的时候,首次会把所有内容都转译成 ARM 的代码,所以首次启动比较慢。我在 ycombinator 也看到有人说 Total store ordering (TSO)是 Rosetta 2 高速最重要的原因,不过说实话没看懂是为什么。

    我觉得 x86-64 -> ARM 对我来说太复杂了,而且也没有源代码看,所以想找点稍微简单点的例子。资料 2 中提到苹果在每一次更换 CPU 架构的时候都会做类似的事情。第一次是在 Power PC 架构的苹果电脑 rom 里放置了一个 M68K emulator 。但是我找来找去也没找到源代码,甚至在资料 3 ( System 7.1 ,应该是首个有 M68K emulator 的操作系统)中也没有,可能 rom 的源代码是分开的。

    我想请教一下做类似工作的大佬(我猜想龙芯或者华为可能有做这个的朋友?),如何上手研究这项技术?有没有什么比较简单易懂的项目可以先做起来?我琢磨着,如果转译比如说 6502 到 z80 ,是不是会容易一些?这两个架构都是相对简单一些的,而且可能差别不大,但是寄存器数量不一样( 5 vs 16 ),感觉还是会有些头疼。

    多谢!

    27 条回复    2024-12-09 15:44:31 +08:00
    Avn
        1
    Avn  
       13 天前 via iPhone   ❤️ 1
    https://github.com/wine-mirror/wine

    Wine 可以在 macOS 中运行 Windows 应用,这里面应该有类似的技术。
    wangyucn
        2
    wangyucn  
       13 天前   ❤️ 1
    wine 在 macos 上运行 底层还是靠 Rosetta 2 转译 并不是自己实现了类似技术
    ysc3839
        3
    ysc3839  
       13 天前   ❤️ 2
    建议研究开源的游戏模拟器
    Avn
        4
    Avn  
       13 天前 via iPhone   ❤️ 2
    @wangyucn

    Wine 把 Windows API 转换成 macOS API
    Rosetta 把 x86 指令转换成 ARM 指令

    它两个是不同级别的转译,一个是操作系统级别、一个是硬件级别,不是包含关系。我理解是:

    1. 在 x86 芯片的 macOS 上运行 x86 的 Windows 应用:只需要 Wine
    2. 在 ARM 芯片的 macOS 上运行 x86 的 macOS 应用:只需要 Rosetta
    3. 在 ARM 芯片的 macOS 上运行 x86 的 Windows 应用:需要 Wine 和 Rosetta
    zk8802
        5
    zk8802  
       13 天前   ❤️ 2
    看一下 Qemu 的源码吧。
    passive
        6
    passive  
       13 天前 via Android   ❤️ 1
    不考虑动态链接、内存 layout 这些,理想情况是不是能先逆编译到 llvm ,再新编译到目标代码的时候重新分配寄存器、优化指令。
    passive
        7
    passive  
       13 天前 via Android   ❤️ 1
    我在想那些跨 endian 的是怎么转译的。像 cuda 那样同时支持大小 endian 太幸福了。如果在程序里已经写死了每个 byte 处理的顺序,转译的时候并不会知道那是在处理一个 word 。
    wangyucn
        8
    wangyucn  
       13 天前   ❤️ 2
    @Avn

    >Wine 把 Windows API 转换成 macOS API
    >Rosetta 把 x86 指令转换成 ARM 指令
    >它两个是不同级别的转译,一个是操作系统级别、一个是硬件级别,不是包含关系

    这个说的没错

    但是人家楼主明确说,要学的是 x86-64 -> ARM 指令转译。 你建议看 wine ,能学到 x86-64 -> ARM 转译吗?
    levelworm
        9
    levelworm  
    OP
       13 天前 via Android
    @ysc3839 多谢,我又找了点资料,原来 m68k emulator 第一个版本就是读入一个 m68k 指令,然后转译成 PPC 的对应指令。我以前写过简单的 emulator ,但是直接是软件执行,而不是转成指令在本地执行,我研究一下。
    xfn
        10
    xfn  
       13 天前   ❤️ 1
    Rosetta 2 的高效转义主要得益于 Apple Silicon 系芯片的加持,芯片本身在转义过程中也做了一些工作,可以简单理解为 Apple Silicon 实现了一些 x86 芯片才有的特性( https://x.com/ErrataRob/status/1331736203402547201 )。Rosetta 2 并非 qemu 这样完全的直接指令转换。
    DianQK
        11
    DianQK  
       13 天前   ❤️ 2
    https://github.com/ptitSeb/box64 应该是一个合适的参考项目?
    nullyouraise
        12
    nullyouraise  
       13 天前   ❤️ 1
    我之前看到的一篇逆向 Rosetta 2 的文章 https://github.com/FFRI/ProjectChampollion
    michaelzxp
        13
    michaelzxp  
       13 天前
    Rosetta 2 相比 Rosetta 1 效率提升让人惊艳,接近无缝过度
    iamqk
        14
    iamqk  
       13 天前   ❤️ 1
    @Avn 3. 在 ARM 芯片的 macOS 上运行 x86 的 Windows 应用:需要 Wine 和 Rosetta
    这个不成立吧?
    arm mac 下面无法运行 x86 的 windows 程序吧?
    否则能够运行 window x86 的虚拟机早就开发出来了
    现在只有 windows arm 的虚拟机
    iOCZS
        15
    iOCZS  
       13 天前   ❤️ 1
    操作系统为可执行文件提供了 API 和 loader 。
    iamqk
        16
    iamqk  
       13 天前   ❤️ 1
    @iamqk 错了 GPT 好像可以通过 Rosetta 运行 x86 的游戏
    Avn
        17
    Avn  
       13 天前   ❤️ 1
    @iamqk UTM 这种基于 QEMU 的,可以在 ARM 芯片的 macOS 上运行 x86 的 Windows 系统,就是性能很差,卡。
    mmdsun
        18
    mmdsun  
       13 天前   ❤️ 1
    还有微软 Prism ,也是相同的原理也可以研究一下,必要时候逆向
    https://learn.microsoft.com/zh-cn/windows/arm/apps-on-arm-x86-emulation
    levelworm
        19
    levelworm  
    OP
       13 天前 via Android
    @xfn #10

    多谢,我看了几遍,感觉苹果在工程上真是考虑了很多,优化做的很多。里头还提到对 objective-c 的 reference counting 做的硬件优化。
    levelworm
        20
    levelworm  
    OP
       13 天前 via Android
    @DianQK #11
    多谢,我研究一下哈,第一次知道这个项目。
    secondwtq
        21
    secondwtq  
       13 天前   ❤️ 1
    levelworm
        22
    levelworm  
    OP
       12 天前
    @secondwtq #21
    呃,这个就是我的第一个链接。
    DIMOJANG
        23
    DIMOJANG  
       12 天前   ❤️ 1
    @Avn #17 巧了,我现在确实在这么用,其实性能还 OK 。拿来写嵌入式的代码是没啥问题的,就是烧录和编译的速度比较慢( M2 Air 8+256 ,windows 7 x64 )。( Parallels Desktop 模拟出来的 Arm windows 11 不支持 x86 的驱动,太差劲了)
    LanhuaMa
        24
    LanhuaMa  
       12 天前   ❤️ 2
    @Avn #1 Wine 是通过包装 API ,Rosetta 是通过转译 CPU 指令。你这话有点像,想学习 TCP/IP 通讯吗?没问题,你把 HTTP 搞懂了就可以了,这里面应该有类似的技术
    wangyzj
        25
    wangyzj  
       12 天前   ❤️ 1
    谢谢 OP 替我问出了我一直想问的问题
    levelworm
        26
    levelworm  
    OP
       12 天前 via Android
    @wangyzj 问出了大海。。。说实话太难了,我还是看看早期类似的实现比较现实。Rosetta 2 估计大部分是汇编写的?
    wangyzj
        27
    wangyzj  
       12 天前
    @levelworm #26 难是肯定的,尤其是对于不是从事这个方向的,单纯是兴趣想了解的人
    但 OP 也算是做了很多功课
    你们都给了我很多方向
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1675 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 16:33 · PVG 00:33 · LAX 08:33 · JFK 11:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.