
AIを活用したRosetta (2 for Linux)のリバースエンジニアリング。免責事項: ユーザー契約により、コードには触れません。すべてAIが行うため、実装が乱雑になる可能性があります。
AppleのRosetta 2バイナリ変換技術を理解し文書化するための包括的なリバースエンジニアリングプロジェクト。
2020年11月、Appleは初のApple Silicon Macを発表し、Intel x86_64プロセッサから自社開発のARMベースM1チップへの歴史的な移行を開始しました。これはAppleにとって3度目の主要なアーキテクチャ移行でした:
それぞれの移行では、移行期間中に既存のソフトウェアを実行するためのバイナリ変換ソリューションが必要でした。Rosetta 2は、Appleがこれまでに開発した中で最も高度なバイナリ変換システムです。
Rosetta (2006-2011) は、PowerPCアプリケーションをIntelベースのMacで動作させるApple初の動的バイナリ変換ソフトウェアでした。
RosettaはMac OS X 10.7 (Lion)で削除され、Intelへの移行が完了しました。
Rosetta 2 は、Intel x86_64 Mac向けにコンパイルされたアプリケーションをApple Silicon (ARM64) Macで動作させるAppleの先進的な動的バイナリ変換技術です。
┌─────────────────────────────────────────────────────────────┐ │ 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. **システムコール変換**
- x86_64 macOS のシステムコールをARM64相当に変換
- 異なる呼び出し規約に対応
- システムコール境界をまたぐレジスタ状態の管理
5. **ランタイムサポート**
- CPU機能検出のエミュレーション
- スレッドローカルストレージの処理
- シグナルおよび例外処理
---
## AppleがRosetta 2をmacOSに提供する方法
### インストール場所
Rosetta 2は次の場所にあります:```
/Library/Apple/usr/libexec/oah/
├── rosetta # Main translator binary
├── rosettad # Rosetta daemon
└── librosetta.* # Runtime libraries
oahディレクトリは「Old Architecture Hardware」の略称で、PowerPC移行期からの継続です。
Apple Silicon搭載のMacでは、Rosetta 2はデフォルトではインストールされません。以下の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のフラグレジスタ -> ARM64のNZCVフラグ
- 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. **コミュニティ**: リバースエンジニアリングコミュニティと知識を共有する
### 達成したこと
- メインの`rosetta`バイナリで**828個の関数**を識別し命名
- **612個の関数**をクリーンなCコードで完全実装
- **66のカテゴリ**の機能を文書化
- 意味的な名前との完全な関数名マッピング
### 関数のカテゴリ
| カテゴリ | 関数数 | 説明 |
|----------|--------|------|
| Entry Point | 1 | Rosettaの初期化 |
| FP/Vector Operations | ~20 | 浮動小数点およびSIMD状態管理 |
| SIMD Memory Operations | ~10 | SIMDを使用したmemchr、memcmp、memcpy |
| Vector Operations | ~30 | NEONベクトル演算、比較 |
| Binary Translation | ~50 | x86_64 -> ARM64命令変換 |
| Syscall Handlers | ~60 | システムコール変換と転送 |
| Memory Management | ~20 | malloc、free、mmapラッパー |
| Hash Functions | ~5 | 変換キャッシュ用アドレスハッシュ |
| String Operations | ~30 | SIMD最適化された文字列関数 |
| Cryptographic Extensions | ~30 | AES、SHA、CRC32パススルー |
| ELF Parsing | ~15 | Linuxバイナリ形式サポート |
| Translation Cache | ~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年2月
| コンポーネント | 説明 |
|---|
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以上のモジュールコンポーネント |
| 61 | 翻訳のモジュール化 | 6つの翻訳モジュール + x86_decodeの拡張 |
| 60 | 翻訳インフラストラクチャ | translate_block() コア実装 |
| 59 | システムコール実装 | 追加のシステムコールハンドラ |
| 58 | システムコール変換 | I/Oベクタおよびネットワークハンドラ |
| 57 | メモリ管理 | VM割り当てトラッカーの拡張 |
| 56 | SIMD操作 | 高度なSIMD変換 |
| 55 | FP/SIMD | 浮動小数点命令変換 |
| 54 | 暗号拡張 | AES-NIパススルー実装 |
| 53 | 暗号拡張 | SHAおよびCRC32命令 |
| 52 | 文字列操作 | SIMD最適化文字列関数 |
| 51 | ベクトル操作 | NEONベクトル演算 |
| 50 | ベクトル変換 | 浮動小数点変換 |
| 49 | 変換キャッシュ | AOT/JITキャッシュ管理 |
| 48 | JITコア | JITコンパイルインフラストラクチャ |
| 46-47 | コード生成 | x86_64コード生成ヘルパー |
| 45 | デコードヘルパー | ARM64デコードユーティリティ |