论文部分内容阅读
二进制翻译(Binary Translation)是指在不需要可执行程序源代码的情况下,把源机器平台上的二进制程序经过一定的转换之后运行在目标机器平台上的过程。所谓动态二进制翻译就是边翻译边执行,并在翻译的过程中进行动态优化。动态二进制翻译为解决代码遗留,代码移植以及构建分布式虚拟计算环境等问题提供了一个良好的解决方法,因此在近年来得到了越来越广泛的关注和研究。由于动态二进制翻译和优化中的所有工作都是在运行时完成,对系统性能有较高的要求,因此应该采取跟静态编译和优化不同的途径。本文主要研究在动态二进制翻译中如何有效地收集运行时的profile信息,以及如何用这些信息来进行有针对性的优化,研究内容主要包括三方面:程序运行时的profile,热代码的识别和优化,以及基于profile信息的代码cache管理。Profile是指对程序运行时信息的统计和收集。传统的动态二进制翻译器都是采用基于基本块的profile,其缺点是工作量大,信息缺乏连贯性。本文提出了一种高效的基于路径的profile方法,实现上稍为复杂,但可以在一定程度上克服传统方法中的缺点。热代码的识别和优化分两步,首先根据收集的profile信息找出频繁执行的一段连续的基本块序列,然后把这些基本块合并成具有单一入口和多个出口的超级块,这样做一方面可以减少因基本块结束而引发的上下文切换,另一方面,超级块中包含更多的指令,给中间代码的优化提供了广阔的空间。代码cache的调度和管理算法主要是指已翻译代码的替换算法。由于基本块不定长,不合理的替换将在cache中产生很多碎片,降低cache的利用率。而采用FIFO等不会产生碎片的算法又往往降低替换的准确性,即把当前的热块替换出去,造成频繁翻译。本文提出了多层次cache,即将代码按照他们的profile信息存放到对应的cache层次中,最大限度地减少碎片率和错误替换次数。