理论教育 实现动态二进制翻译的编译器设计

实现动态二进制翻译的编译器设计

时间:2023-11-04 理论教育 版权反馈
【摘要】:动态二进制翻译及优化系统使得程序可以在无需重新编译的情况下进行目标机移植,对丰富新兴目标机的软件系统是有积极意义的。下面,先来看看动态二进制翻译系统的基本结构,如图10-3所示。结合图10-3,笔者简单介绍一下动态二进制翻译的过程,可以分为如下几步:程序加载。在这种情况下,操作系统会将该程序的控制权完全交给二进制翻译系统。在动态二进制翻译中,研究代码的重用率是提高翻译效率的有效方法。

实现动态二进制翻译的编译器设计

二进制翻译技术,也称为“BT(Binary Translation)”,是一种即时编译技术,它的工作是将源体系结构编译生成的二进制代码动态翻译为可以在目标体系结构上运行的代码。动态二进制翻译及优化系统使得程序可以在无需重新编译的情况下进行目标机移植,对丰富新兴目标机的软件系统是有积极意义的。目前,比较著名的二进制翻译系统包括Intel的IA-32 Execution Layer、IBM的DAISY、Transmeta的CMS等。该技术也被应用于虚拟机中,如著名的VMware。下面,先来看看动态二进制翻译系统的基本结构,如图10-3所示。

结合图10-3,笔者简单介绍一下动态二进制翻译的过程,可以分为如下几步:

(1)程序加载。当用户执行一个源目标机程序时,目标机平台将调用加载器装入程序。注意,这个加载器可能是建立在操作系统上的,也可能是烧录在BIOS中的,甚至是依赖于硬件实现的。当然,如果操作系统已经实现了目标机移植,那么,将二进制翻译建立在操作系统之上也是完全可行的。在这种情况下,操作系统会将该程序的控制权完全交给二进制翻译系统。

(2)解释执行。由BT控制器启动解释器进行解释执行。与普通的解释器不同,在这个过程中,解释器需要收集源程序的相关信息,以便进行动态翻译与优化。根据程序执行的90-10定律,程序执行的“热点”是解释器必须关注的。当然,收集工作有时也可以由硬件完成,一些现代CPU提供了比较丰富的状态寄存器,以便翻译器动态分析程序执行的过程。

(3)提取程序片段。“热点”是动态编译与优化的主要工作对象,因此,提取与分析“热点”片段是非常重要的。

(4)动态翻译程序片段。将“热点”翻译成本地代码执行是动态翻译器的任务,在此过程中,动态翻译器将对“热点”片段进行一些动态优化。翻译生成的本地代码片段将被保存在cache中,以便下次调用该程序片段时,直接执行本地代码片段,以提高程序执行效率。这里的cache是指动态编译器拥有的一组存储资源,并不一定是硬件体系中的cache。在实际系统中,cache通常被分为“block cache”与“trace cache”。值得注意的是,cache一般不会太大,因为动态翻译器与用户争夺存储资源是不能接受的。因此,就需要考虑cache管理的问题了。与操作系统页面管理类似,cache管理也存在一个淘汰机制。事实上,哪些片段应该被淘汰有时是很难评估的。当然,有些动态翻译器也会将本地代码片段永久存放在外存上,在外存允许的情况下,这种方案可能更好。

978-7-111-32164-4-Chapter10-34.jpg

图10-3 动态二进制翻译系统的基本结构(www.daowen.com)

这里,笔者简单谈谈动态二进制翻译的几个关键问题:

(1)存储系统。根据目标机的结构,二进制翻译通常会涉及寄存器、cache、主存等存储系统。对于不同目标机之间的映射关系是设计者需要考虑的。当前,寄存器、cache相对复杂一些。在使用寄存器时,必须兼顾专用寄存器、状态寄存器、标志寄存器等。而cache管理中,更多关注的是cache的命中率。在获取cache命中率的信息方面,动态编译器比静态编译器有利得多。在一些现代体系结构的目标机中,甚至还设置了一些用于记录cache命中率、cache失效率、程序热点等的寄存器组,以便应用程序能更高效地获取相关信息。这类信息对于动态优化是极其重要的,在此之前,动态编译器必须依赖于软件方式记录。在主存方面,数据映射是一个问题。如x86平台采用的是小尾端的形式,而MIPS既支持小尾端,也支持大尾端,而另外一些平台可能只支持大尾端。

(2)实时性问题。正如前面所说的,实时性对于二进制翻译是极其重要的,因此,在某些情况下,实时性很强的代码需要使用启发式算法进行提前预测,并进行相关翻译生成。

(3)空间耗费。动态编译器本身对于存储资源的耗费也是关键的问题。由于动态编译器与用户程序是运行在同一时刻的,因此,动态编译器对存储资源的耗费可能会对用户程序的运行产生一定的影响。当然,这也许是不可避免的,但并不意味着是无限制的。无论是优化还是代码生成,动态编译器设计者都必须时时关注这个指标,绝不可能像静态编译器那样不计成本地耗费用户的存储空间。

(4)效率问题。在动态二进制翻译中,研究代码的重用率是提高翻译效率的有效方法。理想情况下,如果一次翻译生成的代码被执行的次数较多,那么,就可以在一定程度上降低优化及生成代码的代价。因此,有效地利用cache管理代码片段是非常必要的。不过,当缓存被填满时,代码片段的淘汰将是一个复杂的问题。与操作系统页面淘汰问题类似,试图寻找一个优化的方案并不容易。

(5)体系结构。不同结构目标机之间的差异通常是非常大的,可能还不仅局限于存储系统、指令系统方面。有时,中断、流水线等也是值得关注的。这些因素对指令调度、代码生成等都是有一定影响的。在笔者看来,硬件结构的问题并不能依赖于想象,只有实践证明过的才是可靠的。

在动态二进制翻译领域中,Queensland大学的UQDBT是一个不错的多源多目标的研究系统。在国内,动态二进制翻译主要应用于“龙芯”的平台移植,由中科院软件所研发的DigitalBridge就是在Linux/MIPS平台上动态翻译执行Linus/x86的程序。与先前讨论的模型不同,DigitalBridge并不解释执行源程序,而是直接翻译生成未优化的本地代码片段,将其存放于block cache中。然后,在执行本地代码片段的过程中,分析程序“热路径”,再进行优化并生成优化后的片段,将其存放于trace cache中。这种处理方法在二进制翻译中的应用很广泛,主要原因就是解释器的执行效率通常不能令人满意。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈