使用本机指令将操作数堆栈作为寄存器堆的微处理器存取的制作方法

文档序号:6567037阅读:186来源:国知局

专利名称::使用本机指令将操作数堆栈作为寄存器堆的微处理器存取的制作方法使用本机指令将操作数堆栈作为寄存器堆的微处理器存取4支术领域本发明涉及存取微处理器中的寄存器堆堆栈,所述微处理器包含具有面向存储器结构的微处理器(例如,复杂指令组计算机或CISC机器)和具有加载一存储结构的微处理器(例如,精简指令组计算机或RISC机器),以及包含具有Java虚拟机内核结构的微处理器的堆栈机器。可以RISC或CISC状态且还以Java状态操作的组合结构尤其有关。更确切地说,本发明涉及使用所述结构本机的指令来存取操作数堆栈,例如存取来自RISC状态的Java操作数堆栈。
背景技术
:微处理器可划分成若干基本类别。在堆栈机器中,所有算术一逻辑单元(ALU)操作均是对操作数堆栈的最上层寄存器进行的。在CISC机器中,所述操作直接在存储器中进行(即,从存储器存取操作数并将结果存储在存储器中)。在RISC机器中,所有操作均是对驻存在中央处理单元(CPU)中的可寻址寄存器执行的。尽管早期微处理器是堆栈机器,但如今大多数微处理器是CISC机器或RISC机器。随着时间的过去,CISC机器和RISC机器已经在设计上彼此接近,大多数现代CISC机器也具有在其中执行操作的寄存器堆。通过SunMicrosystems对Java编程语言和Java虚拟机(JavaVM)的引入,堆栈机器被重新引入到现代微处理器中。虽然JavaVM主要希望作为软件来运行,但存在一些硬件实施方案。Java是由SunMicrosystems开发的一种面向对象的编程语言,其已成为网络编程的事实上标准,并且也开始在嵌入式系统领域中使用。Java字节码通常在称为Java虚拟机的软件层中执行,SunMicrosystems出版了关于Java虚拟机的规范。为了执行Java字节码,可使用解译器或"及时"编译器(其优选地结合某种形式的先行技术以分析潜在程序流程瓶颈)或者用于特定硬件平台的交叉编译器。或者,可直接在硅中执行Java。一些Java硬件处理器具有折叠机制,这意味着若干指令被组合且作为一个来执行。然而,大多数Java处理器将作为解译器进行操作,其中读取每一操作码并接着采取适当行为来执行指令。如果要在嵌入式系统中实施Java,那么硬件方法是优选的技术解决方案,且近些年来,已针对嵌入式处理器平台开发出若干硬件版本的Java虚拟机。这些支持直接执行Java指令的处理器通常被设计成32位堆栈机器。一些依赖于对Java二进制格式的扩展,以便提供如直接寻址和位操纵指令的特征。其它的不直接执行Java二进制代码,但具有非常紧密的结构匹配以借此提高虚拟机的性能。在试图以硬件实施JavaVM时遇到的主要难题在于,一些Java指令具有高层语义内容,且因此非常难以作为原子指令来执行。俘获复杂的Java指令且用主机结构本机的指令将其作为软件例行程序来执行是一种可能的解决方案。但为了进行所述操作,需要一种使用本机(RISC或CISC)指令来存取Java操作数堆栈的机制。在本受让人的早期在2002年4月1日申请的题为"MicroprocessorforexecutingbytecompiledJavacode"且在2004年1月22日作为US2004/0015678Al公开的美国专利申请案10/114,678(其主张2001年4月23日申请的美国临时申请案60/286,197的优先权)中,以及在2002年10月31日作为WO2002/086699A3公开的相应国际申请案中,描述了将RISC机器与JavaVM组合的概念。在所述早期公开申请案中,将RISC微处理器与以硬件实施的JavaVM组合,使得硬件可以RISC状态或Java状态进行操作。为了使RISC微处理器存取Java操作数堆栈且将复杂的Java指令作为RISC软件例行程序来执行,在状态寄存器中设置两个位——"X"和"Y",以允许相应的X或Y自变量由操作数堆栈指针所指向的寄存器编号取代。寻求额外的机制以使得这些组合的微处理器改进对来自处理器的RISC(或CISC)状态的Java操作数堆栈的存取。
发明内容本发明在同一微处理器内核中实施RISC(或CISC)机器和堆栈机器(例如JavaVM)两者。微处理器含有寄存器堆。与现有RISC(或CISC)机器一致,处理寄存器堆的指令指定作为操作数的源和结果的目的寄存器编号。堆栈机器使用同一寄存器堆的一部分(例如,下半部分)来保持Java操作数堆栈。提供Java操作数堆栈指针寄存器,每当处理器处于Java状态时其指向堆栈顶部并因此确定在处理哪些寄存器。状态寄存器不仅包含指定处理器何时处于Java状态的位,而且还包含当处理器处于RISC(或CISC)状态时用来存取Java堆栈的Java寄存器重映射位。在RISC(或CISC)状态下,重映射位在被设置时会致使指令中所指定的寄存器编号(每当其对应于Java操作数堆栈中的寄存器时)被重映射,以相对于堆栈顶部来存取寄存器。也就是说,所存取的寄存器编号等于操作数堆栈指针的最大值减去操作数堆栈指针的值。如果重映射位已经被复位成零,那么所存取的寄存器编号是指令中所指定的编号。在Java状态下忽视重映射位。重映射位有效地允许RISC(或CISC)指令从Java堆栈中存取操作数,(例如)以便获得来自堆栈顶部的操作数和堆栈顶部下方的元素,并将结果放置在堆栈顶部,而不管哪个寄存器实际上保持堆栈值的顶部。图1是共享共用内核处理器元件的组合式RISC/Java微处理器结构的方框图。图2是图1中的处理器的正常运行序列的流程图。图3是展示从各自RISC和Java状态看到的微处理器的寄存器堆的相关部分的方框图。图4是说明用于将图1的处理器在RISC状态与Java状态之间转换的示范性机制的方框图。图5是系统寄存器空间和寄存器堆的相关部分的方框图,其说明当在处理器的RISC状态下执行所俘获的Java指令时本发明的重映射操作。图6是通常将实施图1的微处理器的运行时间系统的方框图。图7是根据本发明的微处理器连同其处理器控制单元和重映射单元的方框图。具体实施方式本发明可适合于组合式RISC/Java处理器结构或组合式CISC/Java处理器结构,或者更一般地适合于具有本机RISC或CISC处理器的堆栈机器的任何组合。如同已经指出的,本发明特别涉及一种用于不但当处理器处于其堆栈机器或Java状态时而且还当处理器处于其本机RISC或CISC状态时存取操作数堆栈的技术。出于说明目的,所述描述内容的其余部分将集中在组合式RISC/Java处理器结构上,并在所述上下文中说明本发明技术。所属领域的技术人员将容易了解如何改编本发明的所述RISC/Java版本以供用于其它可适用的处理结构。JavaVM指令组当前包含201个操作码。所述指令组的较大部分是类型特定的,因此存在许多具有相同意义但适用于不同操作数类型的Java指令。RISC处理器的指令组根据每种结构的特定设计特征而变化,但典型的RISC指令组可包含例如以下各项的指令加载、存储、移动、力n、减、乘、除、非、与、或、异或、比较、移位、旋转、设置、清除、跳跃以及返回。典型RISC指令组中的较大部分与JavaVM指令组重叠。举例来说,Java和RISC状态两者中最频繁执行的指令是加载/存储指令,其在所述两种状态下具有相同的语义内容且可在组合式RISC/Java结构中共享相同的硬件资源。同样,基本算术和逻辑运算共享相同的意义并以相同方式使用共享的算术/逻辑单元(ALU)。然而,一些低级别位操纵指令可能只在RISC指令组中出现而不在JavaVM指令组中出现。同样,Java包含高级别对象创建和操纵指令,这不会出现在典型的RISC指令组中。JavaVM指令组包含一些具有难以用硬件实施的高层语义内容的指令。在单个时钟周期中执行此类高级别指令通常是不可行的,且将其分解成若干复杂度较低的指令的任务就资源分派和时序限制而言较为困难。为了降低硬件开销,可改为将这些Java指令俘获并作为小RISC程序在组合式RISC/Java处理器中执行。所俘获的指令通常将达到所有执行的指令的10%以下。用于每个此类指令的RISC程序存储在可供处理器存取的程序存储器中,且可根据需要由程序员改变。这在对Java指令组的任何未来扩展方面提供了完全的灵活性。但是将高级别Java指令作为RISC程序来执行要求组合式处理器在每当其切换到RISC状态以执行那些指令时仍然能够存取Java操作数堆栈。还将需要在处理器返回Java状态时从堆栈中存取操作结果。参看图l,可适于使用本发明的典型组合式RISC/Java微处理器可包含RISC处理器、用于在RISC处理器中执行第一组Java指令的Java模块、用于在RISC处理器中将第二组Java指令作为微代码执行的RISC模块以及RISC处理器中的数据路径,其中包含由所述两个模块共享的寄存器堆。如在图1中看到,根据本发明的微处理器IO包含Java控制单元11和RISC控制单元13两者,其共享共用数据路径。所述两个控制单元11和13独立操作,但永远不会同时操作处理器。处理器10不会像其它Java处理器那样依赖于对Java二进制格式的翻译或扩展,而是提供两种正交编程模型。处理器IO可被构造为对于数据和指令两者共享共用总线的基本冯*诺伊曼式(von-Neumann)结构,或者可容易地扩展成具有单独数据总线和指令总线的哈佛式(Harvard)结构。可将处理器管线化,以实现高时钟频率和单周期执行。微处理器包含寄存器堆15,其连接到数据总线30。可将程序计数器16、连接寄存器17和堆栈指针18连同任何数目的通用寄存器19一起映射到寄存器堆15中。到寄存器堆15的这种映射允许用与通用寄存器19相同的方式寻址程序计数器16、连接寄存器17和堆栈指针18,使得普通指令可在每当需要时使用这些寄存器。能够将堆栈指针18作为普通寄存器寻址简化了局部变量和参数的分派和存取。堆栈指针18也可由若干指令隐含地使用。程序计数器16含有正被执行的指令的地址。存储器空间是以字节形式寻址的。除了Java状态以外,指令大小可以是两个字节的倍数,其中将程序计数器的最低有效位固定为零。因为将程序计数器16映射到寄存器堆15中,所以其可被用作所有使用寄存器操作数的指令(例如,加载/存储、算术和逻辑指令)中的源操作数或目的操作数。以与跳跃指令相同的方式处理使用编程计数器16作为其目的寄存器的指令,其中在由新的程序计数器值指定的地址处清洗管线并恢复执行。连接寄存器17用于为子例行程序调用以及为管理程序调用、中断请求和异常处理保持返回地址。在所有其它时间,可将连接寄存器位置用作通用寄存器。可针对中断和异常模式包含单独的寄存器堆,以允许具有较低中断等待时间的较高性能。状态寄存器21不同于寄存器堆15,而是可与Java操作数堆栈指针22、Java局部变量寄存器23和Java俘获基准地址寄存器24—起映射到系统寄存器空间20中。状态寄存器21可包含通常的算术/逻辑运算旗标(例如,饱和、溢出、符号、零和进位旗标)、模式位设置(例如,应用程序、管理程序、中断和异常模式)、调试状态位以及中断、异常和调试掩蔽位。此外,对于本发明特别重要的是,状态寄存器21包含Java状态位和Java寄存器重映射位。每当且仅在设置了状态寄存器21中的Java状态位时,处理器10才处于其Java状态。这个位在复位时被清除,且应当仅在Java执行完成时或通过中断和异常或者通过所定义的指令(例如JCALL或RETJ,其中前者用于起始Java状态,而后者用于在指令俘获之后返回到Java状态)来修改。用户手动修改这个Java状态位的尝试可能会导致不确定的行为。每当设置了Java寄存器重映射位时,如同在堆栈机器中一样将寄存器堆15重映射以存取变量。这个位在复位时被清除。如果将这个位写入到JavaVM外部,则可能会导致不确定的行为。以下将更详细地描述这个重映射位的作用。系统寄存器空间20中的Java操作数堆栈指针22用于保持Java操作数堆栈的当前顶部在寄存器堆空间中的位置。Java俘获基准地址寄存器24含有针对所俘获的Java指令的程序代码的基准地址。Java局部变量寄存器23存储临时Java局部变量。此外,Java俘获入口点寄存器可含有针对未实施Java指令的入口点的从基准地址指针到异常例行程序的偏移量。可根据特定硬件处理器设计的需要提供其它系统寄存器。在RISC和Java两种状态下使用的算术逻辑单元(ALU)25连接到寄存器堆15,且ALU的输出被供应到数据总线30。典型的ALU可包含32位加法器、32位桶式移位器和硬件乘法器。算术和逻辑运算在单个时钟周期中执行。除了32位字大小数据类型以外,处理器通常支持半字和字节数据类型,而不会损害代码大小或性能。通常通过对字节和半字数据进行自动符号或零扩展而为字节、半字、字和双字数据提供存储器加载和存储操作。程序计数器16的输出和相关寄存器堆通过通向地址多路复用器33的加法器36处理。地址多路复用器33还连接到地址总线40。指令取出解码器35从数据总线30接收信号,并将输出提供到堆栈控制单元37。处理器结构的这个或其它典型布置可与本发明一起使用。因为RISC和JavaVM指令组的大部分重叠,所以组合式RISC/Java处理器共享硬件资源,但具备单独的Java指令解码器和控制模块11,所述控制模块11在处理器处于其Java状态时接管执行。处理器通过其状态寄存器21追踪其执行状态,且可以无缝方式改变执行状态。在包含处理器的较大运行时间系统中,通常将存在追踪并派遣不同过程的操作系统。Java程序通常将是若干此类过程中的一者。与切换成本机过程(RISC或CISC)的上下文切换相比,与切换成Java过程的上下文切换相关的额外开销较少(如果有的话)。而且,当处理器切换指令解码器(将RISC控制模块13切换成Java控制模块11,反之亦然)时,其不会影响系统设置的安全级别。此外,原则上Java程序可从不同的中断级别执行,而不会干扰处理器的模式设置,但是一般来说不建议用Java编写中断例行程序,原因在于等待时间会相对于相应RISC中断例行程序有所增加。参看图2,微处理器以RISC状态加电51,以便执行初始化代码。在初始化52之后,微处理器可将应用程序作为正常RISC处理器来执行,或者可切换到其Java状态53并开始执行Java程序54。为了调用Java程序,如同其它任何应用程序一样调用JavaVM。确切地说,JavaVM将执行初始化例行程序,随后类别加载器对类别进行分析,并初始化开始执行Java程序所必要的寄存器。类别加载器中的最后指令是jcall指令,其将处理器设置为Java状态。这意味着指令解码器现在解码Java操作码而不是本机RISC操作码。微处理器将继续以Java状态进行操作,直到发生这些事件中的一者为止用于切换回到RISC模式的指明Java操作码58、中断请求59或未实施的Java指令60。如果这些事件中的任何事件发生,则处理器将跳跃到预先界定的地址并切换到RISC模式55且以此方式处理事件。在完成RISC例行程序56后,处理器将使用RETJ指令返回到Java状态57并在Java代码先前停止的点处继续执行Java代码。因此,在Java状态下,处理器能够执行程序的Java部分。此类部分可以是己经在公司的软件库中实施的网络能力或算法,并构成传统软件模块以供重新使用。处理器的RISC状态通过将复杂的Java指令60作为RISC微代码来执行而帮助执行Java代码。其还提供可用于(例如)控制如传感器和致动器等非常专用的外围装置的灵活硬件接口。为了与JavaVM规范兼容,需要实施所有Java指令。然而,在针对小型到中型应用的嵌入式处理器中,Java虚拟机所支持的数字格式中的若干者是多余的。举例来说,此区段中很少处理器提供浮点单元。必须俘获Java的更复杂指令中的若干者并将其作为微代码来执行。我们用"复杂"来表示单个Java指令需要多个机器时钟周期来执行。在Java程序的执行期间,每当处理器遇到硬件中不支持的字节码时,指令解码器将自动辨别这些字节码,将处理器切换到其RISC状态中,并同时跳跃到预先界定的入口点(相对于存储在Java俘获基准地址系统寄存器中的地址而界定的,其中应用于基准地址的偏移量取决于特定俘获指令)。其接着将执行会执行所俘获字节码的语义的RISC软件例行程序。当完成时,所述例行程序会用返回到Java状态(RETJ)指令结束。俘获哪些Java指令且将哪些Java指令直接在硬件中实施通常是由设计者决定的实施方案特定问题。通常,俘获那些创建或操纵Java对象的指令。其它所俘获指令可包含处理长(64位或多字)数据类型的指令、浮动和双重型指令以及任何与所设计的结构不兼容的指令。使用哪个RISC指令组取决于所选择的RISC模型,因为本发明除了本文描述的RISC结构外还可与其它类型的RISC结构一起使用。(如上文提到,本发明还可适于与CISC结构和指令组一起使用。)参看图3,处理器的寄存器堆在其Java状态下具有推进一弹出堆栈的功能,但在本机RISC状态下充当常规的加载/存储寄存器堆。这也是允许所述两个虚拟处理器进行通信的模块,Java堆栈中提供的值在其RISC状态下可由处理器存取。图3展示从RISC和Java模式看到的寄存器堆的一半。寄存器80、81、……、82由Java控制单元61和电路71的RISC部分两者看到。寄存器堆结构71的RISC视域将寄存器元件80、81、……、82看作一组加载/存储寄存器0到M,且RISC结构借助于将特定寄存器指明为源或目的的相应加载/存储指令72、73、……、74来使这些寄存器与数据存储器介接。回想到程序计数器、连接寄存器和堆栈指针连同通用寄存器一起包含在寄存器堆中。为了保持正交性,这些特殊的寄存器如同其它任何寄存器一样是可存取的。Java控制单元61将同一寄存器堆看作为推进一弹出堆栈,其通常具有大约(M+1)/2个寄存器元件。将数据推进62到寄存器堆栈中,以及将数据从寄存器堆栈中弹出63到Java控制单元。其余寄存器可尤其用于程序计数器、堆栈控制寄存器和临时高速暂存寄存器。将堆栈实施为循环堆栈,且所需要的堆栈大小相对较小。堆栈大小是可缩放的,且堆栈元件数目留作实施方案特定的问题。可通过溢出/下溢机制在存储器83中复制出堆栈溢出/下溢。也可通过逐个情况的方式来开发可能的堆栈溢出/下溢机制。图4展示用于将微处理器从一种状态转换到另一种状态的机制的一种可能实施方案。Java和RISC控制模块120和122通过多路复用器124连接到控制线130,所述控制线130通向处理器的共享数据路径。状态寄存器126含有Java状态位128(其被供应到Java和RISC控制模块120和122),并确定这些控制单元中有哪些控制单元正在操作。Java状态位128还充当多路复用器124所进行的选择控制。在所述两个控制模块中将控制转换到预先界定的状态。因此,控制被同时转换,其中所述两个机器将处于相同的界定状态下。Java指令俘获涉及与典型中断机制相似的步骤。当出现未实施的指令时,JAVA控制模块检测到这个,且返回地址被存储在堆栈顶部。接着,处理器切换到RISC模式并从存储器中的预先界定位置处取出跳跃地址。接着,RISC模块在最后步骤中所取出的地址处继续执行。使得俘获机制类似于中断机制会实现最大的灵活性,因为在设计中只预先界定第一跳跃地址。这将使得软件连接程序能够通过只连接程序中实际存在的Java操作码的RISC例行程序来最佳地计划存储器使用,因而节省宝贵的存储器空间。RISC例行程序应当通过将程序计数器从堆栈顶部弹出并将其保存在程序计数器寄存器中来结束。这将确保Java程序在正确的位置处继续。此外,微处理器具有堆栈溢出/下溢处理机制。Java推进一弹出堆栈中的这种机制可通过将现有逻辑重新用于指令俘获来实施。当出现溢出时,处理器俘获溢出旗标并跳跃到预先界定的地址,在所述地址处其发现到达将处理溢出/下溢情形的软件程序的跳跃向量。参看图5,寄存器堆的功能在Java和RISC状态下有所不同。在所述两种状态下,三个寄存器(此处为R15—R13)专用于程序计数器(PC)、连接寄存器(LR)和系统或应用程序堆栈指针(SP),如上文已经论述的。在RISC状态下,寄存器堆90的其它寄存器(此处为R12—R0)可用于正常RISC操作,例如寻址操作数。在Java状态下,JavaVM作为零操作数堆栈机器执行,且因此改变寄存器堆功能性以有利于推进一弹出堆栈,其中操作数堆栈的当前顶部可以是ToS到ToS-7(此处使用寄存器R7—R0)中的任意者。此外,其它寄存器(例如R9禾I1R8)可在Java状态下用作含有指向Java局部变量O的当前帧地址的帧寄存器(系统寄存器空间100中的七个Java局部变量寄存器104中的一者),且用作含有指向当前Java类别的恒定集区的恒定集区寄存器。除了Java局部变量寄存器之外,系统寄存器空间100还包含操作数堆栈指针102,其指向操作数堆栈的当前顶部(同样,ToS到ToS-7中的任意者)。Java操作数堆栈(ToS到ToS-7)保持将由Java指令操作的值以及操作结果。操作数堆桟是当前方法帧的一部分,且操作数堆栈的一部分保持在寄存器堆中以便加速操作。寄存器堆通常保持操作数堆栈的多达八个元件,如此处所示,堆栈的剩余部分作为JavaVM帧的一部分存储在存储器中。(帧是保持所有变量和参考以支持Java方法的执行的运行时间数据结构,且可含有针对所述方法的引入自变量以及针对调用方法的引出自变量。在调用所述方法时分派帧,且在程序从所述方法返回时将帧销毁。示范性帧可包含操作数堆栈、局部变量、指向可放置下一帧的空闲存储器空间的指针、所述方法的返回地址、先前方法的帧指针以及先前方法的恒定集区指针和堆栈指针。)系统寄存器100包含具有两种功能的Java操作数堆栈指针102。其展示操作数堆栈上的元件数目,并还指向(例如,在位[2:0]中)保持当前堆桟顶部的寄存器。操作数堆栈指针被初始化为0值,这意味着操作数堆栈是空的。如果操作数堆栈溢出或下溢,则产生异常,且异常例行程序负责将操作数堆栈的内容从寄存器堆复制到存储在存储器中的当前方法帧。(举例来说,在含有多达八个元件的堆栈的寄存器堆中,每当将第九个元件推进到堆栈上时发生溢出情形。如果试图从空的堆栈进行存取,则发生下溢情形。)俘获例行程序需要在处理器的RISC状态下存取Java操作数堆栈。为了避免必须读出Java操作数堆栈指针102并将其转换到正确的寄存器的繁琐过程,处理器的Java控制单元先执行寄存器重映射操作(其会产生重映射的寄存器堆90a),然后才将控制转移给RISC单元,所述RISC单元确保堆栈顶部(ToS)始终在寄存器R7中,ToS-l始终在寄存器R6中等。在状态寄存器101中,提供重映射位RM。每当处理器作为堆栈机器(即,在Java状态下)运行时,这个重映射位RM便被丢弃。然而,在处理器的本机RISC状态下,重映射位RM具有以下语义如果RM为0,则存取的寄存器编号=指定的寄存器编号(即,不发生重映射);如果RM为1,则存取的寄存器编号=操作数堆栈指针的最大值_操作数堆栈指针值。举例来说,在八寄存器堆栈ToS到ToS-7中,操作数堆栈指针的最大值将是7。在重映射位RM设置为"1"的情况下,寄存器编号R7到R0将分别存取保持堆栈元件ToS到ToS-7的寄存器。RISC指令"添加R7、R6"于是将有效地添加ToS和ToS-l。如果操作数堆栈指针将指向寄存器R3,那么存储ToS和ToS-l的实际寄存器分别是R3和R2,且添加操作将使用这两个物理寄存器来进行添加操作。图7展示重映射单元173附接到RISC处理器的控制单元171外部的典型布置。将形成每一重映射单元173的逻辑电路复制若干次,复制次数与寄存器堆175中的读取和写入端口的数目相等。每一重映射单元173均具有控制输入RM(=1,用于启用重映射操作;=0,用于传递接收到的寄存器地址而不进行重映射)以及来自Java操作数堆栈指针(图5中的102)的指示堆栈顶部位置的JOSP。(JOSP—般是对应于可重映射的寄存器位置的数目的多位信号。)每一重映射单元173具有寄存器地址输入173,和寄存器地址输出1730。寄存器地址输入173z从处理器控制逻辑171接收单独的寄存器地址。接着,寄存器地址输出173o向寄存器堆171的端口输出对应的物理寄存器地址。对于以上图5中给出的实例,在Java操作数堆栈指针102提供堆栈顶部值3(JOSP=3)的情况下;那么,每当RM:1时,如果寄存器地址输入173!分别是7和6(例如,对于指令添加R7、R6),则寄存器地址输出173o将给出经重映射的值3和2作为实际物理位置,以便存取寄存器堆175中的寄存器R3和R2。当将新的值推进到操作数堆栈时,必须使用特殊的递增Java操作数堆栈指针指令"incjosp"来确保堆栈一致性。这个指令将使操作数堆栈指针102以指定数量N来递增,并借此将所有操作数堆栈元件下推N个元件。这释放了堆栈顶部的N个元件。此后,到达堆栈上的值可移动到R7。incjosp指令还可用于通过使操作数堆栈指针递减来将元件从堆栈中弹出。所述指令还将在堆栈溢出/下溢情况出现时以前述方式自动处理堆栈溢出/下溢情况。Java局部变量也可作为前八个变量的系统寄存器104由RISC俘获例行程序存取。对于更多的变量,其可在存储器中的当前帧中存取。参看图6,图中展示具有此处理器概念的系统的典型运行时间环境。开发者可在普通Java编译器142中编译Java源代码141,并以Java字节码144结束。如果处理器使操作系统适应堆加载器和自动存储器管理系统,则这个过程的剩余部分可动态且自动地发生。然而,小型嵌入式系统通常并不需要操作系统,那么在必须于外部平台上创建程序的存储器映像的意义上,这个过程的剩余部分必须手动进行。必须通过连接程序148分析Java字节码144。通过连接程序运行的程序将(1)核实字节码不含有任何非法操作码,依据仪器解决方案来修改代码或操作码;(2)将应用程序与指定Java类别运行时间库145连接;(3)将汇编码连接到RISC部分143,设立堆积区域,设立分支和跳跃地址,并制作存储器映射。来自连接程序的输出将为可转移到嵌入式系统152中的ROM或快闪存储器151的存储器映像。制作Java处理器的大部分目的是编程者应当能够尽量无约束地使用Java编程语言。然而,在此情况下,只可使用所支持的类型,且将只有有限的运行时间库可用。然而,这些限制因素对于Java的主要特征的使用并不形成限制。JavaVM规范目前含有201个指令;其中有许多是类型特定的且本质上对于不同的数据类型是相同的。硬件实施的指令的数目和俘获的指令的数目取决于所使用的RISC结构。其它类型的RISC结构将影响硬件实施和俘获的指令的数目。以下指令在本发明的优选实施例中不是硬件实施的,因为不认为这些指令在小型嵌入式处理器中是重要的所有"浮动"类型的指令、所有"双重"类型的指令以及所有"长"类型的指令。这从所述201个可能的Java指令中消除了大约90个指令。在剩余指令中,68个指令在Java虚拟机中实施,且43个指令被俘获并作为RISC例行程序执行。以下在表1中注释被俘获并作为RISC例行程序执行的Java指令。表1<table>tableseeoriginaldocumentpage15</column></row><table>通过这些实施方案选择,通常至少70%的Java指令将直接在处理器中执行,而不超过30%的将被俘获并作为RISC程序执行。这些百分比是从动态测量导出的,且对于大多数Java程序通常将为约90%和10%。本发明改进了在执行所俘获的Java指令期间对Java操作数堆栈值的RISC存取。重映射寄存器位置确保对所俘获指令的RISC执行正确地存取Java操作数堆栈顶部,且所俘获操作的结果在返回到Java状态时即可存取。权利要求1.一种用于将字节编译的Java代码作为硬件执行的微处理器,所述微处理器包括处理器内核;Java控制模块,其用以在所述处理器内核中执行第一组Java指令;本机控制模块,其用以在所述处理器内核中执行本机指令,并在所述处理器内核中将第二组Java指令作为本机微代码来执行;一组系统寄存器,其可由所述Java和本机控制模块存取且包含状态寄存器,所述状态寄存器含有指明在任何给定时间所述控制模块中的哪一者正在操作的处理器状态控制信息;以及寄存器堆,其处于所述处理器内核的数据路径中且可由所述两个控制模块存取,所述寄存器堆包含多个寄存器元件,所述本机控制模块将所述多个寄存器元件看作存储寄存器,所述Java控制模块将所述寄存器元件的第一部分看作Java操作数堆栈,并将所述寄存器元件的第二部分看作存储寄存器;其中所述系统寄存器组还包含Java操作数堆栈指针,其指向所述寄存器堆中的作为所述堆栈的当前顶部的所述寄存器元件,且所述状态寄存器还含有Java寄存器重映射位,使得每当设置所述重映射位时,将所述第二组的Java指令作为本机微代码执行的所述本机控制模块将由所述本机微代码中的指令指定的寄存器编号视为对应于相对于所述堆栈顶部的指定寄存器元件。2.根据权利要求1所述的微处理器,每当设置所述重映射位时,由本机微代码指令存取的相对于所述堆栈顶部的对应寄存器是所述操作数堆栈指针的最大值减去由所述Java操作数堆栈指针指定的寄存器编号。3.根据权利要求l所述的微处理器,每当已经复位所述重映射位时,所述本机控制模块将由本机指令指定的寄存器编号视为指明所述寄存器堆的对应存储元件。4根据权利要求1所述的微处理器,其中所述Java控制模块忽视所述重映射位。5.根据权利要求1所述的微处理器,其中所述第二组的Java指令比所述第一组的Java指令复杂,所述第二组的所述指令不能够在一个时钟周期内在所述处理器内核中执行。6.根据权利要求5所述的微处理器,其中所述第二组Java指令包含用于创建和操纵Java对象的指令。7.根据权利要求5所述的微处理器,其中所述第二组Java指令包含处理长和浮点数据类型的指令。8.根据权利要求5所述的微处理器,其中所述第二组Java指令包含双重型指令。9.根据权利要求1所述的微处理器,其中所述处理器内核是RISC处理器,所述本机指令是RISC指令,且所述用于实施所述第二组Java指令的本机微代码是RISC微代码。10.根据权利要求l所述的微处理器,其中所述寄存器堆包含含有待执行指令的存储器地址的程序计数器作为所述寄存器元件中的一者。11.根据权利要求l所述的微处理器,其中所述寄存器堆包含含有用于在完成子程序调用之后执行的返回地址的连接寄存器作为所述寄存器元件中的一者。12.根据权利要求l所述的微处理器,其中所述寄存器堆包含每当所述存储器堆为满时指向临时存储器位置以存取局部变量的本机堆栈指针作为所述寄存器元件中的一者。13.根据权利要求l所述的微处理器,其中所述系统寄存器组包含Java局部变量寄存器,所述寄存器处于所述处理器内核的所述数据路径中且可由所述Java控制模块存取以在所述Java操作数堆栈外部临时存储Java局部变量和参数。14.根据权利要求1所述的微处理器,其中所述系统寄存器组包含Java俘获基准地址寄存器,所述寄存器含有指向所述第二组Java指令的微代码的存储器基准地址。15.—种在微处理器中执行Java指令的方法,其中将所述Java指令的子组作为所述微处理器的本机微代码执行,所述方法包括(a)提供Java控制模块和本机控制模块,所述Java控制模块用以控制所述微处理器对第一子组Java指令的直接执行,所述本机控制模块用以控制所述微处理器对本机指令的直接执行,所述本机控制模块还控制将第二子组Java指令作为本机微代码的执行,所述微处理器具有处于所述微处理器的数据路径中的寄存器堆和一组系统寄存器,所述两者均可由所述Java和本机控制模块存取,所述寄存器堆包含多个寄存器元件,使得所述本机控制模块将所述多个寄存器元件看作存储寄存器,且所述Java控制模块将所述寄存器元件的第一部分看作Java操作数堆栈并将所述寄存器元件的第二部分看作存储寄存器,所述系统寄存器组包含指向所述寄存器堆中作为所述堆栈的当前顶部的寄存器元件的Java操作数堆栈指针,所述系统寄存器组还包含含有Java寄存器重映射位的状态寄存器;(b)在所述Java控制模块的控制下由所述微处理器执行第一组Java指令,直到16.17.18.19.20.21.22.23.辨认出所述第二组的Java指令为止;(c)在辨认出所述第二组的Java指令后,便存取所述Java指令的对应本机微代码,设置所述Java寄存器重映射位,将操作转交给所述本机控制单元,并执行所述本机微代码,使得当以所述微代码执行本机指令时,将由那些本机指令指定的寄存器视为对应于所述寄存器堆的相对于所述堆栈的当前顶部的指定寄存器元件;(d)在完成所述第二组的Java指令的所述微代码后,便将操作归还给所述Java控制单元,并在下一Java指令处恢复执行;以及(e)重复步骤(b)到(d),直到完成所有Java指令为止。根据权利要求15所述的方法,其中将操作转交给所述本机控制单元和将操作归还给所述Java控制单元是通过所述状态寄存器中的处理器状态控制信息调解的。根据权利要求15所述的方法,其中所述系统寄存器组包含Java俘获基准地址寄存器,所述寄存器含有指向所述本机微代码的存储器基准地址,且存取所述第二组中的特定Java指令的所述对应本机微代码的涉及向所述基准地址应用针对所述指令而指定的偏移量并接着在所得偏移地址处存取存储器。根据权利要求15所述的方法,使得每当设置所述重映射位时,由所述本机微代码指令存取的相对于所述堆栈顶部的所述对应寄存器是所述操作数堆栈指针的最大值减去由所述Java操作数堆栈指针指定的寄存器编号。根据权利要求15所述的方法,其中所述第二组的Java指令比所述第一组的Java指令复杂,所述第二组的指令不能够由所述微处理器在一个时钟周期内作为原子指令来执行。根据权利要求19所述的方法,其中所述第二组Java指令包含用于创建和操纵Java对象的指令。根据权利要求20所述的方法,其中所述第二组Java指令包含处理长和浮点数据类型的指令。根据权利要求21所述的方法,其中所述第二组Java指令包含双重型指令。根据权利要求22所述的方法,其中所述微处理器是RISC处理器,所述本机指令是RISC指令,且所述用于实施所述第二组Java指令的本机微代码是RISC微代码。全文摘要构造一种组合式本机(RISC或CISC)微处理器和堆栈(Java)机器(10、11、13),使得JavaVM指令可用硬件执行。大多数Java指令被直接执行(54),而例如操纵Java对象的指令的较复杂Java指令作为本机微代码执行(56)。为了使本机微代码指令存取Java操作数堆栈,Java操作数堆栈指针(22;102)指向作为堆栈当前顶部(ToS)的寄存器堆(15;90)位置,而状态寄存器(101)中的重映射位(RM)指示将本机指令中所指定的寄存器重映射(90a)为最大Java操作数堆栈指针值减去所述Java操作数堆栈指针的当前值。文档编号G06F9/22GK101156131SQ200680011695公开日2008年4月2日申请日期2006年3月8日优先权日2005年4月15日发明者克里斯蒂安·蒙森,厄于温·斯特伦,埃里克·雷诺申请人:爱特梅尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1