
Обратная разработка Rosetta (2 для Linux) с помощью ИИ. Отказ от ответственности: из-за пользовательского соглашения я не буду трогать код. Всё делается ИИ, поэтому реализация может быть запутанной.
Всестороннее исследование обратной разработки для понимания и документирования технологии двоичной трансляции Rosetta 2 от Apple.
В ноябре 2020 года Apple анонсировала первые Mac на Apple Silicon, ознаменовав исторический переход от процессоров Intel x86_64 к собственным чипам M1 на базе ARM. Это был третий крупный архитектурный переход Apple:
Каждый переход требовал решения для двоичной трансляции, чтобы запускать существующее программное обеспечение в период миграции. Rosetta 2 — самая совершенная на сегодняшний день система двоичной трансляции от Apple.
Rosetta (2006–2011) была первой динамической программой двоичной трансляции Apple, позволявшая запускать приложения PowerPC на Mac на базе Intel.
Rosetta была удалена в Mac OS X 10.7 (Lion), завершив переход на Intel.
Rosetta 2 — это передовая технология динамической двоичной трансляции Apple, которая позволяет приложениям, скомпилированным для Intel x86_64 Mac, работать на Apple Silicon (ARM64) Mac.
┌─────────────────────────────────────────────────────────────┐ │ User Application (x86_64) │ ├─────────────────────────────────────────────────────────────┤ │ Rosetta 2 Layer │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Translator │ │ Runtime │ │ System Call │ │ │ │ (AOT/JIT) │ │ Library │ │ Translation │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ macOS Kernel (ARM64) │ ├─────────────────────────────────────────────────────────────┤ │ Apple Silicon Hardware │ └─────────────────────────────────────────────────────────────┘
### Ключевые технологии
1. **Трансляция с опережением (AOT)**
- Переводит x86_64 бинарные файлы в ARM64 во время установки
- Сохраняет переведенный код в кеше для более быстрого последующего запуска
- Снижает накладные расходы во время выполнения по сравнению с чисто JIT-трансляцией
2. **Трансляция "на лету" (JIT)**
- Переводит блоки кода по запросу во время выполнения
- Обрабатывает динамически загружаемый код и самомодифицирующийся код
- Поддерживает кеш трансляции для эффективности
3. **Трансляция системы команд**
- Отображение инструкций x86_64 на ARM64
- Трансляция векторных инструкций SSE/AVX в NEON
- Флаги x86_64 в коды условий ARM64
4. **Трансляция системных вызовов**
- Переводит системные вызовы macOS x86_64 в эквиваленты ARM64
- Обрабатывает различные соглашения о вызовах
- Управляет состоянием регистров на границах системных вызовов
5. **Поддержка времени выполнения**
- Эмуляция обнаружения возможностей процессора
- Обработка локального хранилища потоков
- Обработка сигналов и исключений
---
## Как Apple предоставляет Rosetta 2 в macOS
### Местоположение установки
Rosetta 2 находится по адресу:```
/Library/Apple/usr/libexec/oah/
├── rosetta # Main translator binary
├── rosettad # Rosetta daemon
└── librosetta.* # Runtime libraries
Каталог oah расшифровывается как «Оборудование старой архитектуры» — наследие эпохи переходного периода с PowerPC.
На Mac с процессором Apple Silicon Rosetta 2 не устанавливается по умолчанию. Она запускается двумя способами:
| Компонент | Описание |
|---|---|
RosettaLinux/rosetta | Основной ARM64 двоичный файл, содержащий движок трансляции |
RosettaLinux/rosettad | Системный демон, управляющий службами трансляции |
debugserver -> /usr/libexec/rosetta/debugserver | Поддержка отладки для транслированных процессов |
libRosettaRuntime | Библиотека времени выполнения, подключаемая во время трансляции |
translate_tool -> /usr/libexec/rosetta/translate_tool | Инструмент трансляции для создания транслированных двоичных файлов |
┌──────────────────────────────────────────────────────────────────┐ │ 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 │ └──────────────────────────────────────────────────────────────────┘
### Ключевые проблемы трансляции
1. **Сопоставление регистров**
- x86_64 имеет 16 GPR; ARM64 — 31 GPR
- Регистр флагов x86_64 -> флаги NZCV ARM64
- Эмуляция RIP (указателя команд)