Page 114 - 《软件学报》2024年第6期
P. 114
2690 软件学报 2024 年第 35 卷第 6 期
(2) 根据翻译平台不同分类, 分为同平台翻译和跨平台翻译. 同平台翻译中源平台和目标平台的体系架构相
同, 二者在指令集、存储单元、内存模型等方面差异较小, 模拟实现相对简单. 同平台翻译更多聚焦于代码插桩与
分析、架构向后兼容、新架构特性优化等研究; 跨平台翻译中源平台和目标平台的体系架构不同, 相比同平台翻
译, 跨平台翻译难度显著增加, 翻译过程也更为复杂, 是当前二进制翻译的研究热点.
(3) 根据翻译时机不同分类, 分为解释执行、静态翻译、动态翻译、动静结合. 解释执行作为最简单的翻译方
法, 以单条指令为单位将源程序指令逐条实时解释执行, 无需控制器频繁做控制流的切换. 解释执行不保存已解释
的指令, 也不开展代码优化, 执行效率通常要比本地原生执行慢 10–100 倍 [10] . 当前先进的翻译系统中, 完全基于
解释执行设计的二进制翻译系统较为少见; 静态翻译将指令翻译与代码执行过程分离, 以输入的源程序为单位, 离
线完成指令翻译并充分优化生成的代码, 执行效率较高. 然而, 静态翻译无法提前获知程序完备控制流信息, 面临
着一些技术挑战, 例如翻译代码运行时对代码挖掘、代码重定位等问题处理不足, 这也使得静态翻译在使用场景
上受限, 其在嵌入式应用中使用较多, 并且通常与解释执行联合使用 [2,7,11] ; 动态翻译采取边翻译边执行的即时编译
策略, 以基本块或者函数体为单位开展翻译和执行, 当遇到未翻译代码时控制流再切换至翻译器进行翻译. 动态翻
译弥补了静态翻译无法获取完备控制流信息的不足. 同时, 动态翻译还引入了代码优化和代码缓存, 相比解释执行
DQEMU
在执行效率有所提升. 但是动态翻译面临着翻译开销大、代码优化不充分、控制流切换频繁等挑战. 动态翻译是
当前主流的二进制翻译方法和研究热点 [5,12−15] ; 动静结合将动态翻译和静态翻译充分结合, 基于静态翻译尽可能地
预先离线翻译代码并缓存, 然后在执行预先翻译代码时, 如果遇到间接跳转等不确定情况再采用动态翻译进行补
充翻译, 动静结合内容将在第 4.1 节进一步介绍.
1.3 典型二进制翻译系统
FX!32 是 [1] Digital 公司开发的动静结合的二进制翻译系统, 实现了 Win32/x86 应用在 Windows NT/Alpha 平
台上的高效运行. FX!32 基于“剖析-优化”的翻译策略, 首次将环境模拟、运行时信息生成和二进制翻译结合到一起.
BOA 是 [7] IBM 公司开发的动态二进制翻译系统. 为了兼容已有的 PowerPC 体系结构, BOA 将 PowerPC 指令
转换为简单的 VLIW 操作原语, 通过解释执行探测热路径代码并获得运行时信息来指导动态优化.
Aries 是 [2] HP 公司开发的动态二进制翻译系统. Aries 使用解释器模拟执行源程序来发掘热路径代码, 然后利
用动态二进制翻译器翻译并优化热代码, 最后缓存翻译生成代码. Aries 实现了 PA-RSIC 与 IA-64 之间的浮点寄存
器映射, 避免了大量潜在的寄存器存取操作.
Valgrind [16] 作为同平台运行的二进制翻译与二进制插桩工具, 采用“反汇编-再合成”的方式将二进制变换为
VEX IR 中间代码. Valgrind 基于影子内存映射的代码插桩与分析方法, 在内存泄漏、程序分析、性能优化等方面
发挥着重要作用.
QEMU [13] 作为当前最为流行的多平台开源翻译框架, 具有良好平台可扩展性, 同时支持系统级和用户级翻译.
QEMU 为了兼容多目标机和多宿主机, 并未充分利用宿主机体系结构特征. 未经优化的 QEMU 的翻译效率通常只
有本地原生编译执行的 10% 左右 [17] . 近年来, 针对 QEMU 涌现出大量研究, 例如寄存器分配优化 [18] 、中间代码优
化 [18] 、虚实地址转换优化 [19] 、基本块链接优化 [20] 、缓存管理 [21] 、多线程优化 [20,22] 、分支跳转优化 [23] 、向量
[20]
优化 [24,25] 、Helper 函数优化 [20,26,27] 等. 同时衍生出大量工具, 例如基于 LLVM 优化加速的多线程翻译器 HQEMU 、
缓存独占的并行全系统模拟器 COREMU [28] 、缓存共享的并行全系统模拟器 PQEMU [29] 、符号执行与二进制翻译
融合的 SymQEMU [30] 、基于分布式框架的 [31] 、兼容 Pin [32] 的二进制插桩工具 PEMU [33] 、面向程序并行
优化的 LLPEMU [34] 、动态二进制分析工具 PANDA [35] 等.
CrossBit [36] 是上海交通大学实现的多源多目标翻译系统, 支持 MIPS、x86、Sparc 平台的应用到 Power、x86、
Sparc 平台上翻译运行. CrossBit 采用 Vlnst 低层次虚拟精简指令集作为中间表示层以完成代码转换和优化. 然而,
CrossBit 对异常处理的支持存在不足.
Tango [37] 实现了从 ARM32 应用到 ARM64 的翻译, 由动态翻译器、预翻译器、执行环境这 3 部分组成.
Tango 充分利用了代码缓存和多线程机制, 完整支持 ARM、VFP 和 NEON 指令集, 并且支持数千个 Android 应用
程序的翻译运行.