基于静态划分的代码Cache管理方法

文档序号:6399283阅读:208来源:国知局
专利名称:基于静态划分的代码Cache管理方法
技术领域
本发明涉及计算机应用领域的动态二进制翻译技术,特别涉及一种基于静态划分的代码Cache管理方法。
背景技术
动态二进制翻译技术是解决遗留代码和提高软件平台适应性的一种有效手段。它在不需要可执行程序源代码的情况下,动态地将源体系结构上的二进制程序经过转换,运行于其他目标体系结构上。动态二进制翻译基本上是这样工作的:以基本块为单位翻译源体系结构二进制代码,通过翻译生成相应的目标体系结构支持的代码块,并缓存在代码Cache中,这样当程序再次运行到这个基本块时,就直接从代码Cache中得到相应的目标体系结构代码并执行,从而提高程序执行速度。利用代码Cache加速翻译效率的同时,需要对翻译出来的代码块进行有效的管理,需要既节省本地内存空间,又不至于引起代码Cache由于空间不足导致频繁的替换操作以致性能下降。代码Cache管理策略在动态二进制翻译中对提高翻译效率具有重要作用,它需要综合考虑管理开销、代码局部性、代码碎片等问题,然而现有的代码Cache管理策略依然存在着各种不足,特别是管理开销较大,从程序执行局部性的角度看,Cache中的代码块的缺失率仍然较高,因此,亟需提出一种更有效的代码Cache管理策略。

发明内容
本发明针对现有技术的缺点,提供了一种可以降低管理开销,提高Cache的命中率的新型的基于静态划分的代码Cache管理方法。为实现上述目的, 本发明可采取下述技术方案:基于静态划分的代码Cache管理方法,包括TB数组和TB备份数组,包括以下具体步骤:I)从配置文件中读取配置参数MAX_CACHE_SIZE和L 1_PR0P0RTION的值,将代码Cache划分为LI级Cache和L2级Cache,计算LI级Cache的大小L1_MAX_SIZE =MAX_CACHE_S I ZE*L 1_PR0P0RT I ON,计算 L2 级 Cache 的大小 L2_MAX_SIZE = MAX_CACHE_SIZE*(1-L1_PR0P0RT10N),其中,MAX_CACHE_SIZE 表示代码 Cache 的大小,L1_PR0P0RT10N表示LI级Cache占代码Cache的比例,L1_PR0P0RT10N彡50% ;2)根据所述配置参数计算阈值N = 5JA _ PROPORTION -0.5)^10]:3)读取一个基本块,判断所述基本块是否已被翻译,如果所述基本块未被翻译,则对所述基本块进行翻译,在LI级Cache申请空间,将翻译产生的目标体系代码块缓存至LI级Cache ;所述申请空间步骤包括,如果Ll_ptr - Ll_base〈Ll_MAX_SIZE,将所述基本块的起始地址设置为Ll_ptr,所述基本块翻译完成后,根据所述目标体系代码块的大小,更新Ll_ptr 和 TB 数组;如果 Ll_ptr - Ll_base ^ L1_MAX_SIZE,令 Ll_ptr=Ll_base,清空所述LI级Cache,将所述TB数组清零,将所述TB备份数组复制到所述TB数组,所述Ll_base指向所述LI级Cache的起始地址,所述Ll_ptr指向所述LI级Cache的空闲区域;4)执行所述目标体系代码块,如果所述目标体系代码块在所述LI级Cache中则execution_times 力口 I ;5)如果所述execution_times达到所述阈值N,则将所述目标体系代码块转移至L2级Cache,同时将所述目标体系代码块的TB信息从所述TB数组复制到所述TB备份数组;6 )重复执行所述步骤3-5直至所有基本块执行完毕。作为优选,所述LI级Cache采用全清空策略,所述L2级Cache采用FIFO策略。作为优选,还包括记录所述目标体系代码块大小的generated_size。作为优选,所述步骤5中将述目标体系代码块转移至L2级Cache的步骤具体为:从所述generated_siz e获得所述目标体系代码块的大小size,将所述目标体系代码块转移至L2_head所指向的内存空间,更新所述基本块TB信息和L2_head,如果(L2_head+size) % L2_MAX_SIZE ^ L2_rear,则执行代码块换出操作,重复执行所述代码块换出操作直至L2级Cache的空闲区域满足所述目标体系代码块的大小,其中,所述L2_head指向L2级Cache的空闲区域,所述L2_rear指向最先进入L2级Cache的目标体系代码块;所述代码块换出操作的步骤具体为:根据所述L2_rear查找TB备份数组,得到被换出的代码块的起始地址,清空所述TB数组和所述TB备份数组中所述被换出的代码块的TB 信息,令 L2_rear = (L2_rear+size) % L2_MAX_SIZE。作为优选,如果所述L1_PR0P0RT10N〈50%,令 L1_PR0P0RT10N = MAX_CACHE_SIZE,L2_MAX_SIZE = O。本发明由于采用了以上技术方案,具有显著的技术效果:代码Cache管理灵活,LI级Cache和L2级Cache大小及各自占有比例可通过配置文件静态配置,以适应不同环境下不同应用程序的特性。管理开销低。全清空策略和FIFO策略是常用Cache管理策略中开销最低的两种策略,本发明提出的方案将两种策略结合,以最低的管理开销降低Cache缺失率。考虑程序的执行特征。本发明将执行次数多且最近执行的代码尽量驻留在代码Cache中,从程序执行局部性的角度降低Cache缺失率。


图1为实施例1QEMU动态二进制翻译流程示意图。图2为实施例1QEMU中的实现框架示意图。图3为本发明的流程示意图。
具体实施例方式下面结合实施例对本发明作进一步的详细描述。实施例1本实施例中所采用的动态二进制翻译系统为开源的QEMU系统,但本方法也可以推广到其他二进制翻译系统中。QEMU系统将源目标体系结构(如ARM,X86,MIPS)的可执行文件翻译到中间代码,然后再翻译到目标体系结构ISA (Instruction SetArchitecture)(如 X86, PowerPC, ARM, Sparc, Alpha, MIPS)上执行。翻译单位为基本块,TB (Translation Block,简称TB)数组保存了所有基本块的翻译信息,其元素数据结构为struct TranslationBlock,表示一个基本块的翻译信息(或者称为TB信息)。QEMU采用TCG作为中间代码,每条源体系结构指令会在前端被翻译为一条或者多条TCG指令,后端会将这些TCG指令翻译为目标体系结构代码。TCG具有简单、清晰的语法结构。QEMU的动态二进制翻译流程如图1所示。QEMU首先加载源体系结构二进制文件,并找到程序的入口地址,开始翻译。每次翻译前,QEMU会首先根据当前指令PC(即基本块的地址,该基本块的地址会在该基本块被加载前保存在CPU的程序计数器,简称PC中,因此,本实施例中直接以PC来指代基本块的地址,下同)在代码Cache中进行查找,若找到该基本块所对应的目标体系代码块,则表示该基本块已经翻译过,则取出相应的目标体系代码块进行执行,如果代码Cache中未找到该基本块所对应的目标体系代码块,则执行翻译过程。翻译前端针对当前指令PC,首先译码判断指令功能,然后将其翻译为对应的TCG指令,缓存在TCG Cache中,然后继续翻译下一条指令,直至遇到基本块结束指令,则结束当前基本块翻译。后端将当前基本块对应的TCG指令翻译为目标体系结构代码,即目标体系代码块,并缓存在代码Cache中,同时执行该目标体系代码块。QEMU代码Cache管理采用全清空策略,Cache查找采用哈希表的方式。为实现本发明的代码Cache管理方法,需要对QEMU进行如下几个方面的修改:1、增加对目标体系代码块的执行次数的统计,即在TranslationBlock结构中添加execution_times —项,用以统计基本块的执行次数。2、在TranslationBlock结构中增加generated_size,记录基本块所对应的目标体系代码块的大小。在进行代码提升时,需要根据目标体系代码块的大小进行拷贝。且每次对L2级Cache进行的代码换出操作均需要根据被换出代码块的大小确定指针的移动。3、新增 Ll_base 和 Ll_ptr,用于管理 LI 级 Cache。Ll_base 指向 LI 级 Cache 的起始地址,Ll_ptr指向LI级Cache当前空闲区域。4、增加L2_head和L2_rear变量来模拟循环数组,从而实现L2级Cache的FIFO管理策略。L2_head指向L2级Cache的当前空闲区域,L2_rear则指向最先进入L2级Cache的代码块,用于代码块换出操作。5、增加TB备份数组,用来备份缓存在L2级Cache中的目标体系代码块的TB信息。TB备份数组与TB数组类型相同,当目标体系代码块从LI级Cache提升到L2级Cache中时,需要将该目标体系代码块的TB信息在TB数组中进行备份。本发明的代码Cache管理策略在QEMU中的实现框架如图2所示。当LI级Cache执行完清空操作后,将TB备份数组中所有的TB信息拷贝至TB数组,这样通过TB数组就可查找到缓存在L2级Cache中的代码,因此避免了这部分代码的重新翻译。本发明的整体实现流程如图3所示,包括如下几个部分:流程1:将Cache配置参数写入配置文件。在QEMU启动前,写configure文件,指定 MAX_CACHE_SIZE 和 L1_PR0P0RT10N 的值。流程2:读取配置文件,根据配置参数将代码Cache划分为LI级Cache和L2级Cache。根据 MAX_CACHE_SIZE 和 L1_PR0P0RT10N 的值计算 L1_MAX_SIZE 和 L2_MAX_SIZE,并申请相应内存空间。计算公式分别为:
L1_MAX_SIZE = MAX_CACHE_SIZE*L1_PR0P0RTION,L2_MAX_SIZE = MAX_CACHE_SIZE*(1-L1_PR0P0RT10N);L1_MAX_SIZE应大于等于L2_MAX_SIZE,否则管理开销过大,且不符合程序执行特性。因此,当 L1_PR0P0RT10N 小于 50%,则使 L1_MAX_SIZE=MAX_CACHE_SIZE,L2_MAX_SIZE=0。流程3:根据配置参数计算阈值N。只有当L1_PR0P0RT10N大于等于50%才需要计算N,且L2的空间比例越小,代码提升的条件应越苛刻,即N的值越大。当Ll_PR0P0RT10N>=50%,本实施例采用的N的计算公式如下:
权利要求
1.一种基于静态划分的代码Cache管理方法,其特征在于,包括TB数组和TB备份数组,包括以下具体步骤: 1)从配置文件中读取配置参数MAX_CACHE_SIZE和L1_PR0P0RT10N的值,将代码Cache划分为 LI 级 Cache 和 L2 级 Cache,计算 LI 级 Cache 的大小 L1_MAX_SIZE = MAX_CACHE_SIZE*L1_PR0P0RT10N,计算 L2 级 Cache 的大小 L2_MAX_SIZE = MAX_CACHE_SIZE*(1_L1_PROPORTION),其中,MAX_CACHE_SIZE 表示代码 Cache 的大小,L1_PR0P0RT10N 表示 LI 级Cache 占代码 Cache 的比例,L1_PR0P0RT10N 彡 50% ; 2)根据所述配置参数计算阈值N= 5 + l(lA_rROP()RTJ()N - 0.5) * 10」: 3)读取一个基本块,判断所述基本块是否已被翻译,如果所述基本块未被翻译,则对所述基本块进行翻译,在LI级Cache申请空间,将翻译产生的目标体系代码块缓存至LI级Cache ;所述申请空间步骤包括,如果Ll_ptr - Ll_base〈Ll_MAX_SIZE,将所述基本块的起始地址设置为Ll_ptr,所述基本块翻译完成后,根据所述目标体系代码块的大小,更新Ll_ptr 和 TB 数组;如果 Ll_ptr - Ll_base ^ L1_MAX_SIZE,令 Ll_ptr=Ll_base,清空所述 LI 级Cache,将所述TB数组清零,将所述TB备份数组复制到所述TB数组,所述Ll_base指向所述LI级Cache的起始地址,所述Ll_ptr指向所述LI级Cache的空闲区域; 4)执行所述目标体系代码块,如果所述目标体系代码块在所述LI级Cache中则execution_times 力口 I ; 5)如果所述execution_times达到所述阈值N,则将所述目标体系代码块转移至L2级Cache,同时将所述目标体系代码块的TB信息从所述TB数组复制到所述TB备份数组; 6)重复执行所述步骤3-5直至所有基本块执行完毕。
2.根据权利要求1所述的基于静态划分的代码Cache管理方法,其特征在于,所述LI级Cache采用全清空策略, 所述L2级Cache采用FIFO策略。
3.根据权利要求1所述的基于静态划分的代码Cache管理方法,其特征在于,还包括记录所述目标体系代码块大小的generated_size。
4.根据权利要求3所述的基于静态划分的代码Cache管理方法,其特征在于,所述步骤5中将述目标体系代码块转移至L2级Cache的步骤具体为:从所述generated_size获得所述目标体系代码块的大小size,将所述目标体系代码块转移至L2_head所指向的内存空间,更新所述基本块 TB 信息和 L2_head,如果(L2_head+size) % L2_MAX_SIZE 彡 L2_rear,则执行代码块换出操作,重复执行所述代码块换出操作直至L2级Cache的空闲区域满足所述目标体系代码块的大小,其中,所述L2_head指向L2级Cache的空闲区域,所述L2_rear指向最先进入L2级Cache的目标体系代码块。
5.所述代码块换出操作的步骤具体为:根据所述L2_rear查找TB备份数组,得到被换出的代码块的起始地址,清空所述TB数组和所述TB备份数组中所述被换出的代码块的TB信息,令L2_rear = (L2_rear+size) % L2_MAX_SIZE。
6.根据权利要求1所述的基于静态划分的代码Cache管理方法,其特征在于,如果所述L1_PR0P0RT10N〈50%,令 L1_PR0P0RT10N = MAX_CACHE_SIZE, L2_MAX_SIZE = O。
全文摘要
本发明涉及计算机应用领域的动态二进制翻译技术,公开了一种基于静态划分的代码Cache管理方法,在TB信息中增加表示基本块执行次数的execution_times和表示目标体系代码块大小的generated_size,增加变量L1_base和L1_ptr,增加变量L2_head和L2_rear,增加TB备份数组。本发明的优点在于,Cache管理灵活,管理开销较低,通过考虑程序的执行特征,降低了Cache中缓存的代码块的缺失率。
文档编号G06F9/45GK103150197SQ20131004866
公开日2013年6月12日 申请日期2013年2月7日 优先权日2013年2月7日
发明者李莹, 罗艳, 尹建伟, 吴健, 邓水光, 吴朝晖 申请人:浙江大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1