论文部分内容阅读
二进制翻译技术是用软件方法解决代码移植问题的重要手段。二进制翻译及相关优化技术的研究,不仅在遗产代码移植而且在程序性能提高等其它方面都有重要的意义。本文首先综述了二进制翻译的研究现状以及基本原理和方法。针对动态二进制翻译,本文提出了若干种优化方案:提高在目标机器上模拟源机器标志位效率的EfLA算法;处理应用级主动异常和被动异常的两个算法;翻译制导的寄存器优化算法。本文介绍了我所在二进制翻译研究组设计并实现的两个应用程序级的二进制翻译器:Digital Bridge和Digital Bridge V2。两个系统都是在linux下,把elf格式的x86文件翻译到GODSON(类MIPS)指令集并在GODSON服务器上运行。前者是纯动态的翻译器,后者是以前者为基础的动静结合的翻译器。本文的主要贡献如下:1.提出了动态二进制翻译标志位处理优化算法,简化了基本块间的标志位分析,采取分析后继的方法减小了算法开销。尤其对于每条算术指令都能对标志位定值的x86这类CISC体系结构,基本能把标志位冗余计算消除,提升了翻译代码的质量。统计结果表明,这种简化是切实可行、并具有普遍适用性的,可以在二进制翻译或者模拟器中有效加快运行速度。2.异常处理是二进制翻译中一个十分重要的问题,本文提出了两个针对应用级程序二进制翻译的异常处理方法。绝大部分的应用程序不会使用异常之前的机器状态或者也有可能不发生异常,所以我们在保证正确性的前提下,放弃了对机器状态副本的维护,使效率得到了保障,同时正确翻译执行了异常的处理函数,以最小的代价,把信号异常处理机制加入到了翻译系统中。为了在库函数包装这个层面上快速处理c++中的异常抛出以及重新抛出的问题,我们提出了动态栈展开的思想,从而得到本该静态编译阶段才可以得到的函数调用关系,分析得到caller调用callee的准确地址,用于异常区间的检查。3.寄存器的使用效率是决定程序性能的关键因素之一,本文提出了适用于动态二进制翻译的翻译制导寄存器分配方法。相比于静态编译器所使用的图着色算法,以及动态系统所使用的线性扫描寄存器分配算法,开销都小得多,但翻译器的寄存器使用效率很好,完全充分利用了各个寄存器,避免了寄存器相关而导致的指令延时。4.作者参与设计并实现了两个二进制翻译系统,并把上述优化都分别运用到了这两个系统中。在DB V2系统中还采用了一系列优化技术提高翻译效率,例如库