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

4 天前
 levelworm

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

参考资料:

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 ),感觉还是会有些头疼。

多谢!

2861 次点击
所在节点    程序员
27 条回复
Avn
4 天前
https://github.com/wine-mirror/wine

Wine 可以在 macOS 中运行 Windows 应用,这里面应该有类似的技术。
wangyucn
4 天前
wine 在 macos 上运行 底层还是靠 Rosetta 2 转译 并不是自己实现了类似技术
ysc3839
4 天前
建议研究开源的游戏模拟器
Avn
4 天前
@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
4 天前
看一下 Qemu 的源码吧。
passive
4 天前
不考虑动态链接、内存 layout 这些,理想情况是不是能先逆编译到 llvm ,再新编译到目标代码的时候重新分配寄存器、优化指令。
passive
4 天前
我在想那些跨 endian 的是怎么转译的。像 cuda 那样同时支持大小 endian 太幸福了。如果在程序里已经写死了每个 byte 处理的顺序,转译的时候并不会知道那是在处理一个 word 。
wangyucn
4 天前
@Avn

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

这个说的没错

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

多谢,我看了几遍,感觉苹果在工程上真是考虑了很多,优化做的很多。里头还提到对 objective-c 的 reference counting 做的硬件优化。
levelworm
3 天前
@DianQK #11
多谢,我研究一下哈,第一次知道这个项目。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1095833

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX