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) 为基于编译器
框架辅助的指令翻译流程.