为了提高问题的质量,我做了一些研究。
参考资料:
1 - dougallj.wordpress.com/2022/11/09/why-is-rosetta-2-fast/
2 - en.wikipedia.org/wiki/Binary_translation#Dynamic_binary_translation
3 - 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 ),感觉还是会有些头疼。
多谢!

github.com/wine-mirror/wine

Wine 可以在 macOS 中运行 Windows 应用,这里面应该有类似的技术。

wine 在 macos 上运行 底层还是靠 Rosetta 2 转译 并不是自己实现了类似技术

建议研究开源的游戏模拟器

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

    看一下 Qemu 的源码吧。

    不考虑动态链接、内存 layout 这些,理想情况是不是能先逆编译到 llvm ,再新编译到目标代码的时候重新分配寄存器、优化指令。

    我在想那些跨 endian 的是怎么转译的。像 cuda 那样同时支持大小 endian 太幸福了。如果在程序里已经写死了每个 byte 处理的顺序,转译的时候并不会知道那是在处理一个 word 。

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

这个说的没错

但是人家楼主明确说,要学的是 x86-64 -> ARM 指令转译。 你建议看 wine ,能学到 x86-64 -> ARM 转译吗?

多谢,我又找了点资料,原来 m68k emulator 第一个版本就是读入一个 m68k 指令,然后转译成 PPC 的对应指令。我以前写过简单的 emulator ,但是直接是软件执行,而不是转成指令在本地执行,我研究一下。

Rosetta 2 的高效转义主要得益于 Apple Silicon 系芯片的加持,芯片本身在转义过程中也做了一些工作,可以简单理解为 Apple Silicon 实现了一些 x86 芯片才有的特性( x.com/ErrataRob/status/1331736203402547201 )。Rosetta 2 并非 qemu 这样完全的直接指令转换。

github.com/ptitSeb/box64 应该是一个合适的参考项目?

我之前看到的一篇逆向 Rosetta 2 的文章 github.com/FFRI/ProjectChampollion

Rosetta 2 相比 Rosetta 1 效率提升让人惊艳,接近无缝过度

  1. 在 ARM 芯片的 macOS 上运行 x86 的 Windows 应用:需要 Wine 和 Rosetta

这个不成立吧?
arm mac 下面无法运行 x86 的 windows 程序吧?
否则能够运行 window x86 的虚拟机早就开发出来了
现在只有 windows arm 的虚拟机

操作系统为可执行文件提供了 API 和 loader 。

错了 GPT 好像可以通过 Rosetta 运行 x86 的游戏

UTM 这种基于 QEMU 的,可以在 ARM 芯片的 macOS 上运行 x86 的 Windows 系统,就是性能很差,卡。

还有微软 Prism ,也是相同的原理也可以研究一下,必要时候逆向
learn.microsoft.com/zh-cn/windows/arm/apps-on-arm-x86-emulation

#10

多谢,我看了几遍,感觉苹果在工程上真是考虑了很多,优化做的很多。里头还提到对 objective-c 的 reference counting 做的硬件优化。

#11
多谢,我研究一下哈,第一次知道这个项目。

dougallj.wordpress.com/2022/11/09/why-is-rosetta-2-fast Why is Rosetta 2 fast? | dougallj

#21
呃,这个就是我的第一个链接。

#17 巧了,我现在确实在这么用,其实性能还 OK 。拿来写嵌入式的代码是没啥问题的,就是烧录和编译的速度比较慢( M2 Air 8+256 ,windows 7 x64 )。( Parallels Desktop 模拟出来的 Arm windows 11 不支持 x86 的驱动,太差劲了)

#1 Wine 是通过包装 API ,Rosetta 是通过转译 CPU 指令。你这话有点像,想学习 TCP/IP 通讯吗?没问题,你把 HTTP 搞懂了就可以了,这里面应该有类似的技术