论文部分内容阅读
近年来,在计算机业的发展中经常出现软硬件发展不协调的情况,研究者们提出了代码移植技术来解决这一冲突。二进制翻译就是这其中应用较为广泛的技术之一。通过二进制翻译技术可以实现软件的跨平台性,使得不同体系结构的二进制可执行程序轻松移植,从而扩大了软件硬件的适用范围。同时二进制翻译技术也是嵌入式仿真软件的核心模块,可以帮助协调嵌入式开发中的软硬件开发进度。所以得到了越来越多的关注,在理论和技术上都有了很大的提高。本文首先介绍了二进制翻译技术分类,发展情况及研究热点。由于二进制翻译系统可以认为是源码特殊的编译系统,所以,文章同时介绍了编译器中的寄存器分配这一核心技术,以及多种寄存器分配算法。通过对目前较为流行的动态二进制翻译系统QEMU(Quick EMUlator)的研究,详述了其中的翻译流程,翻译策略,以及寄存器分配方法。并以该动态二进制翻译系统的用户级模式作为本文的实验平台,通过对QEMU的翻译引擎TCG(TinyCode Generator)的研究,我们发现在翻译的前端,生成的中间码过多的依赖临时变量,使中间码冗余繁杂,不利于翻译器后端的优化。在研究分析QEMU的寄存器分配方法之后,发现该方法的很多不足,太过简单的分配策略使寄存器的利用率太低,产生不必要的寄存器间移动指令和太多的对内存的存取操作。基于以上两点分析,本文实现部分的主要工作有:1.通过修改前端代码,使全局变量不再映射到临时变量进行运算,这样极大的减少了中间码的数量,关键是精简的中间码可以更好的进行优化分析,方便后端优化算法的实现。2.考虑到QEMU翻译粒度是基本块,所以本文选择在该翻译系统后端实现线性扫描寄存器分配算法,该算法时间和空间复杂度都很低,编译速度快,易于实现,且能生成高质量的代码,能很好的满足分配效果和分配效率的权衡关系。与传统的线性扫描算法不同,在处理分配冲突时,本文并不是将整个生命期全部溢出,而是采用了分割生命期的方法,并且根据生命期的溢出权重选择溢出生命期,并尝试了两种不同的权重计算方法。根据实验结果分析,寄存器分配算法的实现虽然会增加翻译时间开销,但可以生成更高质量的宿主机代码,尤其是可以减少大量的内存存取操作,减少系统的总体运行时间,具有现实的可行性。