首页> 中国专利> 硬件JavaTM字节码译码器

硬件JavaTM字节码译码器

摘要

一种系统包括一个用来执行RISC指令的中央处理单元(102)和一个与中央处理单元相连的硬件单元(100)。硬件单元(100)被设置用来将堆栈型指令翻译成中央处理单元(102)可以执行的RISC指令。翻译是通过使用一个可编程查找表进行。

著录项

  • 公开/公告号CN101375248A

    专利类型发明专利

  • 公开/公告日2009-02-25

    原文格式PDF

  • 申请/专利权人 香港应用科技研究院有限公司;

    申请/专利号CN200780003729.2

  • 发明设计人 张伟伦;莫栢伦;周正华;

    申请日2007-05-28

  • 分类号G06F9/45(20060101);G06F9/30(20060101);G06F9/34(20060101);

  • 代理机构深圳创友专利商标代理有限公司;

  • 代理人江耀纯

  • 地址 中国香港新界沙田香港科学园科技大道西二号生物资讯中心三楼

  • 入库时间 2023-06-18 17:42:29

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2023-06-09

    未缴年费专利权终止 IPC(主分类):G06F 9/45 专利号:ZL2007800037292 申请日:20070528 授权公告日:20120418

    专利权的终止

  • 2012-04-18

    授权

    授权

  • 2009-04-22

    实质审查的生效

    实质审查的生效

  • 2009-02-25

    公开

    公开

说明书

技术领域

本发明通常涉及计算机系统,特别涉及采用虚拟计算装置的硬件处理器。

发明背景

JavaTM是一个著名的面向对象的编程语言,由Sun MicrosystemsTM开发。近来,JavaTM的使用已经越来越受欢迎,特别是在互联网领域,因为在平台和操作系统上JavaTM具有简单、分布式的、且可移植的优点。

大多数传统编程语言使用一个编译器(compiler)来将程序源代码翻译成机器代码或处理器指令,它们是一个特定操作系统的中央处理单元(CPU)的原生(native)指令。但是,一旦完成翻译,程序将仅能够在此特定操作系统上执行。为了便于在不同操作系统上执行程序,初始源代码必须被重新编译用于不同操作系统的CPU。

JavaTM程序通常被编译用于一个JavaTM虚拟机。JavaTM虚拟机是一个执行编译的Java程序的抽象计算机。JavaTM虚拟机被看作“虚拟”的,因为其以软件格式被实施在一个“真实”硬件平台和操作系统上。因此,JavaTM虚拟机需要被实施在一个特别平台上,在此平台上编译的Java程序将被执行。

JavaTM虚拟机位于编译的Java程序和底层硬件平台以及操作系统之间。JavaTM编程语言的可移植性主要是由JavaTM虚拟机提供,因为编译的JavaTM程序是在JavaTM虚拟机上运行,而与是否可能在JavaTM虚拟机之下无关。

与传统编程语言相比,JavaTM程序被编译成一种被称为JavaTM字节码的格式。JavaTM虚拟机执行这些JavaTM字节码。因此,JavaTM字节码本质上形成JavaTM虚拟机的机器语言。JavaTM虚拟机包括一个JavaTM编译器,其读取JavaTM语言源的源代码(如以.java文件格式),将源代码翻译成JavaTM字节码。

字节码流(stream of bytecode)被看作JavaTM虚拟机执行的指令序列。每个指令包括一个单字节操作码(one-byte opcode)以及零个或多个操作数(operand)。操作码告诉JavaTM虚拟机可以采取什么动作。如果JavaTM虚拟机需要这些信息来执行特别的动作,紧随操作码之后的可能是其它信息(如操作数)。

每个字节码指令有一个对应的记忆码(mnemonic)。这些记忆码本质上形成JavaTM虚拟机的汇编语言(assembly language)。例如,一个JavaTM指令使得JavaTM虚拟机推进一个零到JavaTM堆栈上。这个指令有记忆码‘iconst_0’,并且其字节码值是60hex(十六进制)。iconst_0指令不需要任何操作数。

JavaTM虚拟机的虚拟硬件包括四个基础部件:寄存器、堆栈、垃圾区和方法区。这些部件是抽象的,就象它们组成的JavaTM虚拟机一样,但它们在每个JavaTM虚拟机实施时,必须以某种行式存在。

JavaTM虚拟机可以寻址高达四千兆字节(gigabyte)的存储器,每个存储器位置包括一个字节。在JavaTM虚拟机内的每个寄存器存储一个32-比特地址。取决于JavaTM虚拟机的特定实施,堆栈、垃圾区和方法区位于四千兆字节的寻址存储器内的某个位置。

在JavaTM虚拟机内的一个字是32比特。JavaTM虚拟机同样有少数原始数据类型(如字节(8比特)、整数(32比特)和浮点(32比特))。这些原始数据类型方便地映射到JavaTM程序员可利用的类型。

方法区包括字节码。方法区与字节边界对齐。JavaTM堆栈和垃圾区与字(32比特)边界对齐。

JavaTM虚拟机有一个程序计数器,以及管理JavaTM堆栈的一些其它通用寄存器。JavaTM虚拟机仅有少数寄存器,因为JavaTM虚拟机的字节码指令主要是在JavaTM堆栈上运行。这种堆栈型设计允许JavaTM虚拟机的指令集及其实施很小。

如上所述,JavaTM虚拟机使用一个JavaTM程序计数器,以保持存储器里JavaTM虚拟机执行指令的位置。其它寄存器指向一个当前执行方法的堆栈帧的各个部分。一个执行方法的堆栈帧存储一个特定调用方法的状态(如局部变量(LV)和计算的中间结果等)。

如上所述,方法区包括JavaTM字节码。程序计数器总是存储方法区内一些字节的地址。在一个字节码指令已经被执行之后,程序计数器将包括JavaTM虚拟机执行的下一个指令地址。在执行完指令之后,JavaTM虚拟机通常设置程序计数器为紧随前一个指令的指令地址。

字节码指令的参数和结果被存储在JavaTM堆栈里。JavaTM堆栈也被用来传递参数到方法区或从方法区返回值。此外,如上所述,JavaTM堆栈存储每个方法调用的状态,其中方法调用的状态被称为方法堆栈帧。

一个JavaTM程序的对象驻留在JavaTM虚拟机的垃圾区内。任何时候内存被分配一个新算子(new operator),分配的内存来自垃圾区。分配的内存不能使用JavaTM汇编语言被直接释放。相反,运行环境(runtimeenvironment)保留每个对象的索引在垃圾区内。然后,运行环境可以自动地释放由不再引用的对象所占用的内存。

JavaTM虚拟机也包括一个JavaTM字节码解译器(byte code interpreter)。JavaTM字节码解译器将字节码转换成机器码或特定CPU的原生(native)处理器指令。例如,一个与远程CPU建立套接字连接(socket connection)的请求将涉及到一个操作系统呼叫。不同操作系统以不同方式处理套接字。JavaTM虚拟机将处理套接字转换,因此JavaTM程序在其上运行的操作系统和CPU构造是完全不相关的。

但是,与依照传统编程语言编码的一些程序相比,执行JavaTM程序是相当缓慢的,因为需要通过JavaTM虚拟机处理和翻译程序的JavaTM字节码。例如,对在特定CPU上运行的JavaTM程序而言,CPU必须首先运行JavaTM虚拟机将程序的JavaTM字节码翻译成原生(native)指令。然后,这些原生指令必须由CPU执行。在运行JavaTM程序时,将字节码翻译成原生指令会产生一个瓶颈。

如上所述,运行JavaTM程序可以比作CPU运行已经被编译的传统程序。在这种情况下,处理器只不过执行传统程序的原生指令而已。

专门的解译器已经被用来提高JavaTM虚拟机的运行速度,相应地提高JavaTM程序的运行速度。但是,这些专门的解译器经常给其正使用的操作系统带来编译开销和额外内存开销。结果,JavaTM的使用被限制在低内存和低能耗的应用上。

另一种提高JavaTM程序运行速度的已知方法是使用一种硬件JavaTM加速器,如Patel等在美国专利6,332,215里披露的。这种硬件JavaTM加速器在硬件上执行部分JavaTM虚拟机,以便能够加快运行产生JavaTM字节码的操作系统。美国专利6,332,215披露的硬件JavaTM加速器也将字节码翻译成原生处理器指令。但是,美国专利6,332,215的硬件JavaTM加速器的一个缺点是其需要使用多个硬件JavaTM寄存器。这些硬件JavaTM寄存器需要存储JavaTM虚拟机里定义的JavaTM寄存器文件。寄存器文件包括JavaTM虚拟机的状态,并在每个字节码被运行之后要更新。需要这种多个硬件JavaTM寄存器使运行JavaTM程序必需的硬件越发复杂。

另一种硬件JavaTM加速器是由Seal等在美国专利6,965,984里披露的。但是,美国专利6,965,984的硬件JavaTM加速器是专为使用由英国Cambridge ARM有限公司生产的中央处理单元和这种ARM中央处理单元的指令组而设计。

因此,明确需要一种改进且更有效方法,用来提高JavaTM程序运行速度。

发明概述

本发明的目的是从本质上克服或至少缓解现有装置的一个或多个缺点。

本发明通常涉及一种硬件JavaTM字节码单元,用来将JavaTM字节码翻译成特定中央处理单元(CPU)的原生指令。与纯粹采用软件的JavaTM虚拟机相比,通过使用一个可编程查找表来执行翻译,硬件JavaTM字节码单元提高JavaTM字节码的处理速度。

对所有堆栈操作而言,使用一个原始CPU寄存器文件,通过将堆栈型JavaTM字节码翻译成一个特定CPU的寄存器型原生指令,本发明的硬件JavaTM字节码单元可以使硬件复杂性最小化。

依照本发明的一个方面,提供一种系统,包括:

一个用来运行RISC指令的中央处理单元;和

一个与中央处理单元相连的硬件单元,硬件单元被设置用来将堆栈型指令翻译成由所述中央处理单元执行的RISC指令,其中翻译是通过使用一个可编程查找表进行。

依照本发明的另一个方面,提供一种系统,包括:

一个用来运行RISC指令的中央处理单元,所述中央处理单元包括一个CPU寄存器文件;和

一个与中央处理单元相连的硬件单元,使用在CPU寄存器文件内设置的一个操作数堆栈,硬件单元被设置用来将堆栈型指令翻译成RISC指令,其中操作数堆栈是由硬件单元管理,并被用来执行在进行所述翻译时所必需的堆栈操作。

依照本发明的另一个方面,提供一种将堆栈型指令翻译成由中央处理单元执行的RISC指令的方法,所述方法包括以下步骤:

下载堆栈型指令到一个与中央处理单元相连的硬件单元;

使用硬件单元,将堆栈型指令匹配到存储在一个可编程查找表里的一个或多个RISC指令;和

使用中央处理单元,运行一个或多个RISC指令。

依照本发明的另一个方面,提供一种装置,包括:

一个用来执行RISC指令的中央处理单元;和

一个与中央处理单元相连的硬件单元,硬件单元被设置用来将堆栈型指令翻译成由所述中央处理单元执行的RISC指令,其中翻译是通过使用一个可编程查找表进行,以便将堆栈型指令匹配到存储在可编程查找表内的一个或多个RISC指令。同时,也披露了本发明的其它方面。

附图说明

参照图表和附录,现在将描述现有技术的一些方面以及本发明的一个或多个实施例,其中:

图1显示一个依照本发明一个实施例的连接到一个简化指令集合计算机(RISC)CPU的一个硬件JavaTM字节码单元;

图2详细描述图1的硬件JavaTM字节码单元的一个实施例;

图3显示在一个JavaTM堆栈帧里的部分;

图4显示JavaTM堆栈到JavaTM寄存器堆栈的映射;和

图5显示存储在堆栈帧的上下文信息(CI)部分里的5个字。

最佳实施例详述

参照任何一个或多个附图里的步骤和/或特征,其中那些具有相同编号的步骤和/或特征都是为了描述相同的功能或操作,除非出现相反的意图。

应该注意,在“发明背景”部分里的讨论和以上有关的现有技术都涉及构成公知技术的文档或设备讨论。这不应该解读为本发明人或本专利申请人的陈述。依照本发明实施例,图1显示一个连接到一个RISC CPU 102的硬件JavaTM字节码单元100。硬件JavaTM字节码单元100产生RISC指令由CPU 102执行,它可以是一个通用寄存器型CPU。硬件JavaTM字节码单元100的原理不受限于JavaTM编程语言。硬件JavaTM字节码单元100可以与任何将被转换成寄存器型原生指令的堆栈型语言一起使用。硬件JavaTM字节码单元100也可以与任何由类似于JavaTM虚拟机的虚拟机执行的编程语言一起使用。

与纯粹由软件实施的JavaTM虚拟机相比,通过使用一个可编程查找表来执行翻译,硬件JavaTM字节码单元100提高JavaTM字节码的处理速度。而且,本发明的硬件JavaTM字节码单元100对所有栈操作使用一个CPU寄存器文件,将堆栈型JavaTM字节码翻译成CPU 102的寄存器型RISC指令,可以最小化必需的硬件。

CPU寄存器文件被用来存储由CPU 102运行的JavaTM虚拟机设定的通用寄存器。CPU寄存器文件也被用来存储由硬件JavaTM字节码单元100使用的特殊寄存器。依照优选实施例,当执行CPU 102的原生RISC指令时(即当CPU 102是在“原生模式”上运行时)以及当硬件JavaTM字节码单元100正在将堆栈型JavaTM字节码翻译成寄存器型RISC指令时(即当CPU 102是在“JavaTM模式”上运行时),CPU寄存器文件被CPU 102使用。

优选实施例的硬件JavaTM字节码单元100使用的特殊寄存器不同于通用寄存器,通用寄存器通常是在执行RISC指令的CPU 102上运行。存储在CPU寄存器文件里的特殊寄存器包括一个JavaTM程序计数(jpc)寄存器、一个JavaTM堆栈指针(jsp)寄存器、一个本地可变帧指针(lvfp)寄存器、多个自变量和局部变量(narg_nlocal)寄存器、一个jsp寄存器的上限(jspul)、一个jsp的下限(jspll)、一个线程计数(threadcnt)寄存器、一个虚拟JavaTM堆栈指针(vjsp)寄存器以及一个显示使用的堆栈寄存器数目的寄存器(used)。在每个字节码被硬件JavaTM字节码单元100翻译之后,存储在CPU寄存器内的每个通用的和特别的寄存器被更新。jpc(或程序计数)寄存器记录JavaTM虚拟机应该在内存什么位置执行指令。其它寄存器将在以下被详细描述。

CPU寄存器文件也存储JavaTM堆栈。如上所述,JavaTM堆栈被用来记录每种方法调用的状态,其中一种方法调用的状态是由一个JavaTM堆栈帧表示。jsp和lvfp寄存器指向一个当前JavaTM堆栈帧的不同部分。如图3所示,依照优选实施例,在由CPU 102执行的JavaTM虚拟机的一个JavaTM堆栈帧300内有四个部分。这四个部分包括操作数堆栈(OS)301、上下文信息(CI)部分303、局部变量(LV)部分305和自变量(ARG)部分307。

局部变量(LV)部分305包括由当前方法调用的正在使用的所有局部变量(如高达局部变量数目,nlocals)。一旦当前方法被调用,这些变量将被分配。

执行字节码可能导致将元素压入到操作数堆栈(OS)301或将元素从操作数堆栈301取出。操作数堆栈(OS)301被字节码使用作为一个工作空间(work space)。被执行的字节码的参数被置于操作数堆栈301内,并且字节码指令的结果也在操作数堆栈301内。jsp寄存器指向操作数堆栈301的顶端。当前执行方法的操作数堆栈(OS)301总是最上面的堆栈部分,所以jsp寄存器总是指向整个JavaTM堆栈的顶端。Lvfp寄存器指向当前JavaTM堆栈帧的开头。

自变量部分(ARG)307被用于从一个调用方法(如高达自变量数目,nargs)到被调用方法(即方法是由调用方法调用的)的参数传递。一旦完成一种方法的调用,自变量被看作在被调用方法内的局部变量。

上下文信息(CI)部分303被用来存储要求返回到前一方法的所有信息。

CPU寄存器文件也被用来存储一部分通用寄存器,以便使用作为JavaTM堆栈的当前堆栈帧的一个缓冲器。此缓冲器被称为JavaTM寄存器堆栈。JavaTM寄存器堆栈仅仅保存寄存器在与当前执行方法相关的堆栈帧内。一旦调用方法以及随后该方法的返回,将执行溢出(spill)和装满(fill),以确保JavaTM寄存器堆栈仅仅包括当前堆栈帧,这将在以下详细描述。

图4显示JavaTM堆栈400和JavaTM寄存器堆栈401的映射。JavaTM寄存器堆栈的一部分(如403)被预留用来缓冲操作数堆栈(OS)301。JavaTM寄存器堆栈的另一部分(如405)被预留给当前堆栈帧的局部变量(LV)部分305和自变量部分(ARG)307。还有另一部分JavaTM寄存器堆栈(如407)被预留给当前堆栈帧300的上下文信息(CI)部分303。如图4所示,虚拟JavaTM堆栈指针(vjsp)寄存器指向JavaTM寄存器堆栈的顶端。此外,使用的寄存器指出了用于缓冲操作数堆栈(OS)301、上下文信息(CI)部分303和局部变量(LV)部分305的寄存器数目。

如图5所示,有5个字即CI0、CI1、CI2、CI3和CI4被存储在当前堆栈帧300的上下文信息(CI)部分303内。4个字CI1、CI2、CI3和CI4被用来存储前一个JavaTM堆栈帧(如图3的堆栈帧309)的上下文信息(CI)部分里的信息。字CI1存储前一个JavaTM堆栈帧的1vfp寄存器的值。字CI2存储前一个JavaTM堆栈帧的自变量和局部变量(narg_nlocal)的数目。字CI3存储前一个JavaTM堆栈帧的jpc。字CI4存储前一个JavaTM堆栈帧的JavaTM常量池基址指针(CPB)。剩余的字CI0存储与当前方法相关的当前堆栈帧(即堆栈帧300)的一个参考值。字CI0被用于同步检查,并记录在每个堆栈帧里运行的方法。

以下表格1显示当CPU 102在JavaTM模式上运行时(即当硬件JavaTM字节码单元100正在将堆栈型JavaTM字节码翻译成寄存器型RISC指令时)使用的通用寄存器。

        表格1

 

寄存器号码简称使用$r0$0赋值0$r1-$r22$vn在当前帧里元素缓冲(OS、LOCAL、ARG)$r23$ci0上下文信息-当前方法ptr$r24$ci1上下文信息-前一个lvfp$r25$ci2上下文信息-前一个narg_nlocal$r26$ci3上下文信息-前一个jpc$r27$ci4上下文信息-前一个cpb$r28$jspJava堆栈指针(在溢出和载入情况下)$r29$nsp原生堆栈指针

 

$r30$cpb常量池基址指针$r31存储回到原生模式的返回地址

字节码102有8个特别寄存器,其也被存储在CPU寄存器文件内,并被用来管理存储在CPU寄存器文件内的JavaTM堆栈。CPU 102使用加载-存储(load-store)指令可以访问这8个特别寄存器。字节码单元102的8个特别寄存器如以下表格2所示:

       表格2

 

索引寄存器描述1$jpcJava计算机2$jspJava堆栈指针3$1vfp局部变量帧指针4$narg_nlocalargs的数目(31:16)和local的数目(15:0)5$jspuljsp上限6$jsplljsp下限7$threadcnt线程计数器8$vjsp虚拟Java堆栈指针9$used使用的堆栈寄存器的数目

硬件JavaTM字节码单元100使用一个RISC指令集合查找表格,用于将JavaTM字节码翻译成CPU 102执行的原生指令。查找表格存储由CPU102使用的RISC指令集合。为了将一个特别JavaTM字节码翻译成一个或多个RISC指令,硬件JavaTM字节码单元100使用特别的JavaTM字节码作为一个到查找表格的索引。JavaTM字节码单元100将该特别的JavaTM字节码匹配到存储在查找表格里的一个或多个RISC指令。然后,匹配的RISC指令可以由CPU 102执行。指令集合查找表格是可编程的,并且可以在运行期间被更新以改善硬件JavaTM字节码单元100的性能和功能。

CPU 102执行一个特别RISC CPU管线(pipeline)。依照这种RISC CPU管线,CPU 102包括一个指令缓存(instruction cache)102、一个多路复用器104、一个指令取出(instruction fetch)单元105、一个多路复用器106、一个指令分派(instruction dispatch)单元107、以及一个整数单元108。当在原生模式上运行时,CPU 102的指令取出单元105通过一个内部总线109从指令缓存103取出一个或多个原生RISC指令(每个时钟周期)。指令取出单元105通过经由内部总线117和多路复用器104发送一个指令地址到指令缓存102而访问指令缓存103。RISC指令通常被拿进一个被集成在指令取出单元105内的指令队列(图中未显示)。指令取出单元105经由多路复用器106和内部总线110和111发送RISC指令到指令分派单元107。在经由内部总线112分派RISC指令到整数单元108之前,指令分派单元107解码RISC指令。

整数单元108可以是一个定点(fixed-point)运算逻辑单元(ALU),其执行包括指令地址计算的所有整数数学,并执行RISC指令。依照从指令分派单元107接收到的RISC指令,整数单元108可以执行整数和浮点加载地址计算、整数和浮点存储-地址计算、整数和浮点加载-数据运算以及整数存储-数据运算。使用存储在CPU寄存器文件内的操作数堆栈(OS)301,整数单元108执行这些计算和运算。经由硬件总线127,其被称为“寄存器加载/存储”总线,如图1所示,整数单元108访问存储在CPU寄存器文件内的操作数堆栈(OS)301。例如,整数单元108可以使用总线127,用来编程存储在CPU寄存器文件里的硬件JavaTM字节码单元100的特别寄存器(如jpc,如表格2所示)。此外,整数单元108可以使用总线127用来访问JavaTM堆栈400,以便在任何字节码翻译或模式转换运行期间,确定硬件JavaTM字节码单元100的状态。基于经由总线127由整数单元108执行的RISC指令,存储在CPU寄存器文件内的通用寄存器(如表格1所示)也将被更新。

如图1,硬件总线125被称为“分支控制”总线。硬件JavaTM字节码单元100被配置成可以执行转移分支和具有转移分支能力。因此,硬件JavaTM字节码单元100在知道转移分支结果之前预先翻译推测性字节码指令。硬件JavaTM字节码单元100对一个特别分支从整数单元108存取分支结果,并可以使用分支结果来更正一个目标地址,并若有需要使指令无效。

CPU 102也执行JavaTM虚拟机,其负责解读从指令缓存103取出的任何JavaTM字节码。依照图1的实施例,硬件JavaTM字节码单元100在硬件上至少执行部分JavaTM虚拟机。硬件JavaTM字节码单元100提高Java字节码的处理速度。硬件JavaTM字节码单元100至少部分执行将Java字节码翻译成CPU 102的原生RISC指令。

如图1所示,硬件JavaTM字节码单元100使用多路复用器104,与指令取出单元105共享指令缓存103。硬件JavaTM字节码单元100使用多路复用器106,也与指令取出单元105共享指令分派单元107。如上所述,来自指令缓存103的指令可以被提供给指令取出单元105(如以上所述)或者经由内部总线109被提供到硬件JavaTM字节码单元100。

当CPU 102最初“通电”时,CPU 102是在“原生模式”上,并且多路复用器104和106被设置成回避(bypass)硬件JavaTM字节码单元100。在原生模式上,CPU 102执行经由总线109被提供给指令取出单元105的原生RISC指令。通过经由内部总线115、117和多路复用器104发送一个索引RISC指令的指令地址到指令缓存103,指令取出单元105存取指令缓存103。

如果指令缓存103包括一个JavaTM字节码,那么由CPU 102执行的JavaTM虚拟机切换CPU 102到JavaTM模式。在这种情况下,JavaTM虚拟机初始化存储在CPU寄存器文件内的特别和通用寄存器,并发送一个“加载/存储”到硬件JavaTM字节码单元100。一旦切换CPU 102到JavaTM模式,JavaTM虚拟机也将一个“改变模式”指令向下发送到CPU 102的RISC CPU管线。改变模式指令产生一个信号经由总线122被发送到多路复用器104。这个信号切换多路复用器104,从而硬件JavaTM字节码单元100可以访问存储在指令缓存103内的JavaTM字节码。改变模式指令也产生一个信号经由总线123被发送到多路复用器106,其切换多路复用器106,使得从硬件JavaTM字节码单元100输出的RISC指令经由总线129被提供到指令分派单元107。为了访问在指令缓存102内的JavaTM字节码,字节码单元100经由总线113、多路复用器104和内部总线115,发送一个索引JavaTM字节码的指令地址到指令缓存102。指令缓存103经由总线109提供由指令地址索引的JavaTM字节码到字节码单元100。当CPU是在JavaTM模式时,指令分派单元105基本上停用。

在这种情况,硬件JavaTM字节码单元100通过使用JavaTM字节码作为一个存储在JavaTM字节码单元100内的可编程查找表格的索引,将JavaTM字节码转换成一个RISC指令。如上所述,可编程查找表格存储由CPU 102使用的RISC指令集合。RISC指令经由内部总线110和多路复用器106被硬件JavaTM字节码单元100提供给指令分派单元107。指令分派单元107解码RISC指令,并分派解码的指令到整数单元108。依照从指令分派单元107接收到的RISC指令,整数单元108可以执行整数和浮点加载-地址计算、整数和浮点存储-地址计算、整数和浮点加载-数据运算以及整数存储-数据运算。整数单元108使用存储在CPU寄存器文件内的操作数堆栈(OS)301,执行这些计算和运算。如上所述,整数单元108经由硬件总线127访问存储在CPU寄存器文件内的操作数堆栈(OS)301。此外,整数单元108可以使用总线127来访问JavaTM堆栈400,以便确定在任何字节码翻译或模式转换运行期间硬件JavaTM字节码单元100的状态。基于从指令分派单元107接收到的RISC指令,经由总线127,存储在CPU寄存器文件内的通用寄存器(如表格1所示)也将被更新。

硬件JavaTM字节码单元100提高由CPU 102执行的JavaTM虚拟机的处理速度,允许使用现有原生语言旧应用程序和开发工具。通常,一个执行JavaTM虚拟机的RISC CPU不能访问这种旧应用程序。

在另一个实施例里,硬件JavaTM字节码单元100可以被合并到一个中央处理单元如CPU 102。在这种实施例里,将JavaTM字节码翻译成CPU 102的原生RISC指令可以由CPU 102的一个硬件JavaTM字节码子单元执行。

图2显示硬件JavaTM字节码单元100的一个实施例的详情。如图2所示,字节码单元100包括一个分支单元201、一个字节码缓冲器202、一个字节码文件夹203、一个堆栈管理单元204、一个堆栈控制指令产生单元205、字节码RAM(随机存储器)206、一个字节码译码器207和一个多路复用器208。

当CPU 102处于JavaTM模式时,字节码单元201从指令缓存102取出字节码。为了访问指令缓存102,分支单元201经由硬件总线113、多路复用器104和内部总线115发送一个指令地址到指令缓存103。指令缓存103经由总线109提供一个由指令地址索引的JavaTM字节码到字节码缓冲器202。在优选实施例里,字节码缓冲器202可以存储高达16个JavaTM字节码在一个指令队列上。

一个存储在字节码缓冲器202内的JavaTM字节码经由内部总线209被发送到字节码文件夹203。字节码文件夹203使用操作码模式匹配(op-codepatternmatching)将JavaTM字节码匹配到一个操作码(op-code),并经由内部总线210发送操作码到堆栈管理单元204。字节码文件夹203可以合并存储在字节码缓冲器202内的几个JavaTM字节码到一个单RISC操作码。

堆栈管理单元204使用从字节码文件夹203接收到的操作码,以产生RISC指令参数,其经由内部总线211被提供给字节码译码器207。堆栈管理单元204也提供各种堆栈指针(如JavaTM堆栈指针(jsp)寄存器和虚拟JavaTM堆栈指针(vjsp)寄存器)的更新值。这些更新值被发送到堆栈控制指令产生单元205,其产生存储在CPU寄存器文件内的操作数堆栈(OS)301的堆栈控制指令。

字节码文件夹209也经由内部总线211发送操作码到字节码译码器207。字节码译码器207将从字节码文件夹203接收到的操作码和从堆栈管理单元204接受到的RISC指令参数翻译成一个CPU 102的原生RISC指令。字节码译码器207使用一个存储在字节码RAM 206内的可编程指令集合查找表格来确定RISC指令。如上所述,查找表格存储由CPU 102使用的RISC指令集合。在翻译操作码时,字节码译码器207经由内部总线216提供存储在字节码RAM 206内的指令集合查找表格的一个地址。此地址显示CPU 102的原生RISC指令在字节码RAM 206内的位置。所以,如上所述,字节码译码器207提供的地址形成一个查找表格的索引。

与堆栈控制指令产生单元205产生的堆栈控制指令一起,经由多路复用器208、多路复用器106以及总线129和215,由字节码译码器207确定的RISC指令被发送到CPU 102的指令分派单元107。如上所述,指令分派单元107在经由内部总线111分派RISC指令到整数单元108执行之前,解码RISC指令。然后,依照从指令分派单元107接收到的RISC指令,整数单元108可以执行整数和浮点加载-地址计算、整数和浮点存储-地址计算、整数和浮点加载-数据运算、以及整数存储-数据运算。整数单元108依照堆栈控制产生单元205产生的堆栈控制指令,使用存储在CPU寄存器文件内的操作数堆栈(OS)301,执行这些计算和运算。如上所述,整数单元108经由硬件总线127访问存储在CPU寄存器文件内的操作数堆栈(OS)301。此外,整数单元108可以使用总线127来访问JavaTM堆栈400,以便能够确定在任何字节码翻译或模式切换运行期间硬件JavaTM字节码单元100的状态。基于从指令分派单元107接收到的执行RISC指令,通用寄存器(如表格1所示)和存储在CPU寄存器文件内的特别寄存器(如表格2所示)将被更新。

如果字节码译码器207从字节码文件夹203接收到一个不能被翻译(non-translatable)的字节码,字节码译码器207产生改变模式指令,其被发送到CPU 102。一旦接收到改变模式指令,CPU 102的多路复用器104和106经由在总线122和123上的信号被切换到原生模式,允许指令取出单元105能够访问指令缓存103,以便能够从指令缓存103取出不能被翻译的字节码。然后,这个不能被翻译的字节码可以被正在由CPU 102执行的JavaTM虚拟机执行。

如上所述,指令集合查找表格是可编程的,并可以在运行时间期间被更新,以便改善硬件JavaTM字节码单元100的性能和功能。查找表格可以由程序员编程,例如,使用如图1所示的外部接口119。外部接口经由总线121与硬件JavaTM字节码单元100进行通信。对不同的应用程序使用,可以在运行时间上更新查找表格。例如,正如本领域的技术人员所熟知的那样,使用外部接口119,程序员可以插入debug(除错)指令,以便可以“跟踪码”(code trace)。作为另一个例子,如果CPU 102预定不是字节码的所有安全特征都被要求来执行字节码,某些字节码可以被优化用来改善性能。此外,对具有不同发射能力的不同中央处理单元,例如,对于在一个单周期内可以发出多个指令中央处理单元,可以修改查找表格。使用可设置数目的指令端口,硬件JavaTM字节码单元100可以与单发射或多发射中央处理单元集成在一起。

堆栈控制指令产生单元205产生的JavaTM堆栈的堆栈控制指令经由多路复用器208和多路复用器106被发送到CPU 102。基于堆栈控制指令,CPU寄存器文件的寄存器堆栈401和JavaTM堆栈400被更新。特别地,基于堆栈控制指令,CPU 102执行的JavaTM虚拟机的状态和操作数堆栈(OS)301顶端的指针被更新。

存储在CPU寄存器文件内的寄存器堆栈401充当JavaTM堆栈400的一个循环缓冲器(circular buffer)。JavaTM堆栈400在执行JavaTM虚拟机期间成长和收缩,因为JavaTM字节码被翻译成CPU 102的寄存器型RISC指令。由于在寄存器堆栈401内寄存器的有限数目,数据需要从寄存器堆栈401移出到RAM 206(即数据“溢出”),和从RAM 206访问数据(即寄存器堆栈401是“载入”的)。

在一定条件下,堆栈管理单元204中断正常的字节码翻译,并发送堆栈管理指令到字节码译码器207。特别地,硬件JavaTM字节码单元100,在将JavaTM字节码翻译成CPU 102的寄存器型RISC指令期间,使用堆栈管理单元204产生的加载和存储指令,自动执行JavaTM堆栈400的溢出到字节码RAM 206和从字节码RAM 206存取载入。这些加载和存储指令经由内部总线211被发送到字节码译码器207。

在以下条件情况下,正常的字节码翻译将被中断,并且溢出将发生:

(i)当翻译字节码需要更多自由的通用或特别寄存器时;

(ii)一旦CPU 102从原生模式转换到JavaTM模式,其中CPU寄存器文件的包括上下文信息(CI)的所有使用的寄存器发生溢出;

(iii)在方法调用之前;

(iv)一旦方法调用,分配局部变量需要更多自由寄存器;和

(v)在方法调用之后,寄存器堆栈溢出数据,直到只有在当前堆栈帧内的元素被存储在寄存器堆栈内。

在以下条件情况下,正常的字节码翻译将被中断,并且载入将发生:

(i)在被翻译的字节码要求访问没有存储在CPU寄存器堆栈内的操作数堆栈元素;

(ii)一旦CPU 102从原生模式转换到JavaTM模式,包括上下文信息的当前堆栈帧的元素,被载入;

(iii)在方法返回之后,包括上下文信息的当前堆栈帧的元素,被载入。

参照一个JavaTM字节码例子,“iadd”,现在描述将堆栈型JavaTM字节码翻译成硬件JavaTM字节码单元100使用的寄存器型RISC指令。iadd的操作码是0x60。字节码iadd在存储在CPU寄存器文件内的寄存器堆栈顶端上(如401)处理两个整数操作数,其它类型的操作数将是非法的,并且会导致字节码翻译失败。这两个操作数将从存储在CPU寄存器文件内的寄存器堆栈的操作数堆栈(OS)(如301)取出,并且这两个操作数的整数和被压回到寄存器堆栈上。为了将iadd字节码翻译成寄存器型RISC指令,CPU 102将硬件JavaTM字节码单元100转换到JavaTM模式。在JavaTM模式上,字节码单元201从指令缓存103取出iadd字节码。为了访问指令缓存103,分支单元201经由硬件总线113、多路复用器104和内部总线115发送一个iadd字节码的指令地址到指令缓存103。指令缓存103经由总线109提供iadd字节码到字节码缓冲器202。

存储在字节码缓冲器202内的iadd字节码经由内部总线209被发送到字节码文件夹203。字节码文件夹203使用操作码模式匹配将iadd字节码匹配到操作码,0x60,并经由内部总线210发送操作码0x60到堆栈管理单元204。堆栈管理单元204使用从字节码文件夹203接收到的操作码0x60,来产生RISC指令参数,其包括“add”的RISC操作码以及两个源寄存器(如图6(a)所示的寄存器vjsp-1和寄存器vjsp-2)和一个目标寄存器(如图6(b)所示的寄存器vjsp-1)的寄存器索引。对其它字节码,其它RISC指令参数可以由堆栈管理单元204产生。堆栈管理单元204产生的RISC指令参数被合并成一个完整的RISC指令,其经由内部总线211被提供给字节码译码器207。堆栈管理单元204也提供各种堆栈指针的更新值,包括虚拟JavaTM堆栈指针(visp)和JavaTM堆栈指针(jsp)。这些堆栈指针依照如下公式进行更新:

(i)vjsp=vjsp-1

(ii)jsp=jsp-1

这些更新值被发送到堆栈控制指令产生单元205,其产生堆栈控制指令给存储在CPU寄存器文件内的寄存器堆栈的操作数堆栈(OS)。

字节码文件夹209也经由内部总线210发送操作码0x60到字节码译码器207。字节码译码器207将从字节码文件夹203接收到的操作码0x60和从堆栈管理单元204接收到的RISC指令参数翻译成一个CPU 102的原生RISC指令。字节码译码器207使用存储在字节码RAM 206内的可编程指令集合查找表格来确定RISC指令。如上所述,查找表格存储由CPU 102使用的RISC指令集合。对应操作码0x60的在可编程指令集合查找表格内的RISC指令是“add$(vjsp-2),$(vjsp-1),$(vjsp-2)”。在翻译操作码时,字节码译码器207经由内部总线216提供存储在字节码RAM 206内一个指令集合查找表格的地址。此地址显示CPU 102的原生RISC指令“add$(vjsp-2),$(vjsp-1),$(vjsp-2)”在字节码RAM 206内的位置。

与由堆栈控制指令产生单元产生的堆栈控制指令(如vjsp=vjsp-1和jsp=jsp-1)一起,经由多路复用器208、多路复用器106、以及总线129和215,由字节码译码器207确定的RISC指令“add$(vjsp-2),$(vjsp-1),$(vjsp-2)”被发送到CPU 102的指令分派单元107。指令分派单元107,在经由内部总线111分派RISC指令到整数单元108执行之前,解码RISC指令“add$(vjsp-2),$(vjsp-1),$(vjsp-2)”。然后,依照RISC指令“add$(vjsp-2),$(vjsp-1),$(vjsp-2)”,整数单元108可以执行整数和浮点加载-地址计算、整数和浮点存储-地址计算、整数和浮点加载-数据运算和整数存储-数据运算。依照由堆栈控制产生单元205产生的堆栈控制指令,使用存储在CPU寄存器文件内的操作数堆栈(OS),整数单元108执行这些计算和运算。如上所述,根据执行的RISC指令,被存储在CPU寄存器文件内的通用寄存器和特别寄存器将被更新。特别地,表示使用的堆栈寄存器数目的寄存器(如,$used)和JavaTM程序计数器(jpc)依照如下公式更新:

(i)used=used-1

(ii)jpc=jpc-1

图6(a)显示依照以上范例在翻译iadd字节码之前的寄存器堆栈401(存储在CPU寄存器文件内)。如图6(a)内所示,寄存器vjsp-1是一个源寄存器,并有一个存储在寄存器内的局部变量LV(n+1)。另外,寄存器vjsp-2是另一个源寄存器,并有一个存储在寄存器内的局部变量LV(n)。使用的寄存器数目(即$used)等于4。图6(b)显示依照以上范例翻译iadd字节码之后的寄存器堆栈400(存储在CPU寄存器文件内)。如图6(b)内所示,寄存器vjsp-1是目标寄存器,并有一个存储在寄存器内的局部变量(LV(n+1)+LV(n))。并且,使用的寄存器数目(即$used)等于3。

工业适用性

从以上所述可以明显地发现,所述装置可适用于计算机和数据处理工业领域。

前述仅仅描述了本发明的一些实施例,在不超出本发明的范围和精神范围可以对其作出修改和/或变化,实施例仅是用作说明目的,而非限制本发明。

在说明书的上下文里,单词“包括”是指“原则上包括但不一定是唯一的”或者“具有”或者“包含”,而不是“仅仅包括”。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号