一项全面的逆向工程,旨在理解和记录苹果的 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 默认并未安装。它通过两种方式触发:
| 组件 | 描述 |
|---|---|
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 个通用寄存器;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)