为了提高问题的质量,我做了一些研究。
参考资料:
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 ),感觉还是会有些头疼。
多谢!
1
Avn 13 天前 via iPhone 1
|
2
wangyucn 13 天前 1
wine 在 macos 上运行 底层还是靠 Rosetta 2 转译 并不是自己实现了类似技术
|
3
ysc3839 13 天前 2
建议研究开源的游戏模拟器
|
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 |
5
zk8802 13 天前 2
看一下 Qemu 的源码吧。
|
6
passive 13 天前 via Android 1
不考虑动态链接、内存 layout 这些,理想情况是不是能先逆编译到 llvm ,再新编译到目标代码的时候重新分配寄存器、优化指令。
|
7
passive 13 天前 via Android 1
我在想那些跨 endian 的是怎么转译的。像 cuda 那样同时支持大小 endian 太幸福了。如果在程序里已经写死了每个 byte 处理的顺序,转译的时候并不会知道那是在处理一个 word 。
|
8
wangyucn 13 天前 2
@Avn
>Wine 把 Windows API 转换成 macOS API >Rosetta 把 x86 指令转换成 ARM 指令 >它两个是不同级别的转译,一个是操作系统级别、一个是硬件级别,不是包含关系 这个说的没错 但是人家楼主明确说,要学的是 x86-64 -> ARM 指令转译。 你建议看 wine ,能学到 x86-64 -> ARM 转译吗? |
9
levelworm OP @ysc3839 多谢,我又找了点资料,原来 m68k emulator 第一个版本就是读入一个 m68k 指令,然后转译成 PPC 的对应指令。我以前写过简单的 emulator ,但是直接是软件执行,而不是转成指令在本地执行,我研究一下。
|
10
xfn 13 天前 1
Rosetta 2 的高效转义主要得益于 Apple Silicon 系芯片的加持,芯片本身在转义过程中也做了一些工作,可以简单理解为 Apple Silicon 实现了一些 x86 芯片才有的特性( https://x.com/ErrataRob/status/1331736203402547201 )。Rosetta 2 并非 qemu 这样完全的直接指令转换。
|
11
DianQK 13 天前 2
https://github.com/ptitSeb/box64 应该是一个合适的参考项目?
|
12
nullyouraise 13 天前 1
我之前看到的一篇逆向 Rosetta 2 的文章 https://github.com/FFRI/ProjectChampollion
|
13
michaelzxp 13 天前
Rosetta 2 相比 Rosetta 1 效率提升让人惊艳,接近无缝过度
|
14
iamqk 13 天前 1
@Avn 3. 在 ARM 芯片的 macOS 上运行 x86 的 Windows 应用:需要 Wine 和 Rosetta
这个不成立吧? arm mac 下面无法运行 x86 的 windows 程序吧? 否则能够运行 window x86 的虚拟机早就开发出来了 现在只有 windows arm 的虚拟机 |
15
iOCZS 13 天前 1
操作系统为可执行文件提供了 API 和 loader 。
|
18
mmdsun 13 天前 1
还有微软 Prism ,也是相同的原理也可以研究一下,必要时候逆向
https://learn.microsoft.com/zh-cn/windows/arm/apps-on-arm-x86-emulation |
19
levelworm OP |
21
secondwtq 13 天前 1
dougallj.wordpress.com/2022/11/09/why-is-rosetta-2-fast Why is Rosetta 2 fast? | dougallj
|
23
DIMOJANG 12 天前 1
@Avn #17 巧了,我现在确实在这么用,其实性能还 OK 。拿来写嵌入式的代码是没啥问题的,就是烧录和编译的速度比较慢( M2 Air 8+256 ,windows 7 x64 )。( Parallels Desktop 模拟出来的 Arm windows 11 不支持 x86 的驱动,太差劲了)
|
24
LanhuaMa 12 天前 2
@Avn #1 Wine 是通过包装 API ,Rosetta 是通过转译 CPU 指令。你这话有点像,想学习 TCP/IP 通讯吗?没问题,你把 HTTP 搞懂了就可以了,这里面应该有类似的技术
|
25
wangyzj 12 天前 1
谢谢 OP 替我问出了我一直想问的问题
|