
Reverse engineering potenziato dall'IA di Rosetta (2 per Linux). Dichiarazione di non responsabilità: a causa dell'accordo con l'utente, non toccherò il codice. Tutto è fatto dall'IA, quindi potrebbe esserci un'implementazione disordinata.
Un approfondito sforzo di reverse engineering per comprendere e documentare la tecnologia di traduzione binaria Rosetta 2 di Apple.
A novembre 2020, Apple ha annunciato i primi Mac con Apple Silicon, segnando una transizione storica dai processori Intel x86_64 ai propri chip M1 basati su ARM. È stata la terza importante transizione di architettura di Apple:
Ogni transizione ha richiesto una soluzione di traduzione binaria per eseguire il software esistente durante il periodo di migrazione. Rosetta 2 è il sistema di traduzione binaria più sofisticato di Apple finora.
Rosetta (2006-2011) è stato il primo software di traduzione binaria dinamica di Apple, che consentiva alle applicazioni PowerPC di funzionare sui Mac basati su Intel.
Rosetta è stato rimosso in Mac OS X 10.7 (Lion), completando la transizione Intel.
Rosetta 2 è la tecnologia avanzata di traduzione binaria dinamica di Apple che consente alle applicazioni compilate per Intel x86_64 Mac di funzionare su Mac con Apple Silicon (ARM64).
┌─────────────────────────────────────────────────────────────┐ │ User Application (x86_64) │ ├─────────────────────────────────────────────────────────────┤ │ Rosetta 2 Layer │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Translator │ │ Runtime │ │ System Call │ │ │ │ (AOT/JIT) │ │ Library │ │ Translation │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ macOS Kernel (ARM64) │ ├─────────────────────────────────────────────────────────────┤ │ Apple Silicon Hardware │ └─────────────────────────────────────────────────────────────┘
### Tecnologie Chiave
1. **Traduzione Ahead-of-Time (AOT)**
- Traduce i binari x86_64 in ARM64 al momento dell'installazione
- Memorizza il codice tradotto in una cache per avvii successivi più rapidi
- Riduce il sovraccarico di runtime rispetto alla traduzione JIT pura
2. **Traduzione Just-in-Time (JIT)**
- Traduce blocchi di codice su richiesta durante l'esecuzione
- Gestisce codice caricato dinamicamente e codice auto-modificante
- Mantiene una cache di traduzione per l'efficienza
3. **Traduzione del Set di Istruzioni**
- Mapping delle istruzioni x86_64 -> ARM64
- Traduzione delle istruzioni vettoriali SSE/AVX -> NEON
- Flag x86_64 -> codici di condizione ARM64
4. **Traduzione delle Chiamate di Sistema**
- Traduce le syscall di macOS x86_64 in equivalenti ARM64
- Gestisce diverse convenzioni di chiamata
- Gestisce lo stato dei registri attraverso i confini delle syscall
5. **Supporto Runtime**
- Emulazione del rilevamento delle funzionalità della CPU
- Gestione della memoria locale del thread
- Gestione dei segnali e delle eccezioni
---
## Come Apple Distribuisce Rosetta 2 in macOS
### Posizione di Installazione
Rosetta 2 si trova in:```
/Library/Apple/usr/libexec/oah/
├── rosetta # Main translator binary
├── rosettad # Rosetta daemon
└── librosetta.* # Runtime libraries
oah sta per "Old Architecture Hardware" - una continuazione dell'era di transizione PowerPC.
Su Mac con Apple Silicon, Rosetta 2 non è installato per impostazione predefinita. Viene attivato in due modi:
| Componente | Descrizione |
|---|---|
RosettaLinux/rosetta | Binario ARM64 principale contenente il motore di traduzione |
RosettaLinux/rosettad | Demone di sistema che gestisce i servizi di traduzione |
debugserver -> /usr/libexec/rosetta/debugserver | Supporto per il debug dei processi tradotti |
libRosettaRuntime | Libreria runtime collegata durante la traduzione |
translate_tool -> /usr/libexec/rosetta/translate_tool | Strumento di traduzione per creare binari tradotti |
┌──────────────────────────────────────────────────────────────────┐ │ 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 │ └──────────────────────────────────────────────────────────────────┘
### Sfide chiave della traduzione
1. **Mappatura dei registri**
- x86_64 ha 16 GPR; ARM64 ha 31 GPR
- Registro flag x86_64 -> flag NZCV di ARM64
- Emulazione di RIP (instruction pointer)