本发明专利技术属于Java虚拟机技术领域,具体为一种Java虚拟机的位置无关代码生成方法。本发明专利技术针对分支跳转目标位置依赖、异常处理器位置依赖、函数位置依赖和数据位置依赖,设计了针对代码中不同种类的位置依赖消除策略,使虚拟机的即时编译器生成的可执行代码不含位置依赖。这些生成的位置无关代码可进而作他用,如将其缓存并复用以提升虚拟机执行效率等。
【技术实现步骤摘要】
本专利技术属于Java虚拟机
,具体涉及。
技术介绍
如今,物联网、移动计算等技术的飞速发展和硬件制造成本的降低使嵌入式设备在人们的日常生活中越来越重要。以Android为代表的嵌入式操作系统进一步推动了嵌入式设备在机顶盒、平板电脑、智能手机以及车载控制等行业的大规模应用,并导致出现了数量众多,功能各异的应用程序。应用程序的性能直接关系到用户体验,决定着相应产品的市场控制力,也影响着技术发展的方向和进程。因此,提升程序的性能,特别是运行在嵌入式设备上的应用程序的性能,变得越来越迫切而重要。可执行代码缓存复用技术是一种常用的提升程序性能的方法。通过缓存即时编译器等生成的可执行代码至文件并在运行时复用这些代码,该方法可降低或消除即时编译系统的检测与编译延时,从而提升虚拟机执行效率。代码缓存复用技术的关键是消除可执行代码中的位置依赖从而确保可执行代码的位置无关性。这需要编译器在编译方法时按特定的策略和代码存储格式完成可指令代码的生成工作。这些策略被称为位置无关代码生成方法,而代码存储格式则称为代码布局方式。现有的位置依赖消除方法是使用符号表在编译过程中,编译器从代码中的位置相关处提取所依赖的符号信息,并计算各符号相对于程序地址空间中某一全局固定位置的地址偏移;符号及其偏移被存储在统一的符号表中,符号表及其描述信息与代码一起存储至文件系统。该方法的实质是将位置依赖的直接引用替换为间接引用,将代码中位置相关点的地址绑定操作推迟到运行时完成。因该方法必须配合专门的动态链接器和链接过程,增加了程序执行等待时间和即时编译器的实现难度;维护符号表、计算符号偏移也需很大开销,所以适用静态编译器却不适宜于即时编译器系统,更不适用嵌入式平台。嵌入式平台的处理器能力相对较弱,内存等硬件资源有限且多数为电池驱动,因此,为在嵌入式平台上更高效地缓存复用代码,必须设计新的针对嵌入式系统这些特征设计的位置无关代码生成方法和代码布局方式。
技术实现思路
本专利技术的目的是提供一种高效、且轻量级的位置无关代码生成方法,并在Android操作系统内置虚拟机Dalvik上将其实现,为代码缓存复用等更多优化技术提供基本支持,从而提闻程序性能。本专利技术首先调研了 Dalvik虚拟机生成的可执行代码中的位置相关性,并分析总结了这些相关性对可执行代码的影响;然后,针对可执行代码中不同种类的位置依赖,分别提出了消除依赖的方法,并实现了相应的代码生成器。其中采用对象引用即时解析和按需解析技术,取代传统的基于符号表和链接器的解析技术,尤其适合嵌入式平台。调研结果显示,虚拟机的即时编译器生成的可执行代码中主要存在以下位置依赖信息I、分支跳转目标位置。当分支指令的目标地址为绝对寻址时,该指令就是位置相关的。2、函数位置,即虚拟机函数的入口地址。当Java程序在执行过程中需调用非Java语言编写函数时,调用指令依赖函数具体地址。3、数据位置,即指令的操作数。可执行代码中的数据位置依赖主要是指令的操作数,它们包括Java类对象引用、实例的引用、数组引用以及字符串常量的引用等。这些对象的虚拟机内部表示为结构体,因此,其引用实质上是指向特定结构体的指针。它可能以寄存器中的全局变量或编译器为简便指令操作而嵌入指令流中的立即数形式出现。4、异常处理器位置。异常处理功能因其实现差别,也可能使代码位置相关。例如,当定位异常表中的Try、Catch块使用绝对寻址时,跳转指令依赖异常处理器目标地址。本专利技术提供的位置无关代码生成方法,主要目标是消除上述四种依赖。具体说来, 本专利技术使用基于PC寄存器的相对寻址和特殊代码格式布局消除分支跳转目标位置依赖和异常处理器位置依赖;使用简单函数表消除函数位置依赖;将依赖数据和对该数据的解析过程嵌入指令流中的运行时按需解析和即时解析技术,消除数据位置依赖。本专利技术设计的位置无关代码生成方法,包括两个方面针对不同位置依赖的消除方法和整体代码布局方法。本专利技术的位置依赖消除方法分别针对上述四种位置依赖信息,设计了位置相关性消除策略。对于分支跳转目标位置依赖和异常处理器位置依赖,本方法采用基于PC寄存器的相对寻址策略与整体代码内存布局一起实现消除。图I示例了整体代码内存布局,该内存布局演示了对分支指令跳转目标的依赖消除其中的Idr r2, 和add pc,pc, r2指令即是以PC为基址寄存器,在常量池中存储跳转目标,使代码避免绝对地址跳转,从而消除位置中的依赖。对于函数位置依赖,本专利技术使用简单函数表将函数调用转换为间接调用。首先,本专利技术在线程的本地存储结构TLS (Thread Local Storage)中存储函数表,并在表中存储各函数在当前虚拟机实例的地址,然后在各个方法的栈帧中存放指向该结构体的指针。在生成代码时,编译器从栈帧中取得该TLS结构的指针;然后借助函数名查询其在函数表中的位置,该位置是相对于TLS结构首地址的偏移;最后生成代码。由于在不同虚拟机实例中虽然相同函数的绝对地址不同,但是相对于函数表的偏移地址却是相同的,因此对函数地址的依赖消除解决了位置无关性代码中的一个难点。本方法一般适用于对虚拟机内部函数的调用,此类函数需要在编译器中明确的指出,并不适用于普通的Java函数。图2展示了该种方法,图中下框所示代码片段即为即时编译器使用该策略生成的代码。其中tlsOffset是TLS结构指针在栈帧中的位置偏移,offset是被调用函数在TLS结构中的位置偏移。通过三元组<SP, tlsOffset, offset〉可以唯一确定任意函数,而该三元组中不包含任何位置依赖。因此,使用图2所示策略可成功消除函数位置依赖。对于数据位置依赖,本专利技术采用即时解析方法消除。本专利技术首先在指令流中为这些引用预留出位置(初始化为空值),然后生成引用解析逻辑代码以在运行时对这些预留位置的值进行解析回填。其中,未被回填的代码被称为原始代码,它们是位置无关的;回填后的代码是原始码的一份拷贝,它的引用位置与虚拟机的具体实例相关。图3是本专利技术使用该所设计的数据位置依赖消除策略过程。该策略将代码依赖的引用数据嵌入指令流中,并提供一条快速执行路径(对应图3中实线)和一条慢速执行路径(对应图3中虚线)。嵌入指令中的引用初始值为空值,其实际值由慢速路径在运行时解析并回填。在慢速路径中,辅助函数负责完成引用的解析回填操作以及相关的字节码功能。按图3所示过程,通常情况下,慢速路径在程序的生命周期中最多只执行一次,执行完后获得的回填代码再次被执行时将选择快速路径。与即时编译的基本原理类似,该方法实现了对所依赖数据引用的按需解析(On-Demand Resolution)与即时解析(Just-In-Time Resolution):如果代码中某些片段不会被执行到,这些片段中的引用就无需解析,而对于会执行到的代码片段,其中的引用在执行之时完成解析并在解析后立刻执行。与传统 的符号表和动态链接的方式相比,按需解析和即时解析技术无需专门的链接器,降低了框架的实现难度;无需链接过程,省去因链式解析带来的执行延时。因此,按需解析和即时解析支持很适于但也不限于嵌入式Java虚拟机平台。在代码布局设计方法中,本专利技术结合位置无关代码生成策略,对代码内存空间做了划分,图I是代码空间布局的具体本文档来自技高网...
【技术保护点】
一种Java虚拟机的位置无关代码生成方法,其特征在于包括两个方面:针对不同位置依赖的消除方法和整体代码布局方法;其中,1、所述针对不同位置依赖的消除方法,包括:?(1)对于分支跳转目标位置依赖和异常处理器位置依赖,采用基于PC寄存器的相对寻址策略与整体代码内存布局一起实现消除,该方法主要适用于Java代码之间的跳转关系;(2)对于函数位置依赖,使用简单函数表将对函数的直接调用转换为间接调用;首先,在线程的本地存储结构TLS中存储函数表,并在表中存储各函数在当前虚拟机实例的地址,然后在各个方法的栈帧中存放指向该结构体的指针;在生成代码时,编译器从栈帧中取得该TLS结构的指针;然后借助函数名查询其在函数表中的位置,该位置是相对于TLS结构首地址的偏移;最后生成代码;由于在不同虚拟机实例中虽然相同函数的绝对地址不同,但是相对于函数表的偏移地址却是相同的,因此对函数地址的依赖消除解决了位置无关性代码中的一个难点;本方法一般适用于对虚拟机内部函数的调用,此类函数需要在编译器中明确的指出,并不适用于普通的Java函数;?(3)对于数据位置依赖,采用即时解析方法消除;在Java代码的执行过程中需要根据一些符号对相应的地址进行解析,然而在代码编译的时候由于代码还未实际执行,因此无法获知此类地址,同时此类解析操作通常比较费时并且每次解析得到的地址都是固定的;本专利技术采用即时解析和回填的方式对此类位置依赖进行消除和优化,方法如下:首先在指令流中为这些引用预留出位置,然后生成引用解析逻辑代码以在运行时对这些预留位置的值进行解析回填;其中,未被回填的代码被称为原始代码,它们是位置无关的;回填后的代码是原始码的一份拷贝,它的引用位置与虚拟机的具体实例相关,解析出来的位置被回填后,下次执行时将不再需要再次执行解析代码而是从回填的地址中直接读取即可得到所需要的位置地址;2、所述整体代码布局方法,结合位置无关代码生成策略,对代码内存空间做了划分,即将位置无关代码存储空间划分三个区间:常量池、代码区和异常信息表区;常量池区存储代码使用常量:用于PC相对寻址的偏移值,可消除分支跳转目标位置依赖和异常处理器位置依赖;代码区存储所有位置无关可执行代码,该区中涉及分支跳转的指令需借助常量池中存储的相对寻址偏移值来保证代码的位置无关性;异常信息表区用于保存各异常处理try块和catch块位置,其存储的值为Java异常处理器相对于当前PC寄存器值的偏移值,这些偏移值用以保证代码区中异常处理跳转目标指令的位置无关性。...
【技术特征摘要】
【专利技术属性】
技术研发人员:杨珉,张源,周波,
申请(专利权)人:复旦大学,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。