
KI-gestütztes Reverse-Engineering von Rosetta (2 für Linux). Haftungsausschluss: Aufgrund der Nutzungsvereinbarung werde ich den Code nicht anfassen. Alles wird von KI erledigt, daher könnte die Implementierung chaotisch sein.
Ein umfassendes Reverse-Engineering-Projekt zum Verständnis und zur Dokumentation von Apples Rosetta 2-Binärübersetzungstechnologie.
Im November 2020 kündigte Apple seine ersten Apple-Silicon-Macs an, was einen historischen Übergang von Intel-x86_64-Prozessoren zu den eigenen ARM-basierten M1-Chips markierte. Dies war Apples dritter großer Architekturwechsel:
Jeder Übergang erforderte eine Binärübersetzungslösung, um vorhandene Software während der Migrationsphase ausführen zu können. Rosetta 2 ist Apples bisher ausgeklügeltstes Binärübersetzungssystem.
Rosetta (2006-2011) war Apples erste dynamische Binärübersetzungssoftware, die es PowerPC-Anwendungen ermöglichte, auf Intel-basierten Macs zu laufen.
Rosetta wurde in Mac OS X 10.7 (Lion) entfernt, womit der Intel-Übergang abgeschlossen wurde.
Rosetta 2 ist Apples fortschrittliche dynamische Binärübersetzungstechnologie, die es Anwendungen, die für Intel x86_64 Macs kompiliert wurden, ermöglicht, auf Apple Silicon (ARM64) Macs zu laufen.
┌─────────────────────────────────────────────────────────────┐ │ User Application (x86_64) │ ├─────────────────────────────────────────────────────────────┤ │ Rosetta 2 Layer │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Translator │ │ Runtime │ │ System Call │ │ │ │ (AOT/JIT) │ │ Library │ │ Translation │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ macOS Kernel (ARM64) │ ├─────────────────────────────────────────────────────────────┤ │ Apple Silicon Hardware │ └─────────────────────────────────────────────────────────────┘
### Schlüsseltechnologien
1. **Vorausschauende (AOT) Übersetzung**
- Übersetzt x86_64-Binärdateien zur Installationszeit in ARM64
- Speichert übersetzten Code in einem Cache für schnellere nachfolgende Starts
- Reduziert Laufzeit-Overhead im Vergleich zu reiner JIT-Übersetzung
2. **Just-in-Time (JIT) Übersetzung**
- Übersetzt Codeblöcke bedarfsgesteuert während der Ausführung
- Behandelt dynamisch geladenen Code und selbstmodifizierenden Code
- Verwaltet Übersetzungs-Cache für Effizienz
3. **Befehlssatzübersetzung**
- x86_64 -> ARM64 Befehlszuordnung
- SSE/AVX -> NEON Vektorbefehlsübersetzung
- x86_64 Flags -> ARM64 Bedingungscodes
4. **Systemaufrufübersetzung**
- Übersetzt x86_64 macOS-Systemaufrufe in ARM64-Äquivalente
- Behandelt unterschiedliche Aufrufkonventionen
- Verwaltet Registerzustand über Systemaufrufgrenzen hinweg
5. **Laufzeitunterstützung**
- CPU-Funktionserkennungsemulation
- Thread-lokale Speicherverwaltung
- Signal- und Ausnahmebehandlung
---
## Wie Apple Rosetta 2 in macOS bereitstellt
### Installationsort
Rosetta 2 befindet sich unter:```
/Library/Apple/usr/libexec/oah/
├── rosetta # Main translator binary
├── rosettad # Rosetta daemon
└── librosetta.* # Runtime libraries
Das Verzeichnis oah steht für "Old Architecture Hardware" – eine Fortführung aus der PowerPC-Übergangszeit.
Auf Apple Silicon Macs ist Rosetta 2 standardmäßig nicht installiert. Es wird auf zwei Arten ausgelöst:
| Komponente | Beschreibung |
|---|---|
RosettaLinux/rosetta | ARM64-Binärdatei mit Übersetzungs-Engine |
RosettaLinux/rosettad | System-Daemon zur Verwaltung von Übersetzungsdiensten |
debugserver -> /usr/libexec/rosetta/debugserver | Debugging-Unterstützung für übersetzte Prozesse |
libRosettaRuntime | Laufzeitbibliothek, die während der Übersetzung verlinkt wird |
translate_tool -> /usr/libexec/rosetta/translate_tool | Übersetzungswerkzeug zum Erstellen übersetzter Binärdateien |
┌──────────────────────────────────────────────────────────────────┐ │ Phase 1: Binary Loading │ │ ─────────────────────────────────────────────────────────────── │ │ 1. Load x86_64 Mach-O binary │ │ 2. Parse segments, sections, symbols │ │ 3. Validate code signatures │ │ 4. Map into translation context │ └──────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ Phase 2: AOT Translation │ │ ─────────────────────────────────────────────────────────────── │ │ 1. Disassemble x86_64 code sections │ │ 2. Translate instructions to ARM64 │ │ 3. Apply optimizations │ │ 4. Store in translation cache (~/.oah) │ └──────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ Phase 3: Runtime Execution │ │ ─────────────────────────────────────────────────────────────── │ │ 1. Load translated ARM64 code │ │ 2. Set up x86_64 emulation context │ │ 3. Handle JIT translations for dynamic code │ │ 4. Translate syscalls on-the-fly │ └──────────────────────────────────────────────────────────────────┘
### Wichtige Übersetzungsherausforderungen
1. **Registerzuordnung**
- x86_64 hat 16 GPRs; ARM64 hat 31 GPRs
- x86_64 Flags-Register -> ARM64 NZCV-Flags
- RIP (Instruction Pointer) Emulation
2. **Speicherordnung**
- x86_64: Starke Speicherordnung (TSO)
- ARM64: Schwache Speicherordnung
- Erfordert Speicherbarrieren für Korrektheit