一项全面的逆向工程,旨在理解和记录苹果的 Rosetta 2 二进制翻译技术。
2020年11月,苹果发布了首批 Apple Silicon Mac,标志着从 Intel x86_64 处理器到自研 ARM M1 芯片的历史性转型。这是苹果的第三次重大架构转型:
每一次转型都需要一套二进制翻译方案,以便在迁移期间运行现有软件。Rosetta 2 是苹果迄今为止最先进的二进制翻译系统。
Rosetta (2006-2011) 是苹果首个动态二进制翻译软件,使得 PowerPC 应用能够在基于 Intel 的 Mac 上运行。
Rosetta 在 Mac OS X 10.7 (Lion) 中被移除,标志着 Intel 转型的完成。
Rosetta 2 是苹果先进的动态二进制翻译技术,使得为 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. **系统调用翻译**
- 将 x86_64 macOS 系统调用转换为等效的 ARM64 系统调用
- 处理不同的调用约定
- 管理系统调用边界上的寄存器状态
5. **运行时支持**
- CPU 特性检测模拟
- 线程本地存储处理
- 信号与异常处理
---
## Apple 如何在 macOS 中提供 Rosetta 2
### 安装位置
Rosetta 2 位于:```
/Library/Apple/usr/libexec/oah/
├── rosetta # Main translator binary
├── rosettad # Rosetta daemon
└── librosetta.* # Runtime libraries
oah 目录代表“旧架构硬件”——这是从 PowerPC 过渡时代的延续。
在 Apple Silicon Mac 上,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 个通用寄存器;ARM64 有 31 个通用寄存器
- 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. **社区**:与逆向工程社区分享知识
### 我们的成就
- **828 个函数** 已在主要的 `rosetta` 二进制文件中识别并命名
- **612 个函数** 已用清晰的 C 代码完整实现
- **66 个类别** 的功能已记录
- 包含语义名称的完整函数名映射
### 函数类别
| 类别 | 函数数 | 描述 |
|----------|-----------|-------------|
| 入口点 | 1 | Rosetta 初始化 |
| 浮点/向量操作 | ~20 | 浮点和 SIMD 状态管理 |
| SIMD 内存操作 | ~10 | 使用 SIMD 的 memchr, memcmp, memcpy |
| 向量操作 | ~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 和 vector 操作模块:``` ├── 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 标量 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 解码工具 |