
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つの方法で起動されます:
| コンポーネント | 説明 |
|---|---|
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のフラグレジスタ -> 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キャッシュ管理 |
---
## ファイル構造