Page 125 - 《软件学报》2024年第6期
P. 125

谢汶兵 等: 二进制翻译技术综述                                                                2701


                 销. (2) 不同硬件平台存在差异, 为实现指令等价翻译和机器状态正确模拟, 二进制翻译时会引入大量冗余操作.
                 (3) 基于虚拟环境模拟的方法, 二进制翻译涉及缓存代码管理、分支跳转地址计算、控制流切换等运行时开销.
                 (4) 翻译过程需精准维护源程序逻辑, 目标平台处理器硬件资源的利用会受到源程序特征的影响. 如目标平台在多
                 核资源的利用上不能改变源程序设置的最大处理器核数.
                    为了提升翻译效率, 当前已有大量优化研究工作. 例如降低翻译开销的动静结合                         [55,133,134] 、多线程优化  [15,36,62] ;
                 减少运行时维护开销的分支查找优化             [23,27,135] 、热路径生成  [20,136,137] ; 提升目标代码生成质量的中间代码优化  [137,138] 、
                 指令并行化    [135,139−141] 、寄存器映射  [53,82,135,142,143] ; 缩小源平台和目标平台体系结构差异的软硬协同设计    [10,144] 高级
                 优化. 相关优化工作将在第        4  节做进一步介绍.

                 3.8   小 结
                    本节梳理了当前二进制翻译技术面临的核心关键问题, 包括存储单元模拟、原子指令时序特征维护、异常和
                 中断处理、内存一致性保证、代码挖掘、等价性验证、翻译效率提升等. 此外, 全系统翻译还需要完成系统指令
                 和特权级的正确模拟, 但是该部分隶属于虚拟化技术范畴, 本文不做重点讨论.
                    总结发现, 当前研究针对关键问题成果显著, 均提供了行之有效的解决策略. 但是已有研究主要聚焦于特定架
                 构或应用场景暴露出来的问题, 一些潜在的研究方向仍有待进一步探索, 例如基于形式化证明二进制翻译的功能
                 等价性等.

                 4   二进制翻译技术性能优化

                    翻译效率的高低作为制约二进制翻译技术发展的关键因素, 直接决定着二进制翻译系统的实用性. 然而, 基于
                 虚拟环境模拟的二进制翻译技术的本质决定了其在翻译效率上很难达到本地原生运行效果. 为保证不同平台之间
                 软件的平滑迁移和运行, 持续开展二进制翻译的性能优化始终是业界的研究热点.

                 4.1   翻译开销优化
                    一款好的二进制翻译系统应该既能精确模拟程序行为, 又能生成接近或者超过本地原生编译质量的目标代
                 码, 同时还要避免翻译系统自身带来的性能开销.                 等人

                 4.1.1    动静结合翻译优化
                    静态翻译效率较高, 但在间接跳转、代码自修改、代码自生成等情况处理上存在不足, 在实际应用时受到诸
                 多限制. 动态翻译虽然能够解决静态翻译存在的不足, 在实际应用中适用性更强, 但是有着翻译开销大和代码优化
                 不充分等不足, 翻译效率较低. 将静态翻译和动态翻译相结合的动静结合翻译, 既准确获取程序的运行时信息保证
                 翻译的完整性, 又可以降低翻译开销. 动静结合的设计方法已被成熟的翻译系统普遍使用. 总结起来, 动静结合的
                 翻译方法有静态为主动态为辅和动态为主静态为辅两种形式.
                    静态为主动态为辅是以静态翻译框架为主体, 结合动态翻译器提供的运行时信息, 解决了静态翻译对程序运
                                                                     [5]
                 行时信息无法获知的难题, 又有效避免了翻译开销的引入. Rosetta 2 引入                 AOT  和  JIT  技术实现动静结合翻译, 预
                 先翻译对性能潜在影响较大的代码, 并将预先翻译代码以映像文件的形式写入存储空间. 对于参数未知或者需要
                 运行时解析的场景, 则使用        JIT  实时翻译执行. Shen      [134] 利用静态翻译尽可能提前翻译应用程序, 然后在执行
                 预先翻译代码时, 如果遇到间接跳转等不确定情况再调用动态翻译进行补充翻译. 实验表明该方法相比完全使用
                 动态翻译性能平均提升        8  倍. 文献  [145] 提出基于  LLVM IR  的  Rabbit 动静结合翻译框架, 相比文献    [134] 在静态
                 翻译的分支跳转方面有所突破. Rabbit 基于解释执行非热点函数, 并缓存解释执行的指令信息供再次执行时复用.
                 Sun  等人  [146] 针对静态翻译中间接跳转无法提前获知的问题, 提出一种基于分支预测的动静结合二进制翻译框架
                 BP-QEMU. BP-QEMU  首先基于静态翻译预先翻译二进制程序, 在翻译过程中过滤分支跳转代码模块并进行跳转
                 目标预测. 然后使用动态翻译处理静态翻译阶段未处理的翻译块, 并确认静态翻译预测的跳转目标地址的正确性.
                 相比于   Rabbit, BP-QEMU  利用静态翻译对代码预先翻译方面有更大的突破.
                    动态为主静态为辅是以动态翻译框架为主体, 利用静态翻译充分离线优化翻译后代码, 解决了动态翻译开销
   120   121   122   123   124   125   126   127   128   129   130