
Обратная разработка 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 не устанавливается по умолчанию. Она запускается двумя способами:
┌──────────────────────────────────────────────────────────────────┐ │ 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 (указателя команд)
2. **Упорядочивание памяти**
- x86_64: Строгое упорядочивание памяти (TSO)
- ARM64: Слабое упорядочивание памяти
- Требуются барьеры памяти для корректности
3. **Векторные инструкции**
- SSE (128-бит) -> NEON (128-бит) прямое отображение
- AVX (256-бит) -> эмуляция парой NEON
- Различная обработка исключений для SIMD
4. **Соглашения о вызовах**
- x86_64: Первые 6 аргументов в регистрах (RDI, RSI, RDX, RCX, R8, R9)
- ARM64: Первые 8 аргументов в регистрах (X0-X7)
- Различные макеты стековых фреймов
---
## Этот проект
Этот репозиторий содержит реализации функций с обратным проектированием из бинарных файлов Rosetta 2. Благодаря тщательному анализу и декомпиляции мы определили и задокументировали семантическое назначение сотен функций.
### Цели
1. **Образовательная**: Понять, как работает Rosetta 2 внутри
2. **Документация**: Создать всестороннюю документацию техник трансляции
3. **Реализация**: Предоставить чистые, хорошо задокументированные реализации на C
4. **Сообщество**: Поделиться знаниями с сообществом специалистов по обратному проектированию
### Что мы сделали
- **828 функций** идентифицированы и названы в основном бинарном файле `rosetta`
- **612 функций** полностью реализованы чистым кодом на C
- **66 категорий** функциональности задокументированы
- Полные отображения имён функций с семантическими названиями
### Категории функций
| Категория | Функций | Описание |
|-----------|---------|----------|
| Точка входа | 1 | Инициализация Rosetta |
| Операции с плавающей точкой/векторами | ~20 | Управление состоянием чисел с плавающей точкой и SIMD |
| Операции SIMD с памятью | ~10 | memchr, memcmp, memcpy с SIMD |
| Векторные операции | ~30 | Векторная арифметика NEON, сравнение |
| Трансляция бинарного кода | ~50 | Трансляция инструкций x86_64 -> ARM64 |
| Обработчики системных вызовов | ~60 | Трансляция и перенаправление системных вызовов |
| Управление памятью | ~20 | Обёртки malloc, free, mmap |
| Хеш-функции | ~5 | Хеширование адресов для кэша трансляции |
| Строковые операции | ~30 | Строковые функции, оптимизированные с помощью SIMD |
| Криптографические расширения | ~30 | Пропуск AES, SHA, CRC32 |
| Разбор ELF | ~15 | Поддержка формата бинарных файлов Linux |
| Кэш трансляции | ~20 | Управление AOT/JIT кэшем |
---
## Структура файлов
### Основные файлы```
Rosetta2/
├── README.md # This file
├── rosetta_decomp.c # Original decompilation (74,677 lines)
├── rosettad_decomp.c # Daemon decompilation (44,064 lines)
├── rosetta_refactored.c # Minimal wrapper (59 lines) - includes modular headers
├── rosetta_refactored.c.legacy # Legacy refactored code (19,302 lines) - archived
├── rosetta_refactored.h # Main header (1,215 lines)
├── rosetta_refactored_complete.c # Single-file implementation (2,686 lines)
├── rosetta_function_map.h # Function name mapping (828 functions)
├── rosettad_refactored.c # Daemon-side refactoring
└── SESSION_*.md # Session logs (30+ sessions)
Инфраструктура перевода полностью модуляризирована на категоризированные компоненты:``` ├── rosetta_types.h # Base type definitions ├── rosetta_x86_decode.h/.c # x86 decoder ├── rosetta_arm64_emit.h/.c # ARM64 emitter ├── rosetta_translate_alu.h/.c # ALU translations ├── rosetta_translate_memory.h/.c # Memory translations ├── rosetta_translate_branch.h/.c # Branch translations ├── rosetta_translate_bit.h/.c # Bit manipulation ├── rosetta_translate_string.h/.c # String operations ├── rosetta_translate_special.h/.c # Special instructions ├── rosetta_translate_block.h/.c # Block translation coordinator ├── rosetta_translate_dispatch.h/.c # Instruction dispatch ├── rosetta_trans_dispatch.h/.c # Main dispatch layer ├── rosetta_trans_alu.h/.c # ALU emulation layer ├── rosetta_trans_mem.h/.c # Memory emulation layer ├── rosetta_trans_branch.h/.c # Branch emulation layer ├── rosetta_trans_bit.h/.c # Bit emulation layer ├── rosetta_trans_string.h/.c # String emulation layer ├── rosetta_trans_special.h/.c # Special instruction emulation ├── rosetta_trans_system.h/.c # System instruction emulation ├── rosetta_trans_neon.h/.c # NEON emulation layer └── Makefile.modular # Modular build system
### Функциональные модули
Основные модули инфраструктуры и поддержки:```
├── rosetta_jit.h/.c # JIT compilation infrastructure
├── rosetta_exec.h/.c # Execution engine (NEW)
├── rosetta_init.h/.c # Initialization & FP registers (NEW)
├── rosetta_codegen.h/.c # Code generation primitives
├── rosetta_cache.h/.c # Translation cache (AOT/JIT)
├── rosetta_transcache.h/.c # Translation cache management
├── rosetta_context.h/.c # CPU context management
├── rosetta_runtime.h/.c # Runtime support
├── rosetta_hash.h/.c # Address hashing
├── rosetta_memmgmt.h/.c # Memory management
├── rosetta_memory_utils.h/.c # Memory utilities
├── rosetta_utils.h/.c # Utility functions
├── rosetta_string_utils.h/.c # String utilities
├── rosetta_trans_helpers.h/.c # Translation helpers
├── rosetta_refactored_helpers.h/.c # Refactoring helpers
└── rosetta_refactored_types.h # Refactored type definitions
Модули SIMD и векторных операций:``` ├── rosetta_simd.h/.c # SIMD operations ├── rosetta_simd_mem.h/.c # SIMD memory operations ├── rosetta_simd_mem_helpers.h/.c # SIMD memory helpers ├── rosetta_vector.h/.c # Vector operations ├── rosetta_refactored_vector.h/.c # Refactored vector ops ├── rosetta_jit_emit.h/.c # JIT emission ├── rosetta_jit_emit_simd.h/.c # SIMD JIT emission ├── rosetta_fp_translate.h/.c # FP translation ├── rosetta_fp_helpers.h/.c # FP helpers ├── rosetta_trans_neon.c # NEON translation └── rosetta_string_simd.c # SIMD string operations
### Модули системных вызовов
Обработка и трансляция гостевых системных вызовов:```
├── rosetta_syscalls.h/.c # Syscall translation core
├── rosetta_syscalls_impl.h/.c # Syscall implementations
└── rosetta_crypto.h/.c # Crypto instructions (AES, SHA, CRC32)
Дополнительные модули перевода и поддержки:``` ├── rosetta_translate.h/.c # Translation core ├── rosetta_translate_alu_impl.h/.c # ALU implementation details ├── rosetta_translate_memory_impl.h/.c # Memory implementation details ├── rosetta_translate_branch_impl.h/.c # Branch implementation details ├── rosetta_translate_special_impl.h/.c # Special implementation details └── rosetta_arm64_insns.h # ARM64 instruction definitions
### Тестовые файлы```
├── test_jit.c # JIT unit tests (737 lines)
└── test_translate.c # Translation tests (1,059 lines)
Всего: 50+ исходных файлов, ~150 000+ строк кода
make -f Makefile.modular all
### Сборка отдельных компонентов```bash
# Compile core modules
gcc -c -I. -std=c11 rosetta_types.h
gcc -c -I. -std=c11 rosetta_codegen.c
gcc -c -I. -std=c11 rosetta_jit.c
gcc -c -I. -std=c11 rosetta_x86_decode.c
gcc -c -I. -std=c11 rosetta_arm64_emit.c
# Compile translation modules
gcc -c -I. -std=c11 rosetta_translate_alu.c
gcc -c -I. -std=c11 rosetta_translate_memory.c
gcc -c -I. -std=c11 rosetta_translate_branch.c
gcc -c -I. -std=c11 rosetta_translate_block.c
gcc -c -I. -std=c11 rosetta_translate_dispatch.c
# Compile support modules
gcc -c -I. -std=c11 rosetta_cache.c
gcc -c -I. -std=c11 rosetta_context.c
gcc -c -I. -std=c11 rosetta_syscalls.c
gcc -c -I. -std=c11 rosetta_runtime.c
make -f Makefile.modular test_jit
make -f Makefile.modular test_translate
### Использование в качестве библиотеки```bash
# Link against the static library
gcc -o my_app my_app.c -L. -lrosetta
# Or compile with source files directly
gcc -I. -o my_app my_app.c rosetta_*.c
Исходный декомпилированный файл rosetta_decomp.c содержит строковые литералы, раскрывающие структуру исходного кода. Эти имена файлов встречаются в сообщениях утверждений/ошибок по всему бинарному файлу.
Примечание: Рефакторизованный код использует другую, более модульную структуру, чем оригинал.
Register.hTaggedPointer.hRedBlackTree.hTransactionalList.hTranslator.hAssemblerBuffer.hBuilderBase.hIrBuilder_x86.hRepatch.cppDecoder.cppFixup.cppAssemblerHelpers.cppOperand.cppOpcode.cppBasicBlock.cppThreadContextFcntl.cppInitStack.cppThread.cppThreadContext.cppThreadContextRuntimeSignals.cppThreadContextVm.cppVMAllocationTracker.cppAssemblerBase.hppTranslatorBase.hppИнфраструктура трансляции полностью модуляризирована на следующие компоненты:
Всего: 40+ модульных компонентов
Этот проект предназначен только для образовательных и исследовательских целей.
Лицензия MIT - Подробности в файле LICENSE.
Приветствуется участие! Области интереса:
Последнее обновление: февраль 2026 года
| Компонент | Описание |
|---|
RosettaLinux/rosetta | Основной ARM64 двоичный файл, содержащий движок трансляции |
RosettaLinux/rosettad | Системный демон, управляющий службами трансляции |
debugserver -> /usr/libexec/rosetta/debugserver | Поддержка отладки для транслированных процессов |
libRosettaRuntime | Библиотека времени выполнения, подключаемая во время трансляции |
translate_tool -> /usr/libexec/rosetta/translate_tool | Инструмент трансляции для создания транслированных двоичных файлов |
Vdso.cppProcMapsParser.cppThreadContextSignals.cppThreadContextSyscalls.cppTranslationCacheAot.cppTranslationCacheJit.cppTranslationCache.cppTranslator.cppRuntimeLibraryBridgeInternal.cppTwoLevelOffsetMap.cppDeltaCodedOffsetMap.cpp| Параметр | Значение |
|---|
| Всего функций | 828 |
| Функций сопоставлено | 828 (100%) |
| Функций реализовано | 600+ |
| Завершение | ~75% |
| Категорий задокументировано | 66 |
| Исходных файлов | 56 C + 65 H |
| Всего строк кода | ~150,000+ |
| Категория модуля | Файлы | Описание |
|---|
| Основные типы | rosetta_types.h | Определения базовых типов |
| Исполнительный движок | rosetta_exec.h/.c | execute_translated, переключение контекста |
| Инициализация | rosetta_init.h/.c | init_translation_env, регистры FP |
| Декодирование x86 | rosetta_x86_decode.h/.c | Декодер инструкций x86_64 |
| Генерация ARM64 | rosetta_arm64_emit.h/.c | Генерация кода ARM64 |
| Генерация кода | rosetta_codegen.h/.c | Примитивы генерации кода |
| Ядро JIT | rosetta_jit.h/.c | Инфраструктура JIT-компиляции |
| Кэш трансляции | rosetta_cache.h/.c, rosetta_transcache.h/.c | Кэширование блоков (AOT/JIT) |
| Трансляция блоков | rosetta_translate_block.h/.c | Трансляция базовых блоков |
| Диспетчеризация инструкций | rosetta_trans_dispatch.h/.c | Диспетчеризация инструкций |
| Трансляция ALU | rosetta_translate_alu.h/.c, rosetta_trans_alu.h/.c | Арифметико-логические операции |
| Трансляция памяти | rosetta_translate_memory.h/.c, rosetta_trans_mem.h/.c | Операции загрузки/сохранения |
| Трансляция ветвлений | rosetta_translate_branch.h/.c, rosetta_trans_branch.h/.c | Управление потоком |
| Трансляция битовых операций | rosetta_translate_bit.h/.c, rosetta_trans_bit.h/.c | Битовые манипуляции |
| Трансляция строк | rosetta_translate_string.h/.c, rosetta_trans_string.h/.c | Строковые операции |
| Трансляция специальных инструкций | rosetta_translate_special.h/.c, rosetta_trans_special.h/.c | Специальные инструкции |
| Трансляция системных инструкций | rosetta_trans_system.h/.c | Системные регистры |
| Трансляция NEON | rosetta_trans_neon.c | Операции SIMD/NEON |
| Операции SIMD | rosetta_simd.h/.c, rosetta_simd_mem.h/.c | Операции SIMD |
| Векторные операции | rosetta_vector.h/.c | Векторные операции |
| Трансляция FP | rosetta_fp_translate.h/.c, rosetta_fp_helpers.h/.c | Плавающая точка |
| Генерация JIT | rosetta_jit_emit.h/.c, rosetta_jit_emit_simd.h/.c | Генерация кода JIT |
| Системные вызовы | rosetta_syscalls.h/.c, rosetta_syscalls_impl.h/.c | Обработка системных вызовов |
| Криптография | rosetta_crypto.h/.c | AES, SHA, CRC32 |
| Контекст | rosetta_context.h/.c | Сохранение/восстановление контекста CPU |
| Среда выполнения | rosetta_runtime.h/.c | Точка входа среды выполнения |
| Управление памятью | rosetta_memmgmt.h/.c | Управление памятью |
| Утилиты | rosetta_utils.h/.c, rosetta_string_utils.h/.c | Вспомогательные функции |
| Категория | Инструкции |
|---|
| ALU | ADD, SUB, AND, OR, XOR, MUL, DIV, INC, DEC, NEG, NOT, SHL, SHR, SAR, ROL, ROR |
| Память | MOV, MOVZX, MOVSX, MOVSXD, LEA, PUSH, POP, CMP, TEST |
| Ветвление | Jcc, JMP, CALL, RET, CMOVcc, SETcc, XCHG |
| Битовые | BSF, BSR, POPCNT, BT, BTS, BTR, BTC |
| Строковые | MOVS, STOS, LODS, CMPS, SCAS |
| Специальные | CPUID, RDTSC, SHLD, SHRD, CWD, CDQ, CQO, CLI, STI, NOP |
| SIMD | SSE, SSE2, SSE3, SSSE3, SSE4.x |
| FP | x87, SSE scalar FP |
| Криптография | AES-NI, SHA, CRC32 |
| Сессия | Фокус | Созданные/изменённые файлы |
|---|
| 61+ | Полная модуляризация | 35+ modular components |
| 61 | Модуляризация трансляции | 6 translation modules + x86_decode enhancements |
| 60 | Инфраструктура трансляции | translate_block() core implementation |
| 59 | Реализация системных вызовов | Additional syscall handlers |
| 58 | Трансляция системных вызовов | I/O vector and network handlers |
| 57 | Управление памятью | VM allocation tracker enhancements |
| 56 | Операции SIMD | Advanced SIMD translations |
| 55 | FP/SIMD | Floating-point instruction translation |
| 54 | Расширения криптографии | AES-NI passthrough implementation |
| 53 | Расширения криптографии | SHA and CRC32 instructions |
| 52 | Строковые операции | SIMD-optimized string functions |
| 51 | Векторные операции | NEON vector arithmetic |
| 50 | Векторные преобразования | Floating-point conversions |
| 49 | Кэш трансляции | AOT/JIT cache management |
| 48 | Ядро JIT | JIT compilation infrastructure |
| 46-47 | Генерация кода | x86_64 code generation helpers |
| 45 | Вспомогательные функции декодирования | ARM64 decode utilities |