使用微代码引擎的java硬件加速器的制作方法

文档序号:6473328阅读:306来源:国知局
专利名称:使用微代码引擎的java硬件加速器的制作方法
背景技术
JavaTM是一种由Sun微系统公司(Sun Microsystems)开发的面向对象的程序设计语言。该Java语言在信源和二进制级面上都是小型、简单和可跨平台和操作系统便携的。这使得Java程序设计语言在因特网上非常流行。
Java的平台独立性和代码紧凑是Java在常规程序设计语言之上的最大优点。在常规程序设计语言中,一个程序的源代码被发送给一个编译器,其转换该程序为机器码或者处理器指令。处理器指令对于系统的处理器而言是原生(native)的。如果在一个基于英特尔的系统上编译代码,则结果程序将仅在其它基于英特尔的系统上运行。如果希望在别的系统上运行该程序,用户必须返回初始的源代码,获得一个编译器用于该新的处理器,并且重新编译该程序为专用于其它处理器的机器代码。
Java操作则不同。Java编译器接受Java程序并且产生字节码(bytecode),而不是产生用于任何特定处理器的机器码。字节码是看起来像机器码的指令,但不是专用于所有的处理器。为了执行Java程序,字节码翻译器接受Java字节码,转换它们为等效的原生处理器指令,并且执行该Java程序。该Java字节码翻译器是Java虚拟机的一个组成部分。
使Java程序处于字节码形式意即不是专用于任何一个系统,只要有一台Java虚拟机可用,该程序就可以在任何平台和任何操作系统上运行。这使一个二进制字节码文件得以跨平台执行。
使用字节码的缺点在于执行速度。直接在硬件上运行的系统专用程序(它们由该硬件进行编译)比Java字节码(其必须由Java虚拟机进行处理)运行显著更快。处理器必须既将该Java字节码转换为Java虚拟机中的原生指令(native instruction)又执行该原生指令。
一种增加Java虚拟机速度的方法是利用诸如“适时工作”(JIT)翻译器的技术,以及被称为“热点JITs”翻译器的甚至于更快的翻译器。所述各JIT版本全都导致用以产生原生处理器指令的JIT编译开销。这些JIT翻译器还导致额外的存储开销。
对于要求以极小内存使用和低能量消耗来运行Java程序的局部成本解决方案的用户设备,Java的缓慢执行速度和JIT翻译器的开销已经使得其难以应用。对于使用最快JITs的现有的处理器的性能要求以软件两倍以上去支持运行Java虚拟机。通过利用超级标量处理器结构或者通过提高该处理器时钟频率可以满足处理器性能的要求。在这两种情况下,功率需要被急剧提高了。由JIT技术引起的存储器膨胀,还违反了低成本和低功率的用户应用要求。
希望拥有一个供执行Java程序的改良系统,其提供了一个低成本的解决方案以供用户设备运行Java程序。
发明概述本发明概括地涉及Java硬件加速器,该Java硬件加速器用于转换Java字节码为用于中央处理单元(CPU)的原生指令。本发明的一个实施例包括一个重发缓存器,该重发缓存器与硬件加速器有关,并且适合于存储随同相关的原生程序计数器值一起发送给CPU的已转换的原生指令。当CPU从一个中断处返回的时候,重发缓存器查验程序计数器以确定是否从重发缓存器重新发送一个存储的原生指令值。通过这种方式,无需再装入硬件加速器转换的指令,就可以有效地处理中断返回。
本发明的另一个实施例包括一个硬件加速器,用以将基于堆栈的指令转换为对一个中央处理单元是原生的基于寄存器的指令。该硬件加速器包括一个原生程序计数器监控器。该原生程序计数器监控器查验是否原生程序计数器是在一个硬件加速器程序计数器范围之内。当该硬件加速器程序计数器是在硬件加速器程序计数器范围之内的时候,硬件加速器启动,并且已转换的原生指令被从该硬件加速器发送给CPU,该原生程序计数器不用于确定从存储器中加载的指令。
以此方式,该硬件加速器可以在一定范围内欺骗该原生程序计数器,该范围对应于其中存储有基于堆栈的指令的程序计数器的范围。通过监控该程序计数器,硬件加速器总是可以知道什么时候其需要被操作和不需要被操作。因此,如果出现一个中断,导致数据程序计数器移动到一个超出硬件加速器程序计数器范围的范围,不需要从CPU给硬件加速器明确的指令,处理该中断而阻塞该硬件加速器。
本发明的又一个实施例包括一个可操作地连接到中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为基于寄存器的指令,该基于寄存器的指令对中央处理单元来说是原生的。该硬件加速器包括一个微代码级。该微代码级包括微代码存储器。该微代码存储器输出包括多个字段,所述各字段包括第一字段组和控制位字段,该第一字段组对应于原生指令字段,而该控制位字段通过该微代码控制逻辑影响第一字段组的译码以产生一个原生指令。微代码部分的使用允许相同的常规硬件加速器结构利用各种各样的中央处理单元工作。在一个优选实施例中,微代码部分是和译码部分分离的。
附图简要说明从下面结合附图的描述中可以进一步理解本发明。


图1是一个包括硬件Java加速器的本发明系统的示意图。
图2是一个举例说明使用本发明硬件Java加速器的示意图。
图3是一个举例说明本发明一个实施例的Java硬件加速器一些细节的示意图。
图4是一个举例说明在本发明的系统中的Java加速器指令转换实施例细节的示意图。
图5是一个举例说明本发明实施例的指令转换操作的示意图。
图6是一个举例说明使用指令级并行运算(instruction levelparallelism)的本发明实施例的指令转换系统的示意图。
图7是一个用于本发明一个实施例的例外(exception)字节码的列表。
图8是一个硬件加速器的实施例的示意图,该硬件加速器实施例供本发明的一个实施例使用。
图9是一个示意图,举例说明供本发明的硬件加速器使用的译码级。
图10是一个示意图,举例说明供图9的译码级使用的指令译码单元的一个实施例。
图11是一个示意图,举例说明供图8的实施例使用的一个微代码级的实施例。
图12是一个供图11的微代码级使用的微代码地址逻辑的示意图。
图13是一个供图11的实施例使用的原生指令设计者(composer)单元的示意图。
图14是一个供图13的原生指令设计者单元使用的寄存器选择逻辑的示意图。
图15举例说明一个本发明实施例的堆栈和变量寄存器管理器。
图16举例说明一个替代方案的本发明实施例的堆栈和变量寄存器管理器。
图17是供本发明一个实施例使用的原生PC监控器的示意图。
图18是供本发明一个实施例使用的重发缓冲器的示意图。
图19和20是举例说明本发明一个实施例的操作的示意图。
优选实施例详细说明图1~7举例说明本发明应用的操作。
图1是一个系统20的示意图,示出和中央处理单元26一起使用的一个硬件Java加速器22。Java硬件加速器22允许Java虚拟机的一部分以硬件实现。这种硬件实现可加快Java字节码的处理。尤其是,在一个优选实施例中,Java字节码成为原生处理器指令的转换至少部分是在硬件Java加速器22中进行的。当以软件实施的时候,这一转换部分地成为该Java虚拟机中的瓶颈。在图1中,来自指令高速缓冲存储器24或者其它存储器的指令被提供给硬件Java加速器22。如果这些指令是Java字节码,硬件Java加速器22可以转换这些字节码为原生处理器指令,原生处理器指令经由多路复用器28被提供给CPU。如果使用了一个非Java码,可以使用多路复用器26来旁路该硬件加速器。Java堆栈包括帧、操作数堆栈、变量等等。
Java硬件加速器可以完成下列任务中的一些任务或者全部任务
1.Java字节码译码;2.只要可能,标识和编码指令级并行运算(ILP);3.转换字节码为原生指令;4.在一个与CPU有关的或者作为一个独立的堆栈的寄存器堆上管理Java堆栈;5.在预先确定的Java字节码上产生有关指令的例外;6.当原生CPU码被提供的时候,切换到原生CPU操作;7.对于阵列指令实施跳跃查验;和8.管理在与CPU有关的寄存器堆上的变量。
在一个优选实施例中,Java虚拟机的字节码解释器、Java寄存器和Java堆栈功能实现于硬件Java加速器中。垃圾收集堆(garbage collectionheap)和常数池区域可以被保存在标准存储器中,并且经由标准存储器索引访问。在一个实施例中,这些功能在例如写入阻碍(write barrier)的硬件中被加速。
Java硬件加速器的主要优点是可提高Java虚拟机工作的速度,并且允许使用现有的原生语言传统应用程序、软件库以及开发工具。专用的微处理器(其中Java字节码是原生指令)则不能进行访问那些传统的应用程序。
虽然在图1中Java硬件加速器表示成独立于中央处理单元,Java硬件加速器可以被结合进中央处理单元中。在那种情况下,中央处理单元具有一个Java硬件加速器子单元,用于将Java字节码转换为原生指令以通过CPU的主要部分操作。
图2是一个状态机示意图,示出本发明一个实施例的操作。模块32是加电状态。在加电期间,设定多路复用器28以旁路Java硬件加速器。在模块34中,运行原生指令启动程序。模块36示出该系统以原生方式执行原生指令,并且旁路Java硬件加速器。
在模块38中,该系统切换到Java硬件加速器方式。在Java硬件加速器方式中,Java字节码被传送给Java硬件加速器22,转换为原生指令,然后发送给CPU用于操作。
Java加速器方式可以对某些Java字节码产生例外。这些字节码不由硬件加速器22处理,而是在CPU26中处理。如模块40所示,该系统工作在原生方式,但是Java虚拟机在加速器中实现,该加速器进行字节码转换,并且处理在Java加速器方式中产生的例外。
难以用硬件处理的比较长和更复杂的字节码可以被选择去产生例外。图7是一个示出可能的字节码目录的列表,该字节码可以在一个优选实施例中引起例外。
图3是一个示意图,举例说明本发明的Java硬件加速器的一个实施例细节。该Java硬件加速器包括Java加速器指令转换硬件42。指令转换单元42用于转换Java字节码为原生指令。在下面对应图4更详细地描述Java加速器指令转换硬件42的一个实施例。这些指令转换硬件42使用存储在硬件Java寄存器44中的数据。硬件Java寄存器存储在Java虚拟机中定义的Java寄存器。该Java寄存器包括Java虚拟机的状态,影响其操作,并且在运行时刻被更新。在Java虚拟机中的Java寄存器包括PC,即表示多少字节码正在被执行的程序计数器(program counter);Optop,即一个指向操作数堆栈顶端的指针;帧,即一个指向当前方法的执行环境的指针;以及Java变量(Var),即一个指向目前执行的方法可利用的第一原生变量的指针。虚拟机规定这些寄存器为单个的32位字宽。该Java寄存器也被存储在Java堆栈中,该Java堆栈可以被作为硬件Java堆栈50实现,或者该Java堆栈可以被存储进相关的寄存器堆的CPU中。
在一个优选实施例中,硬件Java寄存器44可以包括供指令转换硬件42使用的附加的寄存器。这些寄存器可以包括一个表示切换到原生指令配置的寄存器和控制寄存器,以及一个表示该系统版本号的寄存器。
Java PC可用于从指令高速缓冲存储器24或者存储器获得字节码指令。在一个实施例中,Java PC由在多路复用器52中的中央处理单元26的标准程序计数器54多路复用。该标准PC54不在Java硬件字节码转换操作期间使用。在另一个实施例中,标准程序计数器54被用作Java程序计数器。
Java寄存器是Java虚拟机的一部分,并且不应该与通用寄存器46或者48相混淆,通用寄存器46或者48是由中央处理单元26操作的。在一个实施例中,该系统除了一个Java CPU寄存器堆48之外使用传统的CPU寄存器堆46。当在原生代码上运行时,路复用器56连接常规的寄存器堆46到CPU26的执行逻辑26c。当Java硬件加速器被激活的时候,Java CPU寄存器堆48代替常规的CPU寄存器堆46。在另一个实施例中,使用常规的CPU寄存器堆46。
如在下面对应图3和4所做描述,Java CPU寄存器堆48,或者在一个替代性实施例中描述的常规的CPU寄存器堆46,可用于存储部分操作数堆栈和一些变量。以这种方法,当操作数堆栈和变量值存储在JavaCPU寄存器堆48中,或者该值存储在常规的CPU寄存器堆46中时,来自Java加速器指令转换器42的原生的基于寄存器的指令可以运行。除了所发出的装入/存储指令之外,经由连接到存储器判优器62的上溢/下溢线路60,数据可以从该数据超高速缓存或者其它的存储器58被写入和离开Java CPU寄存器堆48。数据往返于存储器的上溢/下溢传送可以与CPU操作同时进行。另一方面,当该CPU不工作时,上溢/下溢传送可以明确地进行。当Java堆栈上溢或者下溢的时候,上溢/下溢总线60可以被作为一个三态总线或者作为二个独立的总线实现,去读取进入该寄存器堆的数据和写离开该寄存器堆的数据。
另一方面,用于该CPU的寄存器堆可以被作为具有原生指令的单个寄存器堆实现,该原生指令用于操纵加载操作数堆栈和变量值往返于存储器。另一方面,可以使用多个Java CPU寄存器堆一个寄存器堆用于变量值,另一个寄存器堆用于操作数堆栈值,以及另一个寄存器堆用于存放方法环境信息的Java帧堆栈。
Java加速器控制器(协同处理单元)64可用于控制硬件Java加速器,从硬件Java寄存器44和Java堆栈50读入和读出,并且当一个“分支占用”信号来自CPU执行逻辑26c时,刷新(flush)Java加速器指令转换流水线。
CPU26被分成各流水线级,包括有指令取出26a、指令译码26b、执行逻辑26c、存储器存取逻辑26d、及写回逻辑26e。执行逻辑26c执行原生指令,从而可以确定是否采用了一个分支指令,并且发出“采用分支”信号。在一个实施例中,执行逻辑26c监控用于检测支路的程序地址。图4举例说明一个可用于本发明的Java加速器指令转换器的实施例。指令缓冲器70存储来自指令高速缓冲存储器的字节码指令。字节码被发送给一个并行译码单元72,并行译码单元72同时译码多个字节码。为了允许指令级并行运算,多个字节码被同时处理。即,多个字节码可以被转换为较少数量的原生指令。
经过译码的字节码被发送给一个状态机单元74和运算逻辑单元(ALU)76。ALU76被提供去重新排序字节码指令以使它们更容易被状态机74运行,并且实施各种各样包括计算存储器索引的算术功能。状态机74使用查询表78转换字节码为原生指令。因此,状态机74提供一个表示在微代码查询表78中想要的原生指令的地址。计数器被保持以保存已经在操作数堆栈上设置了多少个输入的数字,以及跟踪和更新在存储器和寄存器堆中的操作数堆栈的顶端。在一个优选实施例中,微代码查询表78的输出在线路80上与运行于原生CPU寄存器堆中的寄存器的指示添加。该寄存器指示来自于计数器并且译自于字节码。为了实现这些,必须具有一个硬件指示,表明在寄存器堆的哪些入口有哪些操作数和变量。在此基础上构成原生指令。另一方面,这些寄存器指示可以直接发送给如图3所示的Java CPU寄存器堆48。
除了在Java CPU寄存器堆48中或者在常规的CPU寄存器堆46中的堆栈和变量的设置指示之外,状态机74能访问在44中的Java寄存器。缓冲器82提供转换的原生指令给CPU。
本发明一个实施例的Java硬件加速器的操作在图5和6中举例说明。图5的部分I示出Java字节码的指令转换。对应于助记符iadd的Java字节码被Java虚拟机解释为一个采用操作数堆栈的顶端二个值的整数操作,将其相加,并将结果推到操作数堆栈的顶端。该Java转换机转换Java字节码为原生指令,诸如指令ADDR1,R2。这是一个原生于CPU的指令,表示寄存器R1中的值与寄存器R2中的值相加,并且在寄存器R2中存储这个结果。R1和R2是在操作数堆栈中的顶端二个入口s。
如图5部分II中所示,Java寄存器包括一个“值A”的PC值,其被加1为“值A+1”。Optop值从“值B”改变为“值B-1”,以表示操作数堆栈的顶端处于一个新的位置。指向变量列表开始的变量基准值不改变。在图5部分III中,原生CPU寄存器堆或者在图3中的Java CPU寄存器堆48的内容被示出。Java CPU寄存器堆从寄存器R0~R5开始,寄存器R0~R5包括操作数堆栈值以及寄存器R6~R7包括变量值。在操作原生指令之前,寄存器R1包括操作数堆栈的顶端值。寄存器R6包括第一个变量。硬件用于在寄存器堆中检测变量的可利用性。如果该变量是不可用的,硬件和微代码一起发出加载指令给原生CPU。一旦一个变量值已经被在RF中更新,其入口就标记为正在修改,从而当进行方法调用的时候,仅在存储器中更新的变量被回复给存储器。这样就导致明显更高性能的方法。
在执行原生指令之后,寄存器R2此刻包括操作数堆栈的顶端值。寄存器R1不再包括一个有效的操作数堆栈值,并且可以用来由一个操作数堆栈值改写。
图5的部分IV示出操作数堆栈和变量的存储位置,其可以被存储在数据超高速缓存58或者主存储器中。为了方便起见,举例说明的存储器没有举例说明所有的虚拟存储器配置。在执行原生指令之前,操作数堆栈的顶端地址Optop是“值B”。在执行原生指令之后,操作数堆栈的顶端地址是包括原生指令结果的“值B-1”。请注意,操作数堆栈值“4427”可以通过上溢/下溢线路60被写入寄存器R1中。当转换到原生方式时,在Java CPU寄存器堆48中的数据应被写入到数据存储器。
在硬件Java寄存器44、Java CPU寄存器堆48和数据存储器之间必须保持一致性。CPU26和Java加速器指令转换单元42被用流水线输送,并且每当有一个“分支采用”信号时,必须能消除对于硬件Java寄存器44的任何改变和用于Java CPU寄存器堆48的控制信息的改变。系统最好是使用缓冲器(未示出)以确保这种一致性。另外,Java指令转换必须进行,以便避免在指令转换单元和CPU中的流水线故障。
图6是一个举例说明具有本发明的指令级并行地址运算操作的示意图。在图6中,Java字节码iload_n和iadd被Java字节码转换器转换为单个的原生指令ADDR6,R1。在Java虚拟机中,iload_n将由Java寄存器变量表示的顶端原生变量推入操作数堆栈。
在本发明中,Java硬件转换器可以合并iload_n和iadd字节码为单个原生指令。如图6中部分II所示,Java寄存器PC被从“值A”更新为“值A+2”。Optop值仍然是“值B”。值Var保持在值“C”。
如图6中部分III所示,在原生指令ADDR6,R1执行存储在寄存器R6中的第一原生变量值之后,“1221”被加到包含在寄存器R1中的操作数堆栈的顶端值,并且结果存储在寄存器R1中。在图6的部分IV中,Optop值没有改变,然而在寄存器的顶端中的值包含增加指令的结果,1371。这个例子显示本发明以原生CPU操作而仅支持二个操作数。本发明还可以支持三个操作数以及超长指令字(VLIW)CPU的操作数。
对于某些由硬件和微代码构成(120)的字节代码,诸如SiPush、BiPush等等,本发明使得与原生指令紧邻的字段的符号扩展的数据可利用。做为选择,这个数据可以被当作一个协处理器寄存器。如在本发明中所述,协处理器寄存器读/写入指令可以由硬件加速器发出。另外,微代码具有几个字段,其有助于构成原生指令。
本发明的Java硬件加速器尤其非常适合于一种嵌入的解决方案,其中硬件加速器被作为现有的CPU设计而置于相同的芯片上。这允许使用原先存在的软件库和用于传统应用的开发工具。此外,本实施例的体系结构是可伸缩的,从而适合从智能卡到桌面解决方案范围的各种各样的应用。这种可伸缩性在图4的Java加速器指令转换单元中实现。例如,对于各种各样的不同的CPU结构,查询表78和状态机74可以被修改。这些CPU结构除了复杂指令系统计算机(CISC)结构之外包括简化指令系统计算机(RISC)结构。本发明还可以被超级标量CPU或者超长指令字(VLIW)计算机使用。
图8~20举例说明本发明的操作。图8是一个示出本发明一个实施例的系统100的示意图。系统包括一个CPU101和一个硬件加速器。硬件加速器部分包括一个译码级102,用于从存储器接收Java字节码。译码级102最好是使用指令级并行运算,其中一个以上Java字节码可以被转换为单个原生指令。在一个优选实施例中,系统100包括一个微代码级104,其从译码级102接收信号,并且被用于构成原生指令。微代码级104允许从单个字节码产生多个原生指令。当它们被发送给CPU101之时,重发缓冲器106在重发缓冲器106中存储一份转换的指令。
重发缓冲器106监控原生PC值110。在一个优选实施例中,当硬件加速器被激活的时候,硬件加速器不使用原生PC值去确定从存储器中加载指令的存储位置。原生PC值被代之以保持在一个欺骗的范围内,其表示硬件加速器被激活。在一个优选实施例中,原生PC监控器110检测是否原生PC值是在欺骗的范围之内。如果是这样的话,多路复用器112从硬件加速器发送转换的指令到CPU101。不然的话,来自存储器的原生指令被加载给CPU101。当在欺骗的范围中的时候,来源于存储器的地址是来自加速器的Java PC。否则,原生PC来源于存储器。
如果出现一个中断,原生PC值将达到一个处于欺骗范围之外的值。PC监控器110于是将阻塞硬件加速器。当出现一个中断返回的时候,CPU101将被刷新,并且当中断返回时,原生PC值108返回到在中断之前的PC值。重发缓冲器106于是将重新发送从CPU101刷新的存储的原生指令给CPU101,其对应于这个现有的原生PC值。借助于这个系统,当出现一个中断时,硬件加速器不需要被刷新,也不需要预先转换的Java字节码被再装入硬件加速器。因此,使用重发缓冲器106可以加速操作并且从中断恢复。
CPU101与寄存器堆113有关。这个寄存器堆是原生CPU的标准寄存器堆,可操作地连接到该CPU的ALU,但是为了说明起见在这里被分别地示出。寄存器堆113存储堆栈和变量值,其可以通过转换的指令使用。堆栈和变量管理器114跟踪存储在寄存器堆113中的所有的信息,并且使用它以有助于微代码级工作。如在下面描述的,在一个实施例中,存在固定数量的寄存器被用于堆栈值和变量值。例如,六个寄存器可以用于该顶端六个堆栈值,并且六个寄存器被用于六个变量值。
在本发明的另一个实施例中,堆栈和变量管理器分配堆栈和变量值给在寄存器堆中不同的寄存器。这个替换的实施例的一个优点是,有时候由于一个调用请求堆栈和变量值可以交换,并且这样的一个交换可以在该堆栈和变量管理器114更有效地进行,而不是产生许多原生指令去实现这一点。
在一个实施例中,多个重要的值可以存储在硬件加速器中,以协助系统的操作。存储在该硬件加速器中的这些值有助于改善该系统的操作,尤其当该CPU的寄存器堆被用于存储Java的堆栈部分的时候。
硬件加速器最好是存储一个堆栈值顶端的指示。这个顶端堆栈值有助于从存储器加载堆栈值。当指令被从基于堆栈的指令转换为基于寄存器的指令之时,该顶端堆栈值被更新。当使用指令级并行运算的时候,属于单个基于寄存器的指令的每个堆栈基准指令需要被估算其对Java堆栈的影响。
在一个实施例中,一个操作数堆栈深度值被保存在硬件加速器中。这个操作数堆栈深度表示在CPU的寄存器堆中操作数堆栈的动态深度。因此,如果四个堆栈值被存储在该寄存器堆中,堆栈深度指示器将读出“4”。知道堆栈在寄存器堆中的深度有助于加载和存储堆栈值进出该寄存器堆。
在一个优选实施例中,在硬件加速器之内保存最小堆栈深度值和最大堆栈深度值。堆栈深度值与该最大和最小堆栈深度值相比较。当该堆栈值低于最小值的时候,硬件加速器构成加载指令将堆栈值从存储器加载到CPU的寄存器堆。当堆栈深度高于最大值的时候,硬件加速器构成存储指令经堆栈值存储回存储器。
在一个实施例中,在CPU寄存器堆中至少操作数堆栈的顶端四个(4)入口作为一个环形缓冲器,该环形缓冲器保存在加速器中,并且可操作地连接到一个上溢/下溢单元。
硬件加速器此外最好是存储一个操作数和存储在CPU的寄存器堆中的变量的指示。这些指示允许硬件加速器去从输入的基于堆栈的指令构成转换的基于寄存器的指令。
硬件加速器同样最好是在存储器中存储一个变量基准和操作数基准的指示。这允许在CPU的寄存器堆和存储器之间加载和存储变量和操作数以构成指令。例如,当寄存器堆中没有一个可用的变量时,硬件发出加载指令。该硬件适于将变量数目乘以4,并且加上变量基准以产生变量的存储位置。所产生的指令是基于了解该变量基准是在一个临时的原生CPU寄存器中。变量数乘以4可以使被构成作为原生指令紧邻的字段是可利用的,其可以是一个带有地址的存储器访问指令,该地址是该临时寄存器的内容,该临时寄存器保持一个对该变量基准加上一个即时偏移的指针。做为选择,该变量的最终存储位置可以由该CPU作为一个由该加速器保存的指令而读取,然后该变量可以被加载。
在一个实施例中,当通过Java字节代码的执行而更新时,硬件加速器将该变量标记为经过修改的。对于某些字节码,该硬件加速器可以将标记为经过修改的变量复制到系统存储器。
在一个实施例中,硬件加速器构成原生指令,其中该原生指令操作数包括至少二个原生CPU寄存器堆索引,这里该寄存器堆内容是用于操作数堆栈和变量的数据。
图9举例说明本发明一个实施例的译码级。这个译码级102′被分成预取级116和指令译码118。预取级116包括一个字节码缓冲器和调准预取级单元120,其从一个存储器(未示出)接收原始的字节码。Java字节码缓冲器控制部件122提供指令去确定什么时候从该存储器中加载附加的字节码。地址单元124使用Java程序计数器126去确定下一个加载的字节码的位置。如上所述,当该硬件加速器被激活时,Java程序计数器被用于从包括Java字节码的存储器中得到下一个字。原生PC被保存在一个欺骗区域内,且不在硬件加速器被激活时用以取得下一个指令。字节码缓冲器调准单元120包括许多来自存储器的字节码。当指令被从指令译码单元118传递的时候,多个字节被从字节码缓冲器调准单元120上除去。在线路128上的信号表示由指令译码单元118使用的字节码的数目。在一个实施例中,在线路130上的该译码的数据被发送给微代码级。这个数据可以包括微代码起始地址数据130a、索引/地址和变量数据130b,以及变量控制数据130c。
图10示出一个指令译码单元118′。在这个实施例中,多个字节被发送给一个指令译码单元。单个的译码单元132、134、136、138和140接收和译码该字节。请注意到,相邻字节的值影响该字节如何被译码。例如,如果字节A是一个两字节指令的开始,字节B的值就被解释为该两字节指令的后半部分。指令级并行运算逻辑142接收所译码的信息,然后确定用于主要字节码的微代码起始地址。通过按照转换的指令访问的寄存器的选择,辅助的字节代码可以与主要字节码结合。在下面对应于图19和20描述这一实施例的一个例子。
加速器ALU144被用于计算索引地址等等。该加速器ALU被连接到寄存器池。使用加速器ALU允许某些简单计算被从CPU单元移动到硬件加速器单元,因此允许Java字节码被转换为较少的原生指令。“变量选择+其它控制”单元146确定哪些寄存器被用作变量。来自ILP逻辑单元142的变量控制线表示如何解释这些变量。变量和相关的变量控制线在原生CPU的指令中对于每个操作数字段都是可用的。
在一个实施例中,当在原生CPU寄存器堆中不存在变量的时候,硬件加速器发出原生加载指令,存储器地址则由在硬件加速器中的ALU计算。
在图11中示出的微代码级104′包括一个微代码地址逻辑148和微代码存储器150。微代码地址逻辑发送微代码地址给微代码存储器150。然后,微代码存储器150发送该地址的内容给原生指令设计者逻辑152,该原生指令设计者逻辑152产生原生指令。每个微代码存储器线路包括主要指令部分联线154、控制位联线156以及更新堆栈指示器位联线158。微代码地址逻辑148和微代码150两者可以产生一连串的原生指令,直至更新堆栈位被发送给微代码地址逻辑148——在该点,微代码地址逻辑从译码逻辑(未示出)获得另一个起始地址。原生指令设计者在联线154上接收主要指令部分(即来自译码的控制位)、索引地址、变量以及变量控制。这些输入使原生指令设计者152得以构成原生指令,其被发送给重发缓冲器和原生CPU。
图12示出本发明一个实施例的微代码地址逻辑148′。来自于译码逻辑的起始地址进入到多路复用器154。多路复用器154可以或者发送该起始地址或者一个递增的或者计算得出的值给微代码RAM。在一个优选实施例中,当更新堆栈位未被设置时,在微代码中的下一个部件的地址被ALU156计算,并且提供给多路复用器154以发送给微代码存储器(未示出)。通过包括跳转到微代码存储器的其它区域可节省在微代码RAM存储器中的空间。这些跳转可以通过在单元158中的计算或者通过在线路160上提供该地址来完成。
图13举例说明一个供本发明使用的原生指令设计者单元的实施例。在这个实施例中,提供了多个寄存器选择逻辑单元162、164和166。每个寄存器选择逻辑单元可用于选择一个以原生指令使用的寄存器。特定资源逻辑单元168和选择逻辑170允许选择专用指令。
图14示出本发明一个实施例的寄存器选择逻辑161′。寄存器确定逻辑172根据变量控制位、微代码控制位和堆栈及变量寄存器管理器信息而确定使用哪个寄存器。例如,如果指令是加载该堆栈的顶端,则随后字节码寄存器确定逻辑172就可以使用这个堆栈的顶端值去确定包含该堆栈顶端值的寄存器R10,从而在转换的指令中使用寄存器R10。
寄存器重新映射单元174进行寄存器重新映射。在常规的CPU中,某些寄存器被保留。寄存器重新映射单元174允许译码器逻辑去假定堆栈和变量寄存器是虚拟的,其简化了计算。多路复用器176允许在线路171上的值无需修改地传送。
图15举例说明一个堆栈和变量寄存器管理器114′的实施例。堆栈和变量寄存器管理器保存指示有什么存储在CPU的寄存器堆的变量和堆栈寄存器中。这个信息然后被提供给译码级和微代码级以帮助译码Java字节码和产生适当的原生指令。
在一个优选实施例中,堆栈和变量寄存器管理器的一个作用是保存堆栈顶端的指示。因此,例如若寄存器R1~R4存储4个来自存储器或者通过执行字节代码的顶端堆栈值,随着数据被加载进、出于寄存器堆,该堆栈的顶端将改变。因此,在该寄存器堆中寄存器R2可以是该堆栈的顶端,而寄存器R1是该堆栈的底端。当一个新数据被加载进在该寄存器堆内的堆栈的时候,数据将被加载进寄存器R3,于是寄存器R3变为该堆栈的新的顶端,该堆栈的底端仍然是R1。当在寄存器堆中的堆栈上加载二个以上项目时,在寄存器堆中的堆栈的新顶端将是R1,但是最初的R1将由加速器上溢/下溢单元写回给存储器,且R2将是在CPU寄存器堆中的部分堆栈的底端。
图16举例说明一个替代方案的堆栈和变量寄存器管理器114″。在这个替代方案的实施例中,保持一个寄存器分配表172。该寄存器分配表保存在哪些寄存器中存储有哪些变量和堆栈变量的指示。当一个指令被译码的时候,使用寄存器分配表172查验是否一个变量或者堆栈值被存储在寄存器堆中。如果存在一个与输入堆栈或者变量值的匹配,在CPU的寄存器堆内的值被使用。如果不存在匹配,可以从存储器加载该值进该寄存器堆,并且该寄存器分配表被更新。在一个实施例中,一个调用分配逻辑单元174可操作地与寄存器分配表相连接。当发生调用的时候,典型地一些堆栈和变量的值被交换。通过使用再分配逻辑174在寄存器分配表172内重新指定该值,可以加速调用操作。
图17示出一个原生PC监控器110′的实施例。原生PC值与一个高值域寄存器和一个低值域寄存器相比。如果该原生PC值是在这个范围之内,硬件加速器被启动而使用线路178。否则,该硬件加速器被停用。部件180测试是否原生PC值接近于欺骗范围的高端。如果是这样的话,系统促使跳转到原生PC单元的一个更低的值。
图18举例说明一个重发缓冲器106′的实施例。该重发缓冲器接收转换的指令,并且连同相关的原生PC值一起存储它们。只要没有中断,原生PC值将连续地递增,并且下一个指令和当前的原生PC被存储在该重发缓冲器中,并且指令发出给CPU。当出现一个中断的时候,该CPU流水线被刷新,包括非执行指令,其中在该重发缓冲器中存在一份副本。当从一个中断发生返回的时候,CPU被刷新,并且在该中断之前的原生PC值被恢复。这个恢复的原生PC值和一个存储在PC值存储器184中的原生PC相匹配,导致一个在老的指令存储器186中缓存的指令被提供给CPU。该老的指令存储器和该PC值存储器被同步。一旦所有的老的指令被提供给CPU102,原生PC值将超出在存储器184中所有的老的PC值的范围,并且新的转换的指令将被提供。重发缓存器的深度取决于在CPU102(未示出)中流水线级的数目。在诸如分支这样的特定条件下,重发缓存器被刷新。如上所述,该重发缓存器减轻了硬件加速器的操作。硬件加速器不需要知道CPU的中断返回操作的细节。因此,不需要较大修改硬件加速器体系结构,该硬件加速器就可以用各种各样不同的CPU操作。对微代码级的改变足以改变硬件加速器,使得其可以被不同的CPU使用。
图19和120举例说明本发明的系统的一个实施例的操作。在图19中,所示多个指令由译码器级接收。顶端二个指令是整数加载,而底端指令是整数相加。系统对这些字节码的理想结合将是主要操作码为相加,并且二个加载结合在一起。该系统测试是否每个变量都在存储器中。在这个例子中,iload31不是一个存储在存储器中的变量。因此,变量31的值就需要从存储器中被加载进一个空闲寄存器。在这个例子中,存储在堆栈管理器中的变量基准被加载进临时的寄存器R10。该字被放置进堆栈的顶端,或者在这种情况下,在该寄存器堆中指示堆栈的顶端。
图20举例说明一个当使用iload_3和iload_5的时候的例子。在这个例子中,这两个变量被存储在寄存器堆内。因此,相加可以与二个加载结合。在这个例子中,Var_H被表示为3,Var_L被表示为5。操作(op)类型被表示为iadd。Var_H控制和Var_L控制表示该变量是加载类型并且在寄存器堆中。堆栈修改的顶端是+1。这是因为对二个加载要将二个值加载到堆栈上,并且作为主要加法操作的结果而从堆栈减去一个值。
实际上,结合以上做了描述的附图可以理解,变量3和变量5已经存储在二个寄存器堆内。这些寄存器堆的值由该系统所确定。指令iload3、iload5和iadd通过确定哪二个寄存器存储变量3和变量5和确定哪个寄存器去存储该堆栈的新的顶端而执行。如果变量3被存储在寄存器R9中,而变量5被存储在寄存器R11中,且堆栈的顶端将被存储在寄存器R2中,则转换的原生指令就是在寄存器R9内的值加到在寄存器R11内的值上且将该值存储到寄存器R2。因此,这个原生指令同时进行三个字节码的操作,作为在原生CPU上的操作而导致指令级并行运算。
另外,在硬件加速器内配置了一个ALU,这里译码的字节代码指令用于字节码诸如GOTO和GOTO_W,在字节码指令之后紧邻的分支偏移按照被符号扩展和被添加给当前的字节码指令的Java PC,并且结果被存储在Java PC寄存器中。除了将下一个字节代码指令的Java PC推到操作数堆栈上之外,JSR和JSR_W字节码指令也如此进行。
Java PC被由硬件加速器计算的一个值递增。这个递增值是基于在当前译码期间被安排的字节的数目,其由于ILP而可以包括一个以上字节代码。类似地,SiPush和BiPush指令也被符号扩展,并且在所组成的原生指令的紧邻的字段中使其可利用。在某些处理器中,原生指令的紧邻的字段比希望的偏移或者符号扩展的常数具有较小的位宽,因此这个数据可以作为存储映射或者I/O映射读取。
虽然参考以上所述的实施例已经描述了本发明,各优选实施例和方法的这种描述不应视为有限定意义。例如,在说明书或者权利要求中的术语Java应视为涵盖了使用基础Java概念的后继的编程语言或者其它编程语言(使用诸如字节码的通用指令以表示虚拟机的操作)。还应理解,本发明的所有方面不限于特定描述,或是在此所提出的配置。当参考了本发明的内容,对本发明所公开的各种各样的实施例(以及本发明的其它变化方案)在形式上和细节方面进行某些修改对所属技术领域的专业人员将是显而易见的。因此,期望以所附权利要求来涵盖落在本发明的实质精神和范围之内的所有这样的修改或者变化。
权利要求
1.一种系统,包括一个带有相关的原生程序计数器的流水线中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,该硬件加速器包括一个重发缓存器,该重发缓存器适合于存储所转换的原生指令,该转换的原生指令随同一个该指令顺序的指示一起发出给该中央处理单元,所述系统当该中央处理单元从一个中断返回时,该重发缓存器查验该指示以确定是否重新发送一个存储的原生指令值。
2.一种系统,包括一个中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,该硬件加速器包括一个微代码级,该微代码级包括一个微代码存储器,该微代码存储器输出包括多个字段,该字段包括第一字段组和控制位字段,该第一字段组对应于原生指令字段,该控制位字段通过微代码控制的逻辑影响该第一字段组的译码从而产生一个原生指令。
3.一种系统,包括一个中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于接收基于堆栈的指令,该硬件加速器包括一个微代码产生单元,该微代码产生单元适合于接收基于堆栈的指令并由此产生微代码指令,该硬件加速器还包括微代码翻译逻辑,该微代码翻译逻辑适合于接收该微代码并由此产生原生指令,该原生指令被发送给该中央处理单元。
4.一种系统,包括一个中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,该硬件加速器存储一个操作数堆栈顶端指针的指示,该操作数堆栈的顶端在硬件中存储和更新,其中当一个以上基于堆栈的指令被转换为单个的基于寄存器的指令时,该栈顶指针被修改,以便反映每个基于寄存器的指令、基于堆栈的指令和指令级并行运算的影响。
5.一种系统,包括一个带有相关的寄存器堆的中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,该硬件加速器存储一个操作数堆栈部分的深度数的指示,该操作数堆栈存储在该中央处理单元寄存器堆中,在该转换过程期间,该深度数被更新。
6.一利系统,包括一个中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,该硬件加速器存储一个操作数堆栈部分的深度数的指示,该操作数堆栈存储在该中央处理单元寄存器堆中,在该转换过程期间,该深度数被更新,该硬件加速器查验是否该堆栈深度低于最小深度或者高于最大深度,其中如果该深度小于该最小深度,该硬件加速器就产生加载指令而从外部存储器加载操作数堆栈数据到该寄存器堆,且其中如果该深度大于该最大深度,该硬件加速器就产生存储指令而从寄存器堆传送操作数堆栈数据到该外部存储器。
7.一种系统,包括一个带有相关的寄存器堆的中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,该硬件加速器存储一个操作数和变量的指示,该操作数和变量存储在该中央处理单元的寄存器堆中,所存储的指示在该转换过程期间被使用并且由该硬件加速器更新。
8.一种系统,包括一个带有相关的寄存器堆的中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,该硬件加速器在作为一个环形缓冲器的原生中央处理单元寄存器堆中存储操作数堆栈的至少顶端四个(4)入口,该环形缓冲器保存在该加速器中,并且可操作地连接到一个上溢/下溢单元。
9.一种系统,包括一个带有相关的寄存器堆的中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,该硬件加速器在该原生的中央处理单元寄存器堆中存储Java变量,以及一个在该原生的中央处理单元寄存器堆中有哪些变量的指示。
10.一种系统,包括一个带有相关的寄存器堆的中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,其中该硬件加速器基于在该原生中央处理单元寄存器堆中的变量和操作数的可利用性而构成原生指令。
11.一种系统,包括一个带有相关的寄存器堆的中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,其中当通过Java字节码的执行而更新的时候,该硬件加速器将在该原生中央处理单元寄存器堆中的变量标记为经过修改的。
12.一种系统,包括一个带有相关的寄存器堆的中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,其中当在该原生的中央处理单元寄存器堆中不存在一个变量的时候,该硬件加速器发出原生加载指令,该存储器地址由在该硬件加速器中的ALU计算。
13.一种系统,包括一个带有相关的寄存器堆的中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,这里该硬件加速器构成原生指令,其中该原生指令操作数包括至少二个原生中央处理单元寄存器堆索引,这里该寄存器堆内容是用于该操作数堆栈和变量的数据。
14.一种系统,包括一个带有相关的寄存器堆的中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,其中该硬件加速器由于一个“GOTO”或者“GOTO_W”字节码而产生一个新的Java PC。
15.一种系统,包括一个带有相关的寄存器堆的中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,其中该硬件加速器由于一个“JSR”或者“JSR_W”字节码而产生一个新的Java PC,计算返回Java PC并且将该返回Java PC推到该操作数堆栈上。
16.一种系统,包括一个带有相关的寄存器堆的中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,其中该硬件加速器符号扩展SiPush和BiPush字节码,并且增补给构成原生指令的字段。
17.一种系统,包括一个带有相关的寄存器堆的中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,其中该硬件加速器符号扩展SiPush和BiPush,并且可以为该原生中央处理单元所读取。
18.一种系统,包括一个带有相关的寄存器堆的中央处理单元;和一个可操作地连接到该中央处理单元的硬件加速器,该硬件加速器适合于将基于堆栈的指令转换为对该中央处理单元是原生的基于寄存器的指令,其中基于所配置的字节码的数目,通过产生一个递增值,该硬件加速器递增在该硬件加速器内的该Java PC,其中如果多个字节码被同时配置,该Java PC被以校正方式递增。
19.根据权利要求1~18的系统,其中该基于堆栈的指令是Java字节码。
20.根据权利要求1~18的系统,其中当中断时不刷新该硬件加速器。
21.根据权利要求1~18的系统,其中该硬件加速器包括一个原生监控器,其监控该原生PC的值。
22.根据权利要求21的系统,其中当原生程序计数器处于硬件加速器程序计数器范围之内的时候,该原生PC监控器启动该硬件加速器。
23.根据权利要求22的系统,其中一个中断使该原生PC脱离该硬件加速器程序计数器范围,导致该硬件加速器阻塞。
24.根据权利要求23的系统,其中该中断返回使该原生PC返回到该硬件加速器程序计数器范围之内,启动该硬件加速器。
25.根据权利要求1的系统,其中当该系统从一个中断返回的时候,该重发缓存器提供存储的已转换的指令。
26.根据权利要求1~18的系统,其中该硬件加速器至少部分地属于该中央处理单元。
27.根据权利要求2和3的系统,其中该微代码级包括一个微代码地址逻辑部分和一个微代码存储器部分。
28.根据权利要求27的系统,其中该微代码地址逻辑包括了逻辑,该逻辑用以通过地址而使得多个原生指令可以由较少的基于堆栈的指令产生。
29.根据权利要求2~18的系统,进一步包括一个重发缓存器,该重发缓存器适合于存储随同相关的原生程序计数器值一起发出给该中央处理单元的已转换的原生指令,所述系统当该中央处理单元从一个中断返回时,该重发缓存器查验该程序计数器值以确定是否重新发送一个存储的原生指令值。
30.根据权利要求2和3的系统,其中该微代码包括对应于原生指令部分的字段和对应于附加控制位的字段。
31.根据权利要求30的系统,其中该控制位控制对应于原生指令字段的翻译。
32.根据权利要求2和3的系统,进一步包括一个译码单元,该译码单元是该微代码产生单元的一部分,该译码单元产生附加的控制信号,其被提供给该原生指令设计者单元去产生该原生指令。
33.根据权利要求1~18的系统,进一步包括一个堆栈管理器单元,其用以控制被存储在该寄存器堆内的堆栈中的部件,以及去产生用于构成该原生指令的数据。
34.根据权利要求11的系统,其中对一些字节码,该硬件加速器将标记为经过修改的该变量复制到该系统存储器。
35.根据权利要求34的系统,其中该硬件加速器至少部分地属于该中央处理单元。
36.根据权利要求1所述的系统,其中该指令顺序的指示是该原生程序计数器值。
37.根据权利要求6的系统,其中如果该堆栈深度大于该最大深度,产生一个上溢标志。
38.根据权利要求6的系统,其中如果该堆栈深度小于该最小深度,产生一个下溢标志。
全文摘要
硬件Java加速器(42)由一个译码级(26b)和一个微代码级组成。分解成译码和微代码级允许该译码级去实施指令级并行运算,同时该微代码级允许转换单个Java字节码为多个原生指令。提供了一个重发缓存器(82),其存储已转换的指令,并且当该系统从一个中断返回的时候,重新发送它们。以此方式,当一个中断时不需要刷新硬件加速器。还使用一个原生PC监控器(54)。当原生PC(54)在一个特定范围之内时,硬件加速器能够转换Java字节码为原生指令。当原生PC在该范围外边的时候,硬件加速器被停用,并且CPU(25)靠从该存储器中获得的原生指令运行。
文档编号G06F9/38GK1468399SQ01816982
公开日2004年1月14日 申请日期2001年10月10日 优先权日2000年10月10日
发明者M·帕特尔, M 帕特尔 申请人:纳佐米通信公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1