
Engenharia reversa alimentada por IA da Rosetta (2 para Linux). Aviso: devido ao acordo do usuário, não tocarei no código. Tudo é feito por IA, então pode haver implementação bagunçada.
Um esforço abrangente de engenharia reversa para entender e documentar a tecnologia de tradução binária Rosetta 2 da Apple.
Em novembro de 2020, a Apple anunciou seus primeiros Macs com Apple Silicon, marcando uma transição histórica dos processadores Intel x86_64 para seus próprios chips M1 baseados em ARM. Esta foi a terceira grande transição de arquitetura da Apple:
Cada transição exigiu uma solução de tradução binária para executar o software existente durante o período de migração. O Rosetta 2 é o sistema de tradução binária mais sofisticado da Apple até agora.
Rosetta (2006-2011) foi o primeiro software de tradução binária dinâmica da Apple, permitindo que aplicativos PowerPC rodassem em Macs baseados em Intel.
O Rosetta foi removido no Mac OS X 10.7 (Lion), completando a transição para Intel.
Rosetta 2 é a tecnologia avançada de tradução binária dinâmica da Apple que permite que aplicativos compilados para Intel x86_64 em Macs rodem em Macs Apple Silicon (ARM64).
┌─────────────────────────────────────────────────────────────┐ │ User Application (x86_64) │ ├─────────────────────────────────────────────────────────────┤ │ Rosetta 2 Layer │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Translator │ │ Runtime │ │ System Call │ │ │ │ (AOT/JIT) │ │ Library │ │ Translation │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ macOS Kernel (ARM64) │ ├─────────────────────────────────────────────────────────────┤ │ Apple Silicon Hardware │ └─────────────────────────────────────────────────────────────┘
### Tecnologias Chave
1. **Tradução Antecipada (AOT)**
- Traduz binários x86_64 para ARM64 no momento da instalação
- Armazena código traduzido em um cache para inicializações subsequentes mais rápidas
- Reduz a sobrecarga em tempo de execução em comparação com a tradução JIT pura
2. **Tradução Just-in-Time (JIT)**
- Traduz blocos de código sob demanda durante a execução
- Lida com código carregado dinamicamente e código automodificável
- Mantém cache de tradução para eficiência
3. **Tradução de Conjunto de Instruções**
- Mapeamento de instruções x86_64 -> ARM64
- Tradução de instruções vetoriais SSE/AVX -> NEON
- Flags x86_64 -> Códigos de condição ARM64
4. **Tradução de Chamadas de Sistema**
- Traduz chamadas de sistema x86_64 do macOS para equivalentes ARM64
- Lida com diferentes convenções de chamada
- Gerencia o estado dos registradores entre limites de chamadas de sistema
5. **Suporte em Tempo de Execução**
- Emulação de detecção de recursos da CPU
- Manipulação de armazenamento local de thread
- Manipulação de sinais e exceções
---
## Como a Apple entrega o Rosetta 2 no macOS
### Local de Instalação
Rosetta 2 está localizado em:```
/Library/Apple/usr/libexec/oah/
├── rosetta # Main translator binary
├── rosettad # Rosetta daemon
└── librosetta.* # Runtime libraries
O diretório oah significa "Hardware de Arquitetura Antiga" - uma continuação da era de transição PowerPC.
Em Macs com Apple Silicon, o Rosetta 2 não é instalado por padrão. Ele é ativado de duas maneiras:
| Componente | Descrição |
|---|---|
RosettaLinux/rosetta | Binário ARM64 principal contendo o motor de tradução |
RosettaLinux/rosettad | Daemon do sistema que gerencia serviços de tradução |
debugserver -> /usr/libexec/rosetta/debugserver | Suporte de depuração para processos traduzidos |
libRosettaRuntime | Biblioteca de tempo de execução vinculada durante a tradução |
translate_tool -> /usr/libexec/rosetta/translate_tool | Ferramenta de tradução para construir binários traduzidos |
┌──────────────────────────────────────────────────────────────────┐ │ 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 │ └──────────────────────────────────────────────────────────────────┘
### Desafios Principais de Tradução
1. **Mapeamento de Registradores**
- x86_64 possui 16 GPRs; ARM64 possui 31 GPRs
- Registrador de flags do x86_64 -> Flags NZCV do ARM64
- Emulação de RIP (ponteiro de instrução)