
Ingeniería inversa impulsada por IA de Rosetta (2 para Linux). Descargo de responsabilidad: debido al acuerdo de usuario, no tocaré el código. Todo lo hace la IA, por lo que podría haber una implementación desordenada.
Un esfuerzo exhaustivo de ingeniería inversa para comprender y documentar la tecnología de traducción binaria Rosetta 2 de Apple.
En noviembre de 2020, Apple anunció sus primeras Mac con Apple Silicon, marcando una transición histórica de los procesadores Intel x86_64 a sus propios chips M1 basados en ARM. Esta fue la tercera gran transición de arquitectura de Apple:
Cada transición requirió una solución de traducción binaria para ejecutar el software existente durante el período de migración. Rosetta 2 es el sistema de traducción binaria más sofisticado de Apple hasta ahora.
Rosetta (2006-2011) fue el primer software de traducción binaria dinámica de Apple, que permitía ejecutar aplicaciones PowerPC en Mac basadas en Intel.
Rosetta se eliminó en Mac OS X 10.7 (Lion), completando la transición a Intel.
Rosetta 2 es la tecnología avanzada de traducción binaria dinámica de Apple que permite que las aplicaciones compiladas para Macs Intel x86_64 se ejecuten en Macs 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 │ └─────────────────────────────────────────────────────────────┘
### Tecnologías Clave
1. **Traducción Anticipada (AOT)**
- Traduce binarios x86_64 a ARM64 durante la instalación
- Almacena el código traducido en una caché para lanzamientos posteriores más rápidos
- Reduce la sobrecarga en tiempo de ejecución en comparación con la traducción JIT pura
2. **Traducción Justo a Tiempo (JIT)**
- Traduce bloques de código bajo demanda durante la ejecución
- Maneja código cargado dinámicamente y código automodificable
- Mantiene una caché de traducción para mayor eficiencia
3. **Traducción del Conjunto de Instrucciones**
- Mapeo de instrucciones de x86_64 a ARM64
- Traducción de instrucciones vectoriales SSE/AVX a NEON
- Banderas de x86_64 a códigos de condición de ARM64
4. **Traducción de Llamadas al Sistema**
- Traduce las syscalls de macOS x86_64 a sus equivalentes ARM64
- Maneja diferentes convenciones de llamada
- Gestiona el estado de los registros a través de los límites de las syscalls
5. **Soporte en Tiempo de Ejecución**
- Emulación de detección de características de la CPU
- Manejo de almacenamiento local de hilos
- Manejo de señales y excepciones
---
## Cómo Apple entrega Rosetta 2 en macOS
### Ubicación de Instalación
Rosetta 2 se encuentra en:```
/Library/Apple/usr/libexec/oah/
├── rosetta # Main translator binary
├── rosettad # Rosetta daemon
└── librosetta.* # Runtime libraries
El directorio oah significa "Old Architecture Hardware" - una continuación de la era de transición de PowerPC.
En las Mac con Apple Silicon, Rosetta 2 no está instalado de forma predeterminada. Se activa de dos maneras:
| Componente | Descripción |
|---|---|
RosettaLinux/rosetta | Binario ARM64 principal que contiene el motor de traducción |
RosettaLinux/rosettad | Demonio del sistema que gestiona los servicios de traducción |
debugserver -> /usr/libexec/rosetta/debugserver | Soporte de depuración para procesos traducidos |
libRosettaRuntime | Biblioteca de tiempo de ejecución enlazada durante la traducción |
translate_tool -> /usr/libexec/rosetta/translate_tool | Herramienta de traducción para construir binarios traducidos |
┌──────────────────────────────────────────────────────────────────┐ │ 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 │ └──────────────────────────────────────────────────────────────────┘
### Desafíos Clave de Traducción