对不起,该网页还在建设中...

二进制翻译组

通过二进制翻译,将X86、ARM、RISC-V等架构的应用程序运行在龙芯处理器上。结合指令集和处理器设计的硬件创新,实现动静态结合、软硬件结合的高效二进制翻译系统,寻求二进制翻译系统效率和完备性两大方面的突破。

如果你对指令流分析编译技术虚拟化技术以及操作系统等有一些兴趣,那么希望本页面能够给你一些有关二进制翻译的相关内容。

什么是二进制翻译

TLDR; 通过二进制翻译可以将X86、ARM、RISC-V等架构的应用程序运行在龙芯处理器(LoongArch)上。

由于不同架构的程序他们所包含的机器码不同,所以跨架构的程序无法直接运行。如X86上的程序无法在ARM以及LoongArch上运行。 为了让使得不同架构的程序能够在不进行重新编译的情况下,运行在目标平台上,我们需要使用二进制翻译技术

Altman 提出二进制翻译可以分成三大类,分别是解释执行静态二进制翻译以及动态二进制翻译1。当然综合了他们的优点,我们也存在着混合二进制翻译系统

  • 解释执行时会对每条指令进行实时的解释,不进行优化和缓存;
  • 静态二进制翻译采用“离线”翻译方式,在程序不运行的情况下,对原二进制文件进行分析、翻译以及优化;
  • 动态二进制翻译采用“在线”翻译方式,在程序执行到某个片段时才会对该片段进行翻译;
  • 混合二进制翻译则结合了前面各类型的优点,寻找性能和正确性的平衡。

现在我们能够接触到的,常见的二进制翻译有QEMURosetta2,以及使用二进制翻译技术的DynamoRIOPin

我们在做什么

研究是方向包括了二进制翻译优化库包装微译器系统态二进制翻译以及编译优化制导的二进制翻译系统等。

二进制翻译优化

库包装

库包装是二进制翻译的应用的一个扩展,相比于关注于如何执行完整的客户端的二进制程序的二进制翻译,库包装关注于客户端的动态链接库与本地程序的无缝结合。库包装的最终目标是,使用户、开发者可以像用本地库那样在宿主机上使用其他架构的库,如浏览器插件、Python包、开发工具链等。

库包装的难点在于实现从宿主端代码到客户端代码的无缝切换,它通常发生在函数调用时,即宿主端函数与客户端的库函数的相互调用。由于不同架构间的调用规范通常不同,因此需要在这些函数调用之间进行转换。从这个角度来说,库包装也可以看作是不同架构间调用规范的虚拟化。

针对某个特定的库进行包装繁琐且不具备通用性。我们希望利用编译器相关技术将该过程自动化、通用化,最终使它能够投入到实际应用当中。

库包装领域目前没有较为知名的工作;库直通是与它相近的工作,库直通专注于使用本地库函数加速翻译器执行客户程序的速度,FEX、BOX64等都使用库直通技术对二进制翻译进行加速。

微译器

系统态二进制翻译

虚拟化技术是云计算的根基,其本质是资源的抽象化,如计算、网络、存储。 操作系统虚拟化是众多虚拟化技术的一种,可以实现在宿主机上运行完整的客户机操作系统。 随着技术的发展,硬件辅助的虚拟化技术可以实现几乎无损的运行客户机操作系统,但仅限于同架构虚拟化,即宿主机和客户机是相同的指令集架构。 这是由其实现的基本原理所决定的,即 Direct Execution 与 Trap-and-Emulate。 Direct Execution 意味着基本的客户机指令可以直接运行在宿主机处理器上,从而尽可能实现性能上的无损。 Trap-and-Emulate 捕获敏感的客户机指令并进行模拟执行,从而实现虚拟化。

若宿主机和客户机是不同的指令集架构,显然 Direct Execution 是行不通的,因此我们需要二进制翻译技术的协助,从而实现跨架构的虚拟化。 系统态二进制翻译技术正是实现跨架构操作系统虚拟化的关键技术。 除云计算环境之外,跨架构虚拟化还可以应用在软件兼容、新架构迭代、系统调试与分析等领域。

我们仍然可以从虚拟化的三大方面来看待系统态二进制翻译技术:

  • CPU:通过二进制翻译运行客户机的所有指令,包括用户态指令和特权级指令
  • Memory:实现跨架构的地址转换,即客户机虚拟地址(GVA)到客户机物理地址(GPA),最终到宿主机物理地址(HPA)
  • IO:提供客户机所需的设备支持,通过软件模拟或硬件设备直通等方式,并支持 MMIO 等 IO 操作,以及中断系统

典型的系统态二进制翻译器有 QEMU,其通过 TCG 实现客户机指令的模拟,通过 SoftMMU 实现内存的模拟,并提供诸多设备的软件模拟来支持客户机的设备需求。

目前全系统二进制翻译最大的不足是性能差,如 QEMU 模拟的客户机操作系统在 SPEC CPU 测试下整数性能仅有宿主机的 5-10%,浮点性能更是 1% 不到。 我们期望通过更详尽的分析、更细致的研究,提出更多优化技术,包括软件优化、软硬件结合等等,提高系统态二进制翻译中各方面的性能。

编译优化制导的二进制翻译系统

翻译生成的代码质量在很大程度上会决定二进制翻译系统执行的效率,而目前的二进制翻译器对于代码翻译大多采用一对一/多的形式(如QEMU, Rosetta2),该方式并没有很好地关注指令间的优化空间。

COGBT(Compile Optimization Guided Binary Translator)是一个基于LLVM编译优化制导的二进制翻译系统,旨在通过编译的手段探索指令间的优化空间。同时由于LLVM的可扩展性,使得在其上编写一些特定的优化Pass变得更加容易。

目前已经实现的一些优化手段:

  • 栈变量翻译模型:该模型很好地在LLVM IR阶段实现了固定寄存器映射。
  • 基于LLVM框架实现的一些特定的优化pass:Flag Elimination Pass, Pattern Analysis Pass, …
  • TU(Translation Unit): 将多个TB(translation block)结合,探索多个tb块之间的优化空间。
  • Profile指导的优化:trace热路径的收集、间接跳转目标的收集, …

将来可能继续探索的一些优化手段:

  • 浮点操作自动向量化。
  • 栈变量到寄存器变量的提升。
  • 精确异常的保证。

入门实验

为了让大家能够更好的,更快的了解二进制翻译,我们设计了一些入门实验。 当然这些实验并不完全局限于只了解二进制翻译,我们希望这些实验可以补充大家对于“一个二进制程序”的理解。

  1. E. R. Altman, D. Kaeli and Y. Sheffer, “Welcome to the opportunities of binary translation,” in Computer, vol. 33, no. 3, pp. 40-45, March 2000, doi: 10.1109/2.825694. 

发布于