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

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


                 的代码在    x86  架构上执行时不允许出现        a=1, b=0  的输出结果, 但是该代码经过       LLVM IR  中间变换后, 最终在
                 ARM  架构上执行可能出现       a=1, b=0  的输出结果, 主要原因是    LLVM IR  缺少对并发推理的支持.

                                 X=1 a=Y  mctool  X NA=1 a=Y NA  opt  Y NA=1 a=Y NA  codegen  Y=1 a=Y
                                Y=1 b=X        Y NA=1 b=X NA     X NA=1 b=X NA     X=1 b=X
                                 (a) x86     (b) 未优化 LLVM IR    (c) 优化 LLVM IR      (d) ARM
                                           图 5 基于   LLVM IR  实现  x86-to-ARM  翻译

                 2.3   规则匹配的指令映射翻译
                    无论是定制化中间表示的指令翻译还是利用编译器框架辅助的指令翻译, 二者均依赖于                             IR  中间表示. 这些方
                 法在中间转换过程中损失了大量的程序语义, 生成代码膨胀率高. 例如, 基于                       VEX IR  的代码翻译后膨胀率达       10
                 倍以上  [79] . 随着机器学习技术的不断发展, 有研究将机器学习引入到指令翻译中, 提出基于规则匹配的指令映射
                 翻译方法, 避免引入中间       IR  转换. 将指令翻译变为规则训练、规则学习和规则映射的“训练-学习-生成”过程                      [80,81] .
                 图  6(a) 为基于规则匹配的指令映射方法的翻译流程, 将源平台指令与预先形成的翻译规则库进行匹配, 找到对应
                 的目标平台指令完成指令映射. 图           6(b) 为基于规则匹配映射方法的示例, 在该示例中通过匹配规则                  1  和规则  2  实
                 现  ARM64  加法与减法指令到     x86-64  平台的等价翻译.

                                                              源平台(ARM64)          add      x1, x1, x0  ARM64
                                指令                            add reg0,reg0,reg1  sub      x1, x1, #1  指令序列
                     源平台        映射       目标平台           规则 1  目标平台(x86-64)
                      指令                  指令                  addq reg1,reg0
                                                                                        翻译
                                翻译                            源平台(ARM64)
                               规则库                            sub  reg0,reg0,#imm0
                                                        规则 2
                                                             目标平台(x86-64)         addq %rax, %rdx  x86-64
                                                              subq $imm0,reg0     subq $1, %rdx  指令序列
                     (a) 基于规则匹配的指令映射翻译流程                       (b) 基于规则匹配的指令映射翻译示例
                                              图 6 基于规则匹配的指令映射翻译
                   保证指令集覆盖率持续提升, 这也是基于规则匹配方法进行指令翻译面临的一个难点问题. Jiang
                    在翻译规则库的形成上, Bansal 等人        [82] 首次将编译器超级窥孔优化技术        [83] 引入到二进制翻译的规则生成. 与
                 常规编译器优化不同, 在学习阶段, Bansal 等人为源平台和目标平台指令序列构造一个等价翻译规则, 之后将生成
                 规则提供给静态二进制翻译器使用. 测试结果表明, 该方法使得                   SPEC CINT2000  部分程序的执行效率超过本地原
                 生运行. 但是该方法采用近乎暴力搜索潜在匹配指令, 指令步长较短, 不支持对浮点指令的学习. 针对基于规则映
                 射方法对应用指令集覆盖率不足的问题, Wang             等人  [80] 混合使用基于规则映射与基于        IR  变换的翻译方法, 优先采
                 用规则映射方式完成指令翻译, 对于无法映射翻译的情况再将指令变换为                        TCG IR, 该方法有效解决了规则匹配失
                 效导致指令无法全覆盖的难题. Song         等人  [81] 提出在源码语义学习时引入动态滑动窗口尝试寻找更优的匹配规则,
                 在翻译规则中允许客户机、宿主机之间存在                ISA (instruction set architecture) 的语义差异, 该方法相比文献  [80] 的
                 指令覆盖率和翻译效率有显著提升.
                    Jiang  等人  [84] 分析了训练集规模与生成规则数量的关系, 实验结果表明仅仅通过无限扩大训练集规模并不能
                                                                                           等人  [84] 使用参数
                 化翻译规则学习方法进一步优化, 根据指令集编码分类规律衍生出更多可用规则, 对于被翻译的源平台指令, 先参
                 数化匹配规则再实例化. 但参数化方法限制了其平台可移植性. Hasabnis 等人                  [72] 反向利用  GCC  的指令模板描述来
                 扩展学习规则, 使用      GCC  编译大量源代码包, 分析编译后端生成的            IL (intermediate language) 片段与输出的汇编
                 代码  (assembly) 之间的关系, 形成映射规则<assembly, IL>, 最终以     IL  为中间桥梁实现不同架构的指令映射, 自动
                 生成更多规则. 实验结果表明其指令覆盖率达              99.5%, 但是该方法仅支持编译器生成指令, 无法处理手工加入的指令.
                    此外, 也有研究提出将编译框架转换和规则映射相结合的代码生成方法. Xu                       等人  [85] 提出  Copy-and-Patch  快速
   114   115   116   117   118   119   120   121   122   123   124