Page 133 - 《软件学报》2024年第6期
P. 133
谢汶兵 等: 二进制翻译技术综述 2709
5 二进制翻译技术应用领域
二进制翻译技术的研究动力归结于其蕴含的潜在商业价值和市场需求. 目前, 二进制翻译在程序分析与优化、
软件迁移、安全研究等众多场景中均发挥着重要作用. 本节对二进制翻译技术的具体应用场景进行介绍.
5.1 软件迁移
软件迁移通过相关技术手段将已有的软件从一个平台迁移到另外一个新的平台上. 将旧体系结构平台遗留软
[4]
[1]
件直接迁移到新体系结构平台是二进制翻译最主要的应用场景. 在历史上, Alpha 、Tansmeta 、HP 、Apple 、
[2]
[5]
Intel [40] 等均采用此方法协助推出新架构, 当前市场上也活跃着一大批实践案例.
微软为了实现向后兼容, 在 Windows 64 位操作系统上推出使用 WOW64 [182] 模拟器. WOW64 模拟器使得大
多数 Windows 32 位应用程序无需修改即可在 Windows 64 位版本上运行. 为了在 ARM 平台支持 Windows 系统,
微软与高通联合推出了 Win10 ARM 完整版, 基于二进制翻译技术将 Windows/x86 软件生态直接移植到高通的
ARM64 平台上运行 [183] , 保证了 Windows/ARM 笔记本用户可以享受到更广泛的软件选择, 提升了 ARM 设备的
兼容性和可用性. 苹果公司利用 Rosetta 2 翻译器在 Apple Silicon M1 上高效运行 x86-64 指令集的二进制代码,
[5]
实现了终端与个人 PC 从 x86-64 到 ARM 架构上的生态融合. 华为利用 ExaGear [12] 实现 x86 (32/64 位) 或 ARM32
平台应用到 ARM64 平台的迁移, 极大拓展了鲲鹏服务器的软件生态圈. 开源 FEX-Emu 实现了 Speedy x86/x86-64
[39]
游戏在 AArch64 平台运行. 龙芯中科推出 LAT [17] 系列二进制翻译器实现 x86、ARM、MIPS 等指令系统的二进制
应用在 LoongArch 兼容运行, 有效弥补了其软件生态的不足. 此外, LoongArch 结合 LAT 和 Wine [184] , 实现在 Linux/
LoongArch 上运行 Windows/x86 的应用程序, 并完成大批 Linux 老旧打印机等办公设备利旧.
目前, Android/ARM 的强大应用市场催生了大量的 Android 模拟器. Houdini [40] 实现了 Android/ARM 应用在
英特尔处理器上高效翻译运行. Dolphin [185] 支持模拟 GameCube/Wii 游戏在 Android 上运行. DAOW 模拟器 [59] 实
现 Windows PC 上高效运行大型 3D Android 游戏, 并有效解决了完全虚拟化带来的性能开销问题. 谷歌推出的
Android 11 模拟器 [186] 支持 ARM 应用在 x86 平台的台式机、笔记本、服务器以及云环境上高效运行. 英特尔与腾
讯携手推出应用宝, 通过 Bridge 技术 [187] 和 Celadon 技术 [188] 联合驱动, 实现个人 PC 和移动应用之间的体验打通,
进一步促进了 Android 与 Windows 的生态融合.
5.2 程序分析与优化 对二进制程序对应的
传统静态编译器在编译阶段难以对程序进行全局分析, 无法准确预测程序的实际执行行为. 此外, 对于使用动
态加载、共享库和运行时绑定技术的程序来说, 编译器静态分析优化的优势较弱. 相反, 动态二进制翻译技术可以
利用代码全局信息开展优化, 弥补了传统编译器在此方面的不足. 二进制翻译利用 LTO (link time optimization)、
PGO (profile-guarded optimizations) 等技术实现代码内联、反馈优化、死代码删除等优化操作. Paulino 等人 [189] 研
究发现, 对于经过 GCC 和 LLVM 等编译器高度优化后的程序, 继续施加二进制分析与优化, 依旧可以实现 10%
以上的性能加速效果.
近年来, 一些研究者致力于利用二进制翻译技术进行程序分析与优化, 并产生了大量的研究成果. Luk 等人 [137]
提出基于采样的优化工具 Ispike, 通过将二进制程序运行时的信息反馈给优化器对程序进行优化, 降低了指令和
数据的访存延迟. Panchenko 等人 [190] 提出用于数据中心及其他领域的实用二进制优化器 BOLT, 其建立在 LLVM
编译器基础架构之上, 利用基于采样的运行时信息对二进制文件进行链接后优化, 最终实现代码优化布局与重写.
谷歌提出的 Propeller 技术 [191] IR 进行分析与优化, 并基于运行时信息对程序进行基本块重排、
函数划分、函数重排, 可以达到与 BOLT 优化器相近的优化效果. Propeller 与 BOLT 的主要区别在于: (1) BOLT
属于链接后优化, Propeller 则是链接时优化. (2) BOLT 的输入是二进制和运行时信息, 而 Propeller 的输入是缓存
的 IR 中间表示文件和运行时信息. 邹伟等人 [192] 基于 IR 对嵌入式全系统软件进行动态二进制插桩, 实现嵌入式全
系统软件的运行控制流跟踪. 该方法以基本块为单位开展细粒度插桩, 扩大了二进制插桩在程序分析领域的应用
范围. DynamoRIO [43] 基于热路径优化构建代码块, 然后对二进制代码引入窥孔优化、常量传播、循环展开等优化,
经过优化后部分应用翻译效率优于本地原生执行. Ginzburg 等人 [193] 提出矢量化二进制翻译器 VectorVisor, 其提