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

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


                 2   二进制翻译技术中的指令翻译

                    二进制翻译器      (如图  2  中绿底色标注) 的核心功能是指令翻译, 其根据要匹配的粒度从二进制程序中提取待
                 匹配的函数、基本块或者指令, 一一对应地模拟客户机的所有指令功能, 实现指令的解码、翻译、优化和编码等
                 工作, 最终转换为目标平台机器码. 但不同的指令翻译方法最终生成的代码质量存在差异. 本文梳理表                               1  中典型翻
                 译系统所采用的指令翻译方法, 将其总结为定制化中间表示的指令翻译、编译器框架辅助的指令翻译和规则匹配
                 的指令映射翻译这       3  种.

                 2.1   定制化中间表示的指令翻译
                    为了摆脱指令翻译时对架构的依赖, 降低翻译难度, 有研究提出针对二进制翻译器自身设计一套架构无关的
                 统一中间表示     (IR), 其将翻译工作转换为源平台指令到           IR  中间表示的代码提权和        IR  到目标平台指令的重新编
                 码. 统一的  IR  表示既降低了架构依赖性和指令翻译复杂度, 又提升了二进制翻译系统向多平台的可扩展性与兼容
                 性. 该方法为函数语义特征提取带来了极大的便利. 图                3(a) 为基于定制化中间表示的指令翻译流程图, 典型的中间
                 表示如   TCG IR、VEX IR.
                                           , 基于二进制语义学习的

                                                       ARM64 指令序列         TCG IR          x86-64 指令序列
                           指令           IR                         指令  add_i64 tmp4,x1,x0  IR  movq     0x48(%rbp), %rbx
                    源平台    提升   IR 中间  编码   目标平台         add      x1, x1, x0 提升  mov_i64 x1,tmp4   编译  movq     0x40(%rbp), %r12
                    指令           表示          指令          sub      x1, x1, #1  sub_i64 tmp2,x1,$0x1  addq       %r12, %rbx
                                                                                        decq       %rbx
                                                                       mov_i64 x1,tmp2
                                                                                        movq      %rbx, 0x48(%rbp)
                     (a) 基于定制化中间表示的指令翻译流程                           (b) 基于 TCG IR 指令变换翻译示例
                                             图 3 基于定制化中间表示的指令翻译

                    TCG IR  作为  QEMU  采用的独立于架构的抽象中间表示, 支持            140  余种不同的操作类型. TCG IR    使用微指令
                 操作解释源平台指令, 每条微指令近似于原子操作, 保证了翻译时的正确性. 图                       3(b) 为基于  TCG IR  实现  ARM64
                 到  x86-64  的指令翻译过程. 为了尽可能快的完成翻译工作, QEMU             并未对   TCG IR  开展深入优化, 导致其翻译效
                 率较低. 考虑到翻译复杂度和平台可扩展性, TCG IR             主要面向内存访问、整数运算、逻辑运算等基础指令表示,
                 对于浮点和向量等功能复杂的指令则通过引入                C/C++语言设计的     Helper 函数模拟实现. 针对    TCG IR  在浮点和向
                 量指令转换方面的不足, 文献         [25,68] 设计了向量  TCG IR  来表示  SIMD  指令, 不再依赖   Helper 函数实现, 丰富了
                 TCG IR  对不同指令类型的表示.
                    VEX IR  作为  Valgrind  采用的一种二地址形式的架构无关中间表示, 支持             1 000  余种不同的操作类型. VEX
                 IR  基于  SSA (static single assignment) 形式对每一个变量进行显式的类型变换. VEX IR   设计了表达式和语句申明
                 来模拟存储单元读写、变量读写、条件赋值、特殊函数调用等操作. VEX IR                       支持对多种平台的指令集进行统一
                 描述, 保证了不同平台的二进制代码直接复用插桩工具. VEX IR                 目前对于    AVX、FMA   等向量指令支持不足. 此
                 外, 为了保证多平台的兼容性, 基于         VEX IR  表示的代码翻译效率较低.
                    除了上述定制化中间表示之外, 还有其他基于               IR  的翻译设计, 例如使用     REIL [69] 作为中间表示的   IDA Pro [70] ,
                 面向程序属性的形式推理          BAP [71]                 LISC  [72] , 面向  CrossBit 的低层次虚拟精简机器指令
                 VInst [36] , 支持  CPU/GPU  异构虚拟执行环境的中间表示   GVInst [73] 等.

                 2.2   编译器框架辅助的指令翻译
                    定制化中间表示的指令翻译是针对二进制翻译器量身定做, 具有很强的针对性. 但是其也存在明显不足: 需要
                 开发人员手工开发解码、中间表示和编码过程, 且在兼顾可扩展性的同时牺牲了翻译效率. 考虑到二进制翻译的
                 代码优化与常规编译优化具有相似性, 大量编译技术可以直接被复用. 为此, 有研究提出利用编译器框架辅助完成
                 二进制指令翻译, 将编译器的中间表示和编译器后端代码引入到二进制翻译中, 从而充分利用编译器已有优化技
                 术. 此外, 编译器在开源社区具有较高的活跃度, 进一步促进了二进制翻译技术的更新迭代. 图                           4(a) 为基于编译器
                 框架辅助的指令翻译流程.
   112   113   114   115   116   117   118   119   120   121   122