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  应用
                 程序的翻译运行.
   109   110   111   112   113   114   115   116   117   118   119