计算机系统和改编计算机系统以使其支持寄存器窗口架构的方法

文档序号:6456059阅读:212来源:国知局

专利名称::计算机系统和改编计算机系统以使其支持寄存器窗口架构的方法
技术领域
:本发明通常涉及计算机和计算机系统领域。更具体地讲,本发明涉及一种被改编以支持寄存器窗口架构的计算机系统以及一种改编计算机系统以使其支持寄存器窗口架构的方法。
背景技术
:中央处理单元(CPU)或处理器处于所有现代计算系统的心脏。处理器执行计算机程序的指令,从而使计算机能够执行有用的工作。不仅在诸如个人计算机、膝上型电脑和PDA的专用计算机器中,在现代生活中的所有形式的数字装置中都普遍存在CPU。现代微处理器出现在从汽车到洗衣机到儿童玩具的每一件物品中。产生这样的问题可由一种类型的处理器执行的程序代码经常不能由任何其它类型的处理器执行。首先,每一种类型的处理器具有其自身的独特指硬件特点。因此,程序代码转换领域已经发展为将为一种类型的处理器撰写的程序代码自动转换为可由另一种类型的处理器执行的代码,或者针对同一类型的处理器将旧的、效率低的一段代码优化为更新更快的版本。即,在嵌入式和非嵌入式CPU中,有主导ISA(针对主导ISA,大部分软件已经存在),这些主导ISA可以进行性能"加速"或者被"翻译"给体现出更好的成本/性能效益的其它处理器。还发现主导CPU架构,这些主导CPU架构被实时地锁定于其ISA并且在性能或者市场占有方面无法发展。这一问题涉及所有级别的电子产业,从独立袖珍式装置直到具有几十或几百个强大的计算机的大规模网络。作为程序代码转换这一领域的背景信息,名称为"ProgramCodeConversion"的WO2000/22521号PCT公布、名称为"MethodandApparatusforPerformingInterpreterOptimizationsduringProgramCodeConversion"的WO2004/095264号PCT乂^布、名称为"ImprovedArchitectureforGeneratingIntermediateRepresentationsforProgramCodeConversion"的WO2004/097631号PCT公布、名称为"MethodandApparatusforPerformingAdjustablePrecisionExceptionHandling"的WO2005/006106号PCT公布以及名称为"MethodandApparatusforPreciseHandlingofExceptionsDuringProgramCodeConversion"的WO2006/103395号PCT公布通过引用全部包含于此,这些PCT公布公开了提高程序代码转换能力的方法和设备,这些方法和设备可在这里所讨论的示例实施例中采用。大部分现代处理器包括一组寄存器作为快速存取存储器。处理器在执行计算机程序中的指令序列时利用这些寄存器来保存临时值。处理器硬件包含有限数量的这种寄存器,并且在使用中,程序的执行会很容易地使临时数据值填满所有可用的寄存器。当处理器从一个代码段移动到另一代码段时,这会导致对可用寄存器的竟争,因为每一代码段均将产生临时值并将需要使用处理器中的寄存器来存储这些临时数据值。响应这一困难,已开发出具有寄存器窗口架构的处理器。例如,二十世纪九十年代初的基于BerkeleyRISC设计的寄存器窗口架构提供一个大的硬件寄存器集(寄存器文件),并且仅允许这些寄存器中的一个小的子集(寄存器窗口)被当前代码段访问。寄存器文件中位于寄存器窗口的当前位置之外的其它寄存器不能被当前的计算机程序段访问。例如,在总共64个寄存器的寄存器文件中,任何时候都仅有8个寄存器是可见的。当处理器从一个代码段移动到另一个代码段时,例如在执行进程调用时,寄存器窗口在寄存器文件中移动位置并为新的代码段暴露不同的寄存器子集。这些移动大致分为两类一类引起SAVE(保存)类型的移动,其中,寄存器窗口移动到先前未使用过的位置,从而为正在执行的对象代码呈现一组干净的硬件寄存器;另一类是RESTORE(恢复)类型的移动,该移动将寄存器窗口往回向着先前暴露过的位置移位,从而将一组先前使用过的寄存器展现给正在执行的代码,从而恢复对这些寄存器中保存的数据值的访问。然而,取决于执行程序所调用的进程调用级别的数量,寄存器文件中的有限数量的硬件寄存器最终将被耗尽。这里,执行SPILL(溢出)操作,寄存器中的数据值藉此被移动到安全位置,例如处理器之外的第二级存储器中。稍后,FILL(载入)操作将这些数据值移回到硬件寄存器中以便处理器能够继续执行相关的代码段。这种寄存器窗口架构的目的在于通过为大部分计算机程序避免费时费力的寄存器溢出和载入操作来使计算系统更快地执行,特别是在处理器频繁地从一个代码段移动到另一个代码段,然后返回到最初的代码段(即,执行进程调用)时。这种寄存器窗口架构已经-故诸如SPARC、AMD2卯00和Inteli960的处理器大规模地商业应用。因此,已经撰写了仅在这些架构上执行且不能由任何其它类型的处理器执行的大部分代码。在这些商业处理器中,SPARC特别流行。在例如由佛罗里达州圣何塞市SPARC国际公司公布的"SPARC架构指南(第八版)"第4.1节"寄存器"以及"SPARC架构指南(第九版)"第5.1节"寄存器"中可以找到关于SPARC寄存器窗口架构的进一步的背景信息,所述内容通过引用包含于此。作为示例,图1示出在现有技术的第9版本的SPARC架构中的寄存器窗口的使用。第9版本的SPARC架构提供多个控制/状态寄存器和大量通用("r")寄存器。通用寄存器包括8个永久可见的全局寄存器(和另外8个备用全局寄存器)以及可移动的24-寄存器窗口,该24-寄存器窗口被划分为8个"in"寄存器、8个"local(局部)"寄存器和8个"out"寄存器。总寄存器文件中的当前窗口由控制/状态寄存器之一中保存的"当前窗口指针(CWP)"给出。每次执行"restore"指令时,CWP增加;每次执行"save"指令或者当发生陷阱(trap)时,CWP减小。在该示例中,24-寄存器窗口与相邻窗口位置部分重叠,例如一个窗口位置的8个"out"寄存器与相邻窗口位置的8个"in"寄存器重叠,同时对于每一窗口位置,局部寄存器是独有的。也就是说,窗口位置CWP+1的"out"寄存器也可按照相邻窗口位置CWP的"in"寄存器进行寻址。此外,当前窗口CWP的"out"寄存器等同于下一窗口CWP-1的"in"寄存器。第9版本的SPARC架构支持最少3个到最多32个的窗口位置,这取决于具体的硬件实现。因此,连同永久可见的全局寄存器,第9版本的SPARC架构需要64至528个通用硬件寄存器(8个全局寄存器、8个备用全局寄存器以及每一窗口位置所需的16个寄存器)。图2示出在示例第9版本的SPARC架构中的窗口化的寄存器文件的环形特征。硬件寄存器的数量有限,并且在本示例中,存在与8个寄存器窗口位置对应的128个窗口化的硬件寄存器。图2示出窗口位置W0作为当前窗口(CWP=0)。如果利用当前窗口位置WO的过程^丸行RESTORE,则窗口位置W7将变为当前窗口(CWP=+1)。如果位置WO处的过程改为执行SAVE,当前窗口。当所有的寄存器窗口位置均已被消耗时,即由于这些寄存器已经包含来自于之前执行的程序代码段的有效数据,从而不应该被覆写时,发生窗口上溢陷阱。在示例第9版本的架构中,利用链接到CWP的CANSAVE控制/状态寄存器来检测窗口上溢。此时,寄存器的内容被溢出到存储器的较慢的存取区域,如主对象存储器8的执行堆栈,以便在不覆写寄存器文件中存储的有效数据的情况下继续执行。当程序最终恢复到再次需要原始寄存器值的点时,载入操作将寄存器值从所述堆栈载回到寄存器文件的硬件寄存器中。这里,参考CANRESTORE控制/状态寄存器,窗口下溢陷阱防止寄存器窗口的无效恢复移动。在本示例中,原始程序代码(这里被称作"对象代码")依赖于具有寄存器窗口架构的特定类型的对象硬件。然而,在本发明的程序代码转换领域,对象代码被转换为目标代码并由目标计算系统执行。也就是说,并非使用较新的目标计算机系统替代基于该寄存器窗口架构的较旧的对象计算机系统,而是期望使目标计算机系统支持对象计算系统的寄存器窗口架构。本发明的目的在于提供一种被改编以支持寄存器窗口架构的计算系统。示例性实施例的目的在于改编计算机系统以使其支持外来的、非本地的寄存器窗口架构。
发明内容根据本发明,提供如所附权利要求中所阐述的一种计算系统、一种改编计算机系统的方法以及一种计算机可读存储介质。从所附权利要求以及跟随的描述,本发明的其它特征将是明显的。在本发明的一个示例性方面,提供一种至少包括解码器单元、编码器单元、存储器和目标处理器的计算系统。解码器单元被布置为将可由基于寄存器窗口的对象计算架构的对象处理器执行的对象代码解码,在该基于寄存器窗口的对象计算架构中,当前寄存器窗口被定位为使从窗口化的寄存器文件中选择的对象寄存器的子集显露。所述对象代码包括基于窗口的指令和基于寄存器的指令,基于窗口的指令影响与寄存器文件有关的寄存器窗口的位置,基于寄存器的指令包含对寄存器窗口中的寄存器的引用。解码器单元还被布置为识别对象代码中的意图引起寄存器窗口的移动的基于窗口的指令,并从基于窗口的指令获得寄存器窗口移动信息。此外,解码器单元被布置为识别对象代码中的基于寄存器的指令,并从基于寄存器的指令获得一个或多个窗口化的对象寄存器引用。存储器包括堆栈数据结构,该堆栈数据结构被布置为存储多个条目。编码器单元被布置为从解码器单元所解码的对象代码产生目标代码。目标处理器被布置为执行由编码器单元产生的目标代码。目标代码在目标处理器上的执行设置与堆栈数据结构的头有关的堆栈指针,参考由解码器单元获得的寄存器窗口移动信息调节该堆栈指针,参考该堆栈指针与从解码器单元所获得的每一窗口化的对象寄存器引用确定的位移的组合来访问堆栈数据结构中的条目。在本发明的另一示例性方面中,提供一种改编计算系统以使其支持寄存器窗口架构的方法。该方法包括步骤将可由基于寄存器窗口的对象计算架构的对象处理器执行的对象代码解码,其中,寄存器窗口被定位为使从窗口化的寄存器文件中选择的对象寄存器的子集显露,包括从对象代码中的指令识别窗口化的对象寄存器引用,以及从对象代码中的导致寄存器窗口的移动的指令获得寄存器窗口移动信息,其中所述窗口化的对象寄存器引用包括对寄存器窗口中的所述对象寄存器之一的引用;在计算系统的存储器中设置堆栈数据结构,并设置指示在存储器中该堆栈数据结构的头的堆栈指针,其中该堆栈数据结构被布置为存储多个条目;将对象代码转换为目标代码,并在计算系统的目标处理器上执行该目标代码;参考识别出的寄存器窗口移动信息调节堆栈指针;参考堆栈指针与从窗口化的对象寄存器引用确定的位移的组合来访问堆栈数据结构中的至少一个条目。在本发明的另一示例性方面,提供一种记录有计算机可实现的指令的计算机可读存储介质,当所述计算机可实现的指令被执行时,改编计算系统以使其支持寄存器窗口架构,其中,该计算机可读存储介质包括被布置为将可由基于寄存器窗口的对象计算架构的对象处理器执行的对象代码解码的代码单元,在所述基于寄存器窗口的对象计算架构中,当前寄存器窗口被定位为使从窗口化的寄存器文件中选择的对象寄存器的子集显露,所述解码包括从对象代码中的指令识别窗口化的对象寄存器引用,以及从对象代码中的导致寄存器窗口的移动的指令获得寄存器窗口移动信息,其中所述窗口化的对象寄存器引用包括对寄存器窗口中的所述对象寄存器之一的引用;被布置为在计算系统的存储器中设置堆栈数据结构并设置堆栈指针的代码单元,其中该堆栈数据结构被布置为存储多个条目,所述堆栈指针指示在存储器中该堆栈数据结构的头;被布置为将对象代码转换为目标代码并使该目标代码在计算系统的处理器上执行,从而参考识别出的寄存器窗口移动信息调节堆栈指针,并且参考调节的堆栈指针与从窗口化的对象寄存器引用确定的位移的组合来访问堆栈数据结构中的至少一个条目的代码单元。本发明的示例性实施例涉及改编计算系统以使其支持寄存器窗口架构的机制,特别适用于将用于对象计算系统的对象处理器的对象代码转换为由目标计算系统上的目标处理器执行的目标代码。该机制在目标计算系统的存储器中设置堆栈数据结构(SR堆栈)。SR堆栈具有多个帧。SR堆栈上的每一帧存储一组条目,所述条目与对象代码所寻址的寄存器窗口中的窗口化的对象寄存器子集对应。然后,在目标计算架构上执行的目标代码访问SR堆栈。SR堆栈能够存储大量这样的帧,避免了诸如模拟从对象架构的窗口化的寄存器文件的自动溢出和载入操作的开销。在一个示例性实施例中,仅具有16个工作寄存器的目标计算系统被改编以支持表现依赖几十甚至几百个对象寄存器的窗口化的寄存器文件的寄存器窗口架构。此外,即使在目标计算系统被改编为支持寄存器窗口架构时,示例性实施例也允许目标计算系统的有效率的操作,特别是在处理速度方面。为了更好地理解本发明并示出可如何实现本发明的实施例,现在将以示例的方式说明附图,其中图1示出在现有技术的示例对象计算架构中的寄存器文件部分;图2进一步示出在现有技术的示例对象计算架构中的寄存器文件;图3是由本发明的示例性实施例采用的设备的示意性框图4是由本发明的示例性实施例采用的程序代码转换处理的示意性概括图5是由本发明的示例性实施例提供的寄存器窗口仿真机制的示意性概括图6是图5的寄存器窗口仿真机制的更详细的示意图;图7是进一步示出图5和图6的寄存器窗口仿真机制的示例实施例的表;图8A和图8B是进一步示出图5和图6的寄存器窗口仿真机制的另一示例实施例的表;图9是示出根据本发明示例性实施例的改编计算机系统以使其支持寄存器窗口架构的方法的示意性流程图10是示出本发明的示例性实施例的计算系统中的存储器的选择的部分的示意图;.图11是示出执行本发明的示例性实施例的传递机制的示例方法的示意性流程图12A和图12B是更详细地示出该传递机制的示意图。具体实施例方式提供下面的描述以使本领域的技术人员能够实现并使用本发明,下面的描述阐述发明人预期的执行其发明的最佳方式。然而,各种修改对于本领域技术人员而言仍然是明显的,因为这里已经具体定义了本发明的一般原理以提供改善的程序代码转换方法和设备。参照图3,对象程序17意图在具有对象处理器3的对象计算平台1上执行。这里,对象计算平台1可以是任何形式的电子装置,该电子装置依赖于对象处理器3中的计算操作来操作该装置。然而,目标计算平台IO用于通过翻译器单元19来执行对象程序17,该翻译器单元19执行程序代码转换。这里,翻译器单元19将对象代码17转换为目标代码21,以使得目标代码21能够被目标计算平台IO执行。如本领域技术人员所熟悉的,对象处理器3具有一组对象寄存器5。除了其它内容,对象存储器8还保存对象代码17和对象操作系统2。类似地,图3中的示例目标计算平台10包括具有多个目标寄存器15的目标处理器13以及存储器18,存储器18存储包括目标操作系统20、对象代码17、翻译器代码19和翻译的目标代码21的多个操作组件。目标计算平台10通常是基于微处理器的计算机或其它适合的计算机。在一个实施例中,翻译器代码19是在优化或没有优化的情况下,将对象指令集架构(ISA)的对象代码翻译成另一ISA的翻译的目标代码的仿真器(常被称为"this-to-that"翻译器)。在另一实施例中,翻译器19起到通过执行程序代码优化来将对象代码翻译为目标代码(对象代码和目标代;乌均具有相同的ISA)的功能(被称为"thistothis"翻译器或者"加速器")。适宜地,翻译器代码19是用于实现翻译器的源代码的编译版本,并与操作系统20结合地在目标处理器13上运行。应该理解的是,图3示出的结构仅是示例性的,例如根据本发明实施例的软件、方法和处理可以在驻留于操作系统20之内或之下的代码中实现。存储器18的对象代码17、翻译器代码19、操作系统20和存储机制可以是本领域技术人员所知的各种类型中的一种。在根据图3的设备中,在运行时,动态地执行程序代码转换从而在目标代码21运行的同时在目标架构10上执行程序代码转换。也就是说,翻译器19与翻译的目标代码21内联地运行。通过翻译器19运行对象程序17包括以交织方式执行的两种不同类型的代码翻译器代码19;和目标代码21。因此,在运行时,始终基于存储的正被翻译的程序的对象代码17,通过翻译器代码19来产生目标代码21。在一个实施例中,翻译器单元19对对象架构1的相关部分,如对象处理器3,特别是对象寄存器5进行仿真,同时将对象程序17作为目标代码21在目标处理器13上实际执行。在优选实施例中,提供至少一个全局寄存器贮备27(也被称为对象寄存器组27或抽象寄存器组27)。在多处理器环境下,可选地,根据所考虑的对象处理器的架构提供一个以上的抽象寄存器组27。通过翻译器19和目标代码21的组件来提供对象状态的表示。即,翻译器19在多个显式的程序语言器件,如变量和/或对象中存储对象状态。相比之下,翻译的目标代码21在由目标代码21的目标指令控制的目标寄存器15和存储位置18中隐含地提供对象处理器状态。例如,全局寄存器贮备27的低级别表示仅是分配的存储器的区域。然而,在翻译器19的源代码中,全局寄存器贮备27是能够在更高级别下被访问和操作的数据序列或者对象。目标代码21的执行执行对象代码17所预期的工作,并且还更新对象处理器3的仿真模型,以使得翻译器19能够确定仿真的执行上下文(对象状态),并且作为响应,准确地控制执行的流程以动态地选择、翻译和执行对象程序的适当的块作为目标代码。术语"基本块"应该是本领域技术人员所熟悉的。基本块是具有将块代码限于单个控制路径的确切的一个入口点和确切的一个出口点的代码段。因此,基本块是控制流程的有用的基本单元。适宜地,翻译器19将对象代码17划分为多个基本块,其中每一基本块是单个入口点处的第一指令和单个出口点(如跳转、调用或者分支指令)处的最终指令之间的连续指令集。翻译器19可以仅选择这些基本块中的一个(块模式),或者可以选择一组基本块(组块模式)。适宜地,组块包括将作为一个单元被对待的两个或多个基本块。另外,翻译器可形成等同块(iso-block),该等同块表示不同入口条件下的对象代码的相同基本块。在优选实施例中,作为从原始对象程序17产生目标代码21的处理的一部分,基于对象指令序列产生中间表示(IR)树。IR树是由对象程序计算的表达式以及由对象程序执行的操作的抽象表示。随后,基于IR树产生("培育")目标代码21。实际上,IR节点的集合是有向无环图(DAG),但是通俗地称为"树"。本领域技术人员应该理解,在一个实施例中,利用面向对象的编程语言,如C+十来实现翻译器19。例如,IR节点被实现为C+屮对象,对其它节点的引用被实现为对与这些其它节点对应的C十+对象的C+十引用。因此,IR树被实现为包含彼此间的各种引用的IR节点对象的集合。此外,在所讨论的实施例中,IR的产生利用与对象架构的特定特征对应的寄存器定义集,其中对象程序17意图在该对象架构上运行。例如,存在用于对象架构上的每一物理寄存器(即,图3的对象寄存器5)的唯一寄存器IR树)的引用的C+十对象。被所述寄存器定义集引用的所有IR树的总和被称为工作IR森林("森林"缘自其包含多个抽象寄存器根,每一抽象寄存器根引用IR树)。适宜地,这些IR树和其它处理形成翻译器19的一部分。图3还示出目标架构10的存储器18中的本地代码28。来源于对象代码17的运行时翻译的目标代码21与直接针对目标架构撰写或编译的本地代码28之间存在区别。在一些实施例中,当翻译器19检测到对象程序的控制流程进入对象代码17的诸如对象库的部分,而针对该部分存在对象代码的本地版本时,通过翻译器19来实现本地绑定。代替翻译对象代码,翻译器19改为使等效的本地代码28在目标处理器13上执行。在示例实施例中,翻译器19利用定义的接口,如本地代码或目标代码调用存根(stub)来将产生的目标代码21绑定到本地代码28,在公布的PCT申请WO2005/008478中更详细地讨论了所述接口,所述PCT申请通过引用包含于此。图4更详细地示出在目标计算平台10上运行时的翻译器19。如上所述,翻译器19的前端包括解码器单元191,该解码器单元191将对象程序17的当前所需的部分解码以提供多个对象代码块17a、17b、17c(通常均包含对象代码的一个基本块),并且还可提供关于每一对象块以及其中包含的对象指令的解码器信息171,该信息将帮助翻译器19随后的操作。在一些实施例中,翻译器19的核心192中的IR单元从解码的对象指令生成中间表示(IR),根据中间表示恰当地执行优化。作为翻译器19的后端部分的编码器193产生(培育)可由目标处理器13执行的目标代码21。在该简化示例中,产生三个目标代码块21a-21c,以便与对象代码块17a-17c在对象平台1上的执行等效地在目标平台IO上执行工作。此外,编码器193可以为一些或所有目标代码块21a-21c产生头代码(headercode)和/或脚代码(footercode)211,所述代码211执行诸如设置目标块将操作的环境以及在适当的情况下将控制传递回翻译器19的功能。在一个实施例中,翻译器19保持已经产生了目标代码21a-21c的对象代码块17a-17c的记录。因此,当随后在程序中再次遇到对象代码的相同块时,可以取来先前产生的目标代码并再次使用。然而,本发明的其它实施例可使用其它特定机制来动态地将对象代码与产生的目标代码匹配。在图4中,适宜地,对象代码17是由翻译器19转换以便在目标系统上运行的应用程序。作为一般示例,应用程序17是复杂程序,如web服务器、数字内容服务器(例如流式音频或流式视频服务器)、文字处理器、电子表格编辑器、图形图像编辑工具或者数据库应用程序等。然而,在其它示例中,对象代码17是使计算系统能够执行有用的工作并控制电子装置的操作的任何种类的程序。除了诸如与操作系统20和翻译器19关联的其它任务之外,目标计算平台10经常还需要同时运行许多这样的程序。在示例实施例中,对象代码17采取专门针对对象架构创建(例如,编译)的可执行二进制形式。不存在对对象代码17的人为千预或者检查的机会。相反,通过翻译器19,目标计算平台10自动将对象代码17转换为在目标计算平台10上执行的二进制的目标代码21。因此,在示例性实施例中,翻译器19是二进制翻译器,其将可通过对象ISA执行的二进制的对象代码17转换为可通过目标ISA执行的二进制的目标代码。此外,翻译器19是动态二进制翻译器,其将翻译与目标代码21的块的执行交织。图5示出由本发明的实施例采用的在目标计算平台10中对具有寄存器窗口架构的对象处理器3的关键组件进行仿真的机制。如上所述,对对象处理器的这些组件进行仿真使翻译器19能够产生目标代码21,该目标代码21忠实地模仿了对象代码17的预期行为。在下面的示例实施例中,与对象处理器相比,目标处理器13的架构不提供寄存器窗口,或者使用不同形式的寄存器窗口。因此,对象代码17不能在目标处理器13上运行。作为实际的例子,翻译器19被安排用来将意图在具有至少64个(更具代表性的是几百个)64位通用硬件寄存器的第9版本的SPARC处理器上执行的对象代码翻译成在仅具有16个通用硬件寄存器的64位x86类型的处理器上的目标代码。如本示例所示出的,在每种处理器中可用寄存器的数量和类型以及寄存器的构造方式方面,对象处理器3和目标处理器13有时从根本上不兼容。尽管对象处理器3的一般结构和操作是本领域技术人员所熟悉的,但是这里为了示出并讨论由目标系统仿真的对象处理器的这些组件,提供简要回顾。在这里所讨论的示例实施例中,对象处理器3采用根据示例第9版本的SPARC架构的寄存器窗口排列,上面已参照图1和图2对其进行了大致地讨论。在这种情况下,寄存器窗口位置重叠并且具有旋转式配置。然而,应该理解的是,本发明的实施例还可以针对具有其它特定配置,如非重叠和/或非旋转配置的寄存器窗口架构实现。这种寄存器窗口架构的一些相关技术描述提及多个寄存器窗口,这些寄存器窗口中仅有一个窗口是当前窗口(即,存在许多窗口,每一窗口均具有固定的位置,并且这些窗口中每次只有一个窗口是打开的)。为了一致起见,下面的描述考虑移动到不同的寄存器窗口位置的单个当前窗口,但是本领域技术人员应该很容易地理解,本发明可以等同地应用于按照多个固定的窗口定义的架构。图5示出对象处理器3中设置的大量通用硬件寄存器5。为了清晰和解释容易起见,控制/状态寄存器和对象处理器3的许多其它部件没有被示出。这些对象寄存器5包括一小组全局可见寄存器501("全局对象寄存器"),这些寄存器是静态的并且对于对象代码17的所有部分均是可见的;大的寄存器文件502("窗口化的对象寄存器"),这些寄存器被窗口化从而对于对象代码17的当前执行的部分,仅该寄存器文件的一个子集是可见的,并作为移动到多个寄存器窗口位置511中的一个位置处的当前"寄存器窗口"510。因此,任何时候,在窗口化的对象寄存器502中仅落在寄存器窗口510的当前位置之下的子集可被正在执行的代码访问。尽管在对象硬件中设置了大量寄存器,但是任何时候,对象代码17仅能够对32个可见的通用寄存器,即8个全局对象寄存器501(g0-g7)以及窗口化的对象寄存器502中的24寄存器窗口510(i0-i7,10-17,。0-o7)进行寻址。因此,对象代码是引用这样一组可见的32个寄存器名称撰写的。现在考虑目标计算平台10,通过例如将对象代码17加载到目标系统的存储器18的可用区域来提供对象代码17,并且逐块地将对象代码17转换为目标代码21并执行。如上所述,当翻译器19首先遇到对象代码块时,解码器单元191将对象指令解码。该解码处理包括识别对象代码指令内的对对象架构的通用对象寄存器的引用,特别包括对窗口化的对象寄存器502和全局对象寄存器501的引用。其次,识别这样的对象代码指令,该对象代码指令引起当前寄存器窗口向新位置的SAVE和RESTORE类型的移动。这里,用于示例第9版本的SPARC硬件的指令集架构包括至少"save"和"restore"指令,这些指令在对象平台上将引起当前寄存器窗口510移动到另一位置511。由解码器191获得的寄存器引用和寄存器窗口移动信息被传递给核心192并且在编码器193中被使用以产生目标代码21。在初始阶段,翻译器19提供将在稍后用于仿真对象处理器的各种存储器结构。具体地讲,翻译器19提供如上所述的抽象寄存器组27,即用于存储对象处理器3的寄存器(包括全局对象寄存器501和窗口化的对象寄存器502)中应保存的数据的数据结构。这里,在目标存储器18中定义存储区域420,该存储区域420具有一组8个静态位置421以形成抽象寄存器组27的与8个全局对象寄存器501关联的静态部分。在解码器单元191所解码的对象代码指令中识别出对全局对象寄存器501的引用之处,用对存储区域420中的这些静态位置421的适当引用来产生等效的目标代码指令。即,目标代码21通常这样使用表示这些全局对象寄存器501的内容的数据值将数据从静态位置421加载到目标处理器13的工作寄存器15中,然后在目标代码的执行期间将结果适当地存回到这些存储位置421。这样,目标代码21模拟对象代码17的依赖于全局对象寄存器501的那些指令的行为。窗口化的对象寄存器502在如上所述的动态窗口化的配置下运转,因此现在在目标平台中设置单独的机制来对这些对象寄存器进行仿真。如图5所示,为了实现寄存器窗口机制,翻译器19在目标平台10的存储器18内设置堆栈数据结构,下面将其称为"SR堆栈"400。如本领域技术人员所熟悉的,堆栈是在最常用的计算架构中有效地创建和管理的LIFO(后入先出)类型的存储结构。通常,堆栈在存储器中按照给定的基础地址(起始地址)定位,并且随着数据被添加到堆栈或者从堆栈被去除,堆栈在存储器中向下(或向上)生长。通过参考堆栈指针来确定堆栈的顶部(头)的当前位置,堆栈指针被定期更新以计算当数据被推到堆栈上时消耗的存储位置以及相反地当从堆栈弹出数据时释放的存储位置。通常,通过相对于堆栈指针对存储器寻址来操纵堆栈上的数据。在下面的示例中,SR堆栈400在目标存储器18中从给定的基础地址SR—BASE开始向下(即,利用递减存储地址)生长,并且堆栈指针SR-SP用于确定SR堆栈的当前头。SR堆栈400用于存储数据值,每一数据值表示对象代码17所引用的窗口化的对象寄存器502之一的内容。即,对象代码17的解码揭示出在执行期间对象代码17所访问的窗口化的对象寄存器502,并且对象代码所使用的数据值现在被存储为SR堆栈400中的条目401。产生目标代码21,以便将这些数据值存储在目标存储器18中的SR堆栈400上,当目标代码21需要时将数据值加载到目标处理器13的工作寄存器15中,并在目标代码的执行期间适当地将结果存回到SR堆栈400。因此,SR堆栈400形成抽象寄存器组27的对窗口化的对象寄存器502进行仿真的部分,并且使目标代码21能够模拟依赖于对象寄存器502的对象代码指令的执行。在图5所示的示例实施例中,SR堆栈40(^皮划分为多个帧410,其中每个帧410包含一组数据条目401。在本示例中,一组可寻址的24个窗口化的对象寄存器502被对象代码17称为"iO"-"i7"、"10"-"17"、"oO"-"o7"(或者等同地,称为r[8]至r[31])。因此,从对象代码17的角度来看,对象代码中的寄存器定义和寄存器引用(这里统称为"寄存器引用")按照这样的可寻址的一组寄存器名称被表达。在这里所讨论的仿真机制中,对象代码17所需的对象寄存器502中的那些数据值被存储在SR堆栈400的具有24个条目401的一帧410中。其次,在对象处理器3中对象代码17会引起当前寄存器窗口510移动到新的位置511之处,在当前仿真机制中,在SR堆栈400上设置具有条目401的新帧410。由于窗口化的对象寄存器502的重叠特性,当前示例实施例在SR堆栈400上为每一新巾贞410设置16个新的条目401,同时8个旧的条目(与先前帧410的"oO""o8"对应)现在给予用于当前帧的"i0"-"i8"寄存器引用的数据值。图6是这里所讨论的寄存器窗口仿真机制的更详细的示意图,以示出用于SR堆栈寻址的示例机制。在下面的讨论中,提供示例伪代码指令作为对象代码段17a、17b和目标代码段21a、21b,并且这里为了清晰起见,将所述指令示为简化的汇编器类型的伪代码。对象代码示例通常基于SPARC第9版本ISA(即,源,芬的她),但是为了清晰起见,诸如延迟时隙和特定指令自变量的细节将省略。类似地,目标代码示例被示为通常基于利用Intel语法的Linux汇编语言(即,凍#《的她,源)的汇编器类型的伪代码。当然,本发明的涉及动态二进制翻译器的示例实施例将接收作为二进制机器代码的对象代码17,并产生作为二进制机器代码的目标代码,但是为了解释方便起见,提供汇编器类型的伪代码。下面还将参照图7和图8更详细地讨论图6中示出的示例伪代码。如图6所示,翻译器19的解码器单元191对第一对象代码块17a和第二对象代码块17b中的指令进行解码。为了简便,第一示例实施例根据"save"和"restore"对象指令的位置将对象代码划分为第一块和第二块。在实际的实施例中,对象代码的每一块17a、17b将通常包含大约IO条指令,但是有时将包含多达约一百条指令。解码器191识别对窗口化的对象寄存器502的对象代码引用175,并得到窗口移动信息176。在该示例伪代码中,第一对象块17a包括两个"mov"指令和一个"add"指令,这些指令包含对窗口化的对象寄存器"17"、"13"和"o6"(即,1ocal寄存器3、1ocal寄存器7和out寄存器6)的引用175。关于寄存器窗口移动信息176,"save"指令这里被识别为引起SAVE类型移动的指令。类似地,第二代码段17b被解码以识别对"13"(1ocal寄存器3)的另一引用175以及导致RESTORE类型的寄存器窗口移动的"restore"176。该示例伪代码中的"return"返回到图中没有示出的对象代码的一些其它调用者部分。在这种情况下由翻译器19产生的目标代码21由目标代码块21a和21b示出。这里,翻译器19至少部分地基于识别出的对象寄存器引用,来产生目标代码指令以对SR堆栈400上的相关条目401进行寻址。在第一实施例中,通过考虑识别出的窗口化的对象寄存器引用175,相对于堆栈指针SR-SP来对相关SR堆栈条目401寻址。方便地,响应于在每一对象块的末尾发现的识别出的寄存器窗口移动信息176,在每一目标块的末尾更新堆栈指针SR—SP。即,响应于通过解码器191获得的SAVE和RESTORE寄存器窗口移动信息176,产生目标代码12以更新SR堆栈指针SR—SP,以便跟踪SR堆栈的头的当前位置。这里,产生的目标代码包含目标指令,这些目标指令使SR堆栈指针SR—SP更新,从而对于识别出的每一SAVE类型移动,指针SR一SP在SR堆栈400中向前移动16个64位条目401,或者对于识别出的每一RESTORE类型移动,指针SR—SP向后滚动16个条目。这里,由于每一帧410内的表示"i"(in寄存器)和"o"(out寄存器)的条目的重叠,堆栈指针更新16个条目,而非全部帧的24个条目。如图6的示例所示出的,对于与第一帧410a相关的第一目标代码块21a,SR—SP被设为第一值"SR—SP1",并且SR—SP被更新为第二值"SR—SP2"以使得第二目标代码块21b改为引用第二帧410b中的条目401。还如图6中所示,在该第一实施例中,在位于堆栈指针SR一SP的当前值所引用的SR堆栈400的头部的具有24个条目401的当前帧410中找到所需的SR堆栈条目401。这里,每一寄存器引用175确定与堆栈指针SR—SP的当前值有关的预定位移。作为简化示例,通过使"o0"的条目具有位移0(即,堆栈指针SR一SP引用作为堆栈上的第一条目的"oO,,),"ol"和"o2"的条目分别具有+1和+2的64位字的位移,直至"i7"的条目具有+23的64位字的位移。这里,目标代码21通过将堆栈指针的当前值与所需位移相组合来计算堆栈上的所需条目的地址。方便地,在将上下文传递给目标代码时,选择一个目标寄存器13来保存堆栈指针SR—SP,并且将堆栈指针的当前值加载到该目标寄存器13中。在示例64位x86目标架构中,方便地,堆栈指针被加载到一个临时寄存器,如rbp中。即,作为一种选择,在调用示出的第一目标代码段21a之前,在翻译器19的运行环路中将堆栈指针SR一SP加载到目标寄存器rbp中。可选地,rbp作为头代码211(见图4)的一部分被方便地加载。因此,在目标代码段21a和21b中可使用寄存器rbp中的堆栈指针SR一SP。执行这一操作的示例指令示出如下,其中"fs:SR—SP"是对上下文切换期间存储的堆栈指针的存储位置(是由翻译器19保存的对象状态的一部分)的引用movrbp,(fs:SR一SP),下面的例子示出SR堆栈上的位移的计算,其中,在对象代码中,一个全局对象寄存器"gl"被加载到窗口化的局部对象寄存器"15"(local寄存器5)中。这里,"15"条目位于"+13"的位移处,即13个64位字(在一些按照8位字节寻址的架构中,方便地表达为13x8=1048位字节)的位移处。在目标代码中,我们可以假设"gl"的值已经从存储区域420中加载到可用目标寄存器rax中对象代码目标代码movgl,15mov(rbp+13),rax响应于识别出的SAVE移动176,rbx中现在保存的当前堆栈指针值SR一SP在SR堆栈400上前进了16个64位字。这会将16个新的条目401添加到SR堆栈,或者会将当前帧410向前移动到先前占据过的位置,从而现在将暴露这些存储位置中存储的数据值。其次,有益的是,此时还更新fs:SR一SP处的存储器中保存的SR—SP的版本,尽管这也可以单独进行。响应于每一SAVE类型移动信息175,通过例如下面的目标指令,堆栈指针SR一SP在存储器中向下前进addrbp,-16mov(fs:SR—SP),rbp相反,响应于每一RESTORE类型移动信息176,通过例如下面的目标指令,堆栈指针SR—SP在存储器中向上后退特定位移,从而引用SR堆栈400上的先前遇到过的具有条目401的帧410:addrbp,+16mov(fs:SR_SP),rbp图7是更详细地示出图6中的上述示例实施例的表。即,图7示出如上所述的对象代码块17a、17b。此外,图7示出通过将对象代码指令解码而识别出的对象寄存器引用175,并且示出识别出的每一引用175的相关位移177。此外,如图7所示,对象代码17的解码获得识别出的寄存器窗口移动信息176。最后,图7示出参照寄存器引用175和寄存器窗口移动信息176从对象代码指令产生的目标代码块21a、21b。如图7所示,第一目标代码块21a以头代码211开始,在本示例中,该头代码211包括将堆栈指针SR—SP加载到临时目标寄存器rbp中的指令(未示出)。此时,我们可以假设rbp保存值"SR—SP1",并因此引用图6的帧410a。接下来,将常数"10"和"3"加载到目标寄存器rax和rbx,然后,这些值也被存储到SR堆栈400上的关于从寄存器引用175获得的位移177的引用"13"中对象代码所预期的数据值。然后,使用这些目标寄存器rax和rbx执行与示例"add"对象指令等效的工作,并且结果被存储到与"06"引用相关的条目401。本实施例中的"save"对象指令终止第一对象块17a。此外,响应于从"save"获得的寄存器窗口移动信息176,产生目标代码21a以将rbp中保存的堆栈指针SR—SP修改为在SR堆栈400上前进16个条目,以使得SR—SP现在具有值"SR—SP2"并引用图6中的帧410b。该第一目标代码21a中的脚代码211现在确定下一动作,例如将控制传递回翻"^奪器19以选才奪下一对象代码块使其作为翻译的目标代码执行,或者将控制直接传递给已经产生的下一目标代码块。在本示例中,脚代码211将执行控制直接传递给第二目标代码块21b,而不需返回到翻译器19。适宜地,第二目标代码块21b中的头代码211准备用于该块的上下文。在大多数情况下,这包括将SR—SP从fs:SR—SP处的存储器加栽到rbp,尽管在本示例中,目标代码优化将允许仅从块21a向前传送rbp中已经存在的值。然后,目标代码执行来自对象块17b的对象"add"指令的工作。需要注意的是,由于rbp中SR—SP的更新的值,对"13"(1ocal寄存器3)的寄存器引用并不决定与第一对象代码块17a中相同的SR堆栈400中的条目401。也就是说,在对象块17a中,对"B"的引用决定帧410a中的条目,而现在在对象块17b中,对"13"的引用改为决定帧410b中的条目。这样,SR堆栈400对对象处理器中的寄存器窗口的预期行为进行仿真。最后,响应于来自对象块17b中的最后"restore"的寄存器窗口移动信息176,产生目标代码21b以更新rbp中的SR_SP的值,从而使堆栈指针后退16个条目,由此,堆栈指针现在再次引用图6的帧410a。此外,对象"restore"指令起到选择该第二对象块17b的终止点的作用。在大多数情况下,"restore"会使翻译器终止对象块17b。然而,在本示例中,实际上在紧随"restore"之后的"return"处终止对象块。此时,最好将更新的堆栈指针SR—SP从rbp保存回fs:SR_SP,并且脚代码211现在确定下一动作,例如在这种情况下,将执行控制返回给翻译器19,从而翻译器可将控制返回给调用作为"funcl"的第一对象块17a的对象代码(未示出),以继续对象程序的执行。图8是与上述图6和图7的示例类似的另一个表,示出了对SR堆栈400寻址的第二示例机制。翻译器19的解码器单元191如上所述识别窗口化的对象寄存器引用175和寄存器窗口移动信息176。此外,识别出的寄存器窗口移动176用于获得帧偏移178,该帧偏移178在对象代码21中被表达为相对于SR—SP堆栈指针的帧偏移。然后,每一寄存器引用175提供相对于该帧偏移的位移,以在SR堆栈400中对相关条目进行寻址。因此,贯穿目标代码块21a,即使在该块期间考虑条目401的两个或多个帧410,堆栈指针SR—SP仍始终保持恒定。特别地,图8示出的第二实施例允许翻译器使目标代码的单个块内的叶函数(leaffunction)内联,其中,叶函数是其自身不调用另一函数的函数。通过将调用者对象代码指令和被调用者对象代码指令视为单个块对象代码17a并从该单个块对象代码17a创建相应的单个目标代码块21a,来使该函数内联。在图8的简化示例中,不存在叶函数,但是下面讨论的操作可等同地应用于该目的。在另一个示例实施例中,当解码器191检测到对象代码17的一个部分所包含的SAVE或RESTORE超过预定数量时,块的解码此时被停止(被打断),并且在使帧偏移返回到默认值("fD")的情况下创建新的块。即,当对象代码段所包含的SAVE或RESTORE超过允许的数量时,通过创建另外的对象代码块来将该对象代码段细分为两个或多个更小的段。这一限制便于在否则相对冗长的块中进行中断。如图8A所示,识别出的寄存器窗口移动176在SAVE和RESTORE方向上向上或向下调节相对于假设的起始位置的帧偏移178。方便地,在每一解码的块的开始处将帧偏移178设为"0",并且对于每一连续的SAVE移动,将帧偏移178—个计数一个计数地调节为"-l"、"-2"等。相反,对于识别出的每一RESTORE类型移动,帧偏移一个计数一个计数地增加。因此,帧偏移基于在块期间遇到的识别出的寄存器窗口移动信息176提供相对于默认起始位置的当前累积偏移。例如,对于默认"0",SAVE将帧偏移178调节为"-l"。然后,第二个SAVE将偏移调节为"-2"。然而,RESTORE现在将偏移调节回"-l,,,第二个RESTORE将偏移调节回"0",又一个RESTORE现在将偏移节为"+r,等等。图8中的表显示了识别出的寄存器引用175和识别出的寄存器窗口移动176。此外,该表还示出位移177以及从位移177获得的帧偏移178。另外,该表还示出示例目标代码21,该目标代码21将帧偏移178和位移177组合在一起,来对SR堆栈400上位于各个不同的帧410中的各个条目401进行寻址。即,核心192和编码器单元193在产生和培育目标代码时使用当前偏移178和位移177。编码器193因此可以培育目标代码21,该目标代码通过允许"基础加偏移"类型的寻址来简化SR堆栈中的寻址。如图8A所示,目标代码块21a以头代码211开始,如在先前的示例中一样,适宜的是,该头代码211将堆栈指针SR—SP加载到目标寄存器rbp中。在本示例中,假设rbp中的值引用图6的帧410a。接下来,如上所述,目标代码执行与示例"mov"和"add"对象指令等效的工作。响应于从"save"获得的寄存器窗口移动信息176,帧偏移178—个计数一个计数地减小,并且产生目标代码以将rbp中保存的堆栈指针SR一SP临时修改为在SR堆栈400上前进16个条目,从而SR—SP现在引用图6中的后续帧410b。需要注意的是,"save"对象指令这里不终止对象块。也就是说,不需要头代码和脚代码的开销。图8中的目标代码现在利用rax立即执行第二对象"add"指令的工作。响应于从"restore"获得的寄存器窗口移动信息176,产生目标代码以根据新的偏移178来更新rbp中的SR—SP的值,以使堆栈指针后退16个条目,由此,堆栈指针现在再次引用图6的帧410a。此外,最后的对象"restore"指令起到选择该对象块17a的终止点的作用。因此,脚211现在将更新的堆栈指针SR—SP从rbp保存回fs:SR_SP。如上面的图7—样,对象块17a末尾的"return"可将执行控制返回给翻译器,然后翻译器可返回给调用作为"func1"的对象块17a的对象代码(未示出)。图8B示出SR寻址机制中的进一步的优化。这里,在产生目标代码之前,将偏移178与位移177相组合,从而避免临时调节rbp中的SR一SP的值的工作。即,图8A的末尾处的三个目标指令"add"、"mov"和"add"如图8B所示被方便地组合为单个"add"指令。在这种情况下,偏移178和位移177被组合为-16+1=-5,从而给出相对于原始rbp值的组合的调节-5。这里,寄存器引用175和关联的位移177以及寄存器窗口移动信息176和关联的帧偏移178的识别使得有效的、优化的目标代码被培育,该目标代码执行对象代码的工作并且对与对象代码的操作相关的对象处理器的关键组件进行仿真。图8中的上述寻址机制允许翻译器19提供单个目标代码块,该目标代码块包括在单个目标代码块内对对象代码的多个"save"和/或"restore"指令的效果进行仿真的目标指令。应该理解的是,该机制还允许翻译器19将对象函数,特别是叶函数内联到目标代码中。即,用于执行进程调用的对象"call"和"return"指令包括寄存器窗口510的相同SAVE和RESTORE类型移动,并且现在可以在不需要目标代码中的函数调用的情况下实现。图9是执行这里所讨论的寄存器窗口仿真机制的方法的示意性流程图。在步骤901,选择并解码对象代码17的一个块。在步骤902,识别该对象代码17的块中对对象处理器3的对象寄存器5的引用175。更具体地讲,引用175引用窗口化的对象寄存器文件502。此外,在步骤卯3,识别对象代码17中引起寄存器窗口510的移动的指令176。在步骤904,如上所述参考堆栈指针SR_SP在目标计算平台10上设置SR堆栈400。在步骤卯5,参考SR堆栈400和堆栈指针SR一SP产生目标代码21。即,利用将数据值存储为SR堆栈400上的条目401并对其进行检索的目标代码指令来产生对象代码21的每一块。这里,在步骤卯6,从识别出的寄存器窗口移动信息176获得的目标代码通过将堆栈指针SR—SP直接更新为引用堆栈的新的头或者通过调节临时帧偏移178,来调节堆栈指针SR—SP。在步骤907,SR—SP的关联位移,访问SR堆栈的帧410内的期望的条目401。有利地,SR堆栈机制400不限制其同时可存储的帧401的数量。再参照图5,需要注意的是,对象处理器3的该示例硬件实现仅提供8个寄存器窗口位置511,并且根据定义,SPARC硬件仅能提供最多32个寄存器窗口位置。一旦每一寄存器窗口位置511包含有效数据,则另外任何的SAVE会强迫溢出操作来清空窗口化的寄存器文件502,以便释放新的临时工作空间。相比之下,当前仿真的寄存器窗口机制避免了与对象架构的自动溢出和载入操作的检测和执行相关联的可观开销。也就是说,当前的寄存器窗口机制不受这样的有限硬件限制的局限,相反,SR堆栈400按照需要扩展以便包含用于每一SAVE的必需的另外的条目401。如果对象计算架构包括最多有限数量n个寄存器窗口位置,则随着执行进展,SR堆栈可具有m个帧410,其中m和n均是正整数,且m大于n。SR堆栈400相对大,并且不具有预定的有限大小。在大多数目标计算平台中,存储器18足够大,因此对于翻译器19而言,SR堆栈400看起来像无限资源。从根本上讲,SR堆栈400的大小有限,但是在实际中,堆栈的理论最大大小远超过任何理想实现所需的大小(例如,每16个64位条目1Kb),从而SR堆栈可以被当作无限资源(即,SR堆栈400可以容易地存储几百个帧410)。图IO是示出目标计算架构的存储器中的多个堆栈数据结构的示意图,用于解释本发明的另一方面。图IO示出如上所述的SR堆栈400,在这种情况下,SR堆栈400在图中垂直向下生长。此外,在目标计算架构IO的存储器中定义了许多其它堆栈,这是本领域技术人员所熟悉的。示出的堆栈包括对象堆栈450、目标堆栈460和翻译器堆栈470等。这里,对象堆栈450对对象架构中为对象代码的执行而设置的执行堆栈(也称为控制堆栈或函数堆栈)进行仿真。也就是说,从对象代码到目标代码的程序代码转换的一部分处理包括在目标架构上创建和操作对象堆栈450。目标堆栈460是为目标代码21的执行设置的堆栈。翻译器堆栈470是为翻译器19的执行设置的堆栈。这些堆栈以及其它堆栈均同时存在于目标架构的存储器中,并且通常由目标操作系统20结合翻译器代码19和目标代码21等来管理。对象堆栈450特别受关注,因为在对象架构l中,寄存器溢出操作将寄存器值从窗口化的硬件对象寄存器502传递到对象系统的存储器8中设置的对象堆栈上。相反,对象架构中的载入操作将寄存器值从对象堆栈传递到窗口化的硬件对象寄存器502。在示例第9版本的SPARC架构中,每一SAVE类型的寄存器移动导致在执行堆栈中预留空间,当溢出操作被执行时,该空间将被来自各个寄存器窗口位置511中的寄存器502的寄存器值填充。即,如图10所示,对象代码17(现在被翻译为目标代码21)可合理地假设,在某些情况下,所需数据值将出现在仿真版本的对象堆栈450中分配的空间中。然而,除非这样的数据值实际上是从SR堆栈400复制到仿真的对象堆栈450中的,否则数据值将不会如预期地出现。图IO示出SR堆栈400上的示例的一组具有条目的帧。这里,帧410被标记为F0至F8。帧如图5所示互相重叠,但是在图IO中为了清晰起见,没有示出为重叠。此外,为了清晰起见,在图IO不再示出各个条目401。为了仿真对象平台的行为,当每一新帧410F0-F8被添加到SR堆栈400中时,在仿真的执行堆栈450上预留空间。此外,仿真的对象堆栈450点缀有其它数据,如临时值以及函数的调用和返回参数,这是对执行对象代码17在对象堆栈上的效果进行仿真所需的。存在具体影响数据从对象寄存器到对象堆栈的传递的某些对象代码指令。在这里所讨"i仑的第9版本的SPARC示例中,"flushw"指令通过重复地执行溢出陷阱,将除了当前窗口位置之外的所有寄存器502从窗口化的硬件对象寄存器502刷入对象执行堆栈。通过在任何寄存器窗口位置(除了当前寄存器窗口位置之外)具有有效内容时引起溢出陷阱来实现"flushw"指令。在对象架构上,.参考CANSAVE控制/状态寄存器来计算具有有效数据的窗口位置的数量。此外,编程语言C可包括专门针对对象计算平台编译的本地代码库。C编程语言包括诸如"setjmp"和"longjmp"的指令,这些指令尽管现在被广泛认为是陈旧的,并且实现起来极其困难,但是这些指令可出现在许多现实世界的对象程序中,特别是遗留程序中。在C编程语言中"setjmp1p"lon&jmp"指令通常用于非本地出口或者软件异常处理。setjmp函数通过保存关于在对象代码中出现对setjmp函数的调用时的执行环境的信息来识别返回点。对象程序的执行通常在对setjmp的调用之后继续,直到在随后的一些点,对longjmp的调用导致脱离该返回点,从而#丸行控制#皮传递回setjmp纟皮调用时的点。setjmp例程通常包括将寄存器值从对象寄存器复制到对象堆栈,longjmp函数通常将这些值从堆栈恢复到对象寄存器中。作为另一个示例,编程语言C可包括具有创建、保存和恢复上下文的函数的处理器家族专用实现,用于信号处理或者用户多线程。一些C库在名称"getcontext,,、"secontex"和"makecontext"下提供这样的例程。像本地C库的一部分一样提供上下文函数,但是其具有用于特定硬件,如ARM、PowerPC,SPARC和x86的特定实现。作为另一个示例,更高级的编程绪言〔++提供专用于处理软件异常的指令。与更典型的"if,类型的指令相比,尽管这些€++异常处理指令主要意在处理对象程序的执行期间遇到的异常情形,但是这些〔++异常处理指令本身也是方便的编程结构,并且经常用于简化程序的算法。具体地讲,C+十异常指令包括"try"、"catch"和"throw"指令。在可由对象处理器执行的二进制对象代码中实现这些指令因此包括数据在对象寄存器和对象堆栈之间的传递。还有许多其它需要这样的数据传递的情形,包括例如堆栈回退,其中对象程序沿执行堆栈往回运行,因此需要在执行堆栈上呈现有效的对象寄存器值。图11是示出在用于仿真窗口化的对象寄存器502的SR堆栈400和用于仿真对象平台的执行堆栈的对象堆栈450之间传递数据值(反之亦然)的机制的示意性流程图。在步骤1101,对象代码17被解码以便识别如上所述的SAVE和RESTORE类型寄存器窗口移动176等。在步骤1102,针对识别出的每一寄存器窗口移动176更新CR计数器。适当地,每一SAVE使CR计数器加1,每一RESTORE从CR计数器减1。因此,当对象程序进行时,CR计数器计算SR堆栈400上具有条目401的帧410的数量。此外,在步骤1103,识别这样的对象指令在对象架构中,这些对象指令需要窗口化的对象寄存器502中保存的数据值被保存到对象执行堆栈中,这些对象指令在这里被称为SPILL类型指令。作为SPARC对象架构的特定示例,"flushw"对象指令被识别。在步骤1104,如图10中所示,提供目标代码21来将确定数量的具有条目401的帧410从SR堆栈400刷入仿真的对象堆栈450上分配的相应的空间。在图10示出的示例中,SR堆栈400包含^f皮标记为F0至F8的9个帧的条目。这里,CR计数器显示8个较早的帧F0至F7(即,不包括当前条目帧F8)需要被从SR堆栈400复制到对象堆栈(CR=8)。在步骤1105,在这样重复的溢出操作之后,CR计数器更新为零,以显示所有需要的帧410均已被从SR堆栈400复制到对象堆栈450。如上所述,在对象架构中,"flushw"指令使除了当前位置之外的所有寄存器窗口位置511无效,从而对象执行堆栈现在为所有先前的寄存器窗口位置保存对象寄存器值的标准版本。一些对象程序,如C上下文函数、setjmp/longjump函数和0++异常将改变存储在对象堆栈中的数据值。因此,在图IO所示的仿真环境下,重要的是,引用仿真的对象执行堆栈450中现在保存的数据而非SR堆栈400上的条目401中的(现在可能是无效的)数据。因此,在步骤1106,现在产生目标代码以适当地访问仿真的对象堆栈450上的期望数据值。步骤1107包括识别这样的对象代码指令,在对象架构中这些对象代码指令导致寄存器值被从对象执行堆栈加载到窗口化的寄存器文件502中,这些对象代码指令在这里将被称为FILL类型指令。在示例SPARC对象架构中,适宜地,这是"restore"指令。在这里所提供的仿真的机制中,在步骤1108测试CR计数器。如果CR计数器非零(CR>0),从而指示SR堆栈400中存在一个或多个有效帧410,则在步骤1105,响应于RESTORE指令,CR被更新(在这种情况下递减,CR=CR-1),并且没有从对象堆栈450复制数据。这里,如上所述,对象"restore"导致堆栈指针SR_SP的调节,以便在SR堆栈400上选择不同的帧410。然而,当CR计数器为零(CR=0),从而指示在SR堆栈上不存在较早的有效的帧时,在步骤1109,执行载入操作以将数据值的帧从对象堆栈450复制回SR堆栈400,以便用作RESTORE之后的新的当前帧410。来自对象堆栈450的数据值的帧可被对象程序修改,因此现在这些数据值的标准版本在SR堆栈400的条目401中再次可用,以便于对象程序中的后续使用。具体地讲,常规的SPARC架构将用于对象堆栈的堆栈指针存储在对象寄存器o6(其别名为sp)中。由于寄存器窗口位置511的重叠,用于调用者进程的堆栈指针在对象寄存器i6中也是可用的。先前的堆栈指针被称为帧指针(并且可以利用別名fp对其访问)。对存储的寄存器值的修改通常包括改变用于帧指针(i6/fp)和/或堆栈指针(o6/sp)的寄存器值。因此,重要的是,通过这里所讨论的仿真机制来正确地维持这些数据值。图12A更详细地示出示例溢出操作。首先针对标记为F0和F1的帧执行操作"flushw",因此该"flushw"操作将CR计数器重设为零。因此,存在另外(至少)17个SAVE寄存器移动以便在SR堆栈400上形成帧F2至F19,如CR计数器所指示的(CR=17)。在对象代码中识别SPILL指令(即,"flushw"),该SPILL指令导致寄存器值的17个帧F19至F2被从SR堆栈400复制到对象堆栈,并使CR计数器归零。所有帧F2至F18现在是无效的,在SR堆栈上仅当前活动的帧F19保持有效。图12B更详细地示出从图12A中所示的情形开始继续的示例载入操作。这里,从当前活动的帧F19的RESTORE(其中,CR=0)导致从对象堆栈450加载寄存器值的帧以形成新的当前帧(这里为F18),替换SR堆栈上该帧中先前的(无效)数据。利用加载到新的当前帧F18中的寄存器值来继续执行。立即更新或者在对象代码块的末尾更新用于SR堆栈SP一SRS的堆栈指针,以解释该寄存器窗口移动。该传递机制的其它特定实施例也被构思。具体地讲,在溢出操作"flushw"之后,SR堆栈上的任何合适的点可用作新的当前帧,因为"flushw"使除了当前窗口之外的所有寄存器窗口无效。例如,SR堆栈可被清空,并且在每一"flushw"之后完全收回的堆栈空间或者SR堆栈上的默认位置(如沿着为堆栈分配的空间的一半)可被设置为新的当前帧。可以利用专用的硬件单独地构造本发明的至少一些实施例,这里所使用的诸如"模块"或"单元"的术语可包括(但不限于)执行特定任务的硬件装置,如现场可编程门阵列(FPGA)或专用集成电路(ASIC)。可选地,本发明的元件可构造为驻留于可寻址的存储介质上,并被构造为在一个或多个处理器上执行。因此,在一些实施例中,本发明的功能元件可包括例如诸如软件组件、面向对象的软件组件、类组件和任务组件的组件、进程、函数、属性、过程、子进程、程序代码段、驱动程序、固件、微码、电路、数据、数据库、数据结构、表、数组和变量。此外,尽管已参照这里所讨论的组件、模块和单元描述了优选实施例,但是这些功能元件可被组合为更少的元件或者被分离为另外的元件。尽管已经显示和描述了一些示例实施例,但是本领域技术人员应该理解,在不脱离权利要求中限定的本发明的范围的情况下,可以进行各种改变和修改。需要注意与本说明书同时提交或者在本说明书之前提交的与本申请相关的用于公众对本说明书的检查公开的所有文件和文档,所有这些文件和文档的内容通过引用包含于此。本说明书(包括权利要求、摘要和附图)中公开的所有特征以及所公开的任何方法或处理的所有步骤可以按照任何组合方式进行组合,除了其中至少一些这样的特征和/或步骤互相排斥的组合。本说明书(包括权利要求、摘要和附图)中公开的每一特征可以通过针对相同、等同或相似的目的的可选特征来替换,除非另外明确地声明。因此,除非另外明确地声明,所公开的每一特征仅是一类等同或相似特征的一个示例。本发明不限于前述实施例的细节。本发明延伸至本说明书(包括权利要合,或者延伸至所公开的任何方法或处理的步骤中的任何新颖的步骤或任何新颖的步骤组合。权利要求1、一种计算系统,该计算系统被改编以支持寄存器窗口架构,以便使用可由基于寄存器窗口的对象计算架构的对象处理器执行的对象代码,在该基于寄存器窗口的对象计算架构中,寄存器窗口被定位为使从窗口化的寄存器文件中选择的对象处理器的对象寄存器的子集显露,所述对象代码包括基于窗口的指令和基于寄存器的指令,基于窗口的指令影响寄存器窗口,基于寄存器的指令包含对寄存器窗口中的对象寄存器的引用,该计算系统包括解码器单元,被布置为将对象代码解码,以从基于窗口的指令中获得寄存器窗口移动信息并从基于寄存器的指令中获得一个或多个窗口化的对象寄存器引用;具有堆栈数据结构的存储器,该堆栈数据结构被布置为存储多个条目;编码器单元,被布置为从解码器单元所解码的对象代码产生目标代码;和目标处理器,被布置为执行该目标代码,以设置与存储器中的堆栈数据结构的头有关的堆栈指针,参考寄存器窗口移动信息调节该堆栈指针,参考该堆栈指针与关于各个窗口化的对象寄存器引用确定的位移的组合来访问堆栈数据结构中的条目。2、根据权利要求1所述的计算系统,其中,解码器单元被布置为识别对象代码中导致寄存器窗口的至少SAVE和RESTORE类型移动的一个或多个基于窗口的指令,并从其获得至少SAVE和RESTORE类型寄存器窗口移动信息。3、根据权利要求2所述的计算系统,其中,目标处理器被布置为响应于每一条所述SAVE和RESTORE类型寄存器窗口移动信息调节堆栈指针。4、根据权利要求3所述的计算系统,其中,目标处理器被布置为响应于每一条所述SAVE和RESTORE类型寄存器窗口移动信息,将堆栈指针调节预定的偏移。5、根据权利要求4所述的计算系统,其中,目标处理器被布置为响应于每一条所述SAVE类型寄存器窗口移动信息,使堆栈指针增加预定的偏移,响应于每一条所述RESTORE类型寄存器窗口移动信息,使堆栈指针减小预定的偏移;或者响应于每一条所述SAVE类型寄存器窗口移动信息,使堆栈指针减小预定的偏移,响应于每一条所述RESTORE类型寄存器窗口移动信息,使堆栈指针增加预定的偏移。6、根据权利要求5所述的计算系统,其中,所述预定的偏移与可寻址的一组窗口化的对象寄存器引用的大小对应。7、根据权利要求6所述的计算系统,其中,目标处理器被布置为关于各个窗口化的对象寄存器引用在可寻址的一组窗口化的对象寄存器引用中的位置,为每一窗口化的对象寄存器引用确定所述位移。8、根据权利要求1所述的计算系统,其中,编码器单元被布置为发布至少一个目标代码指令,所述目标代码指令使目标处理器通过结合调节的堆栈指针和确定的位移来访问从堆栈数据结构中选择的条目。9、根据权利要求1所述的计算系统,其中,目标处理器被布置为根据寄存器窗口移动信息来确定帧偏移以便将堆栈指针调节预定数量的条目,并且根据确定的帧偏移和确定的位移来调节堆栈指针以访问从堆栈数据结构中选择的条目。10、根据权利要求1所述的计算系统,其中,解码器单元被布置为根据对象代码中的基于窗口的指令将对象代码划分为多个块,寄存器窗口移动信息是从所述基于窗口的指令获得的。11、根据权利要求1所述的计算系统,其中,所述对象代码包括执行调用被调用者部分的功能的至少一个调用者部分,并且编码器单元被布置为产生将被调用者部分内联入调用者部分中的单个目标代码块。12、根据权利要求11所述的计算系统,其中,编码器单元被布置为产生由目标处理器执行的目标代码指令,以便i)根据在对象代码的调用者部分中识别出的窗口化的对象寄存器引用,参考从窗口化的对象寄存器引用获得的位移以及堆栈指针来访问从堆栈数据结构中选4奪的条目;ii)根据从对象代码的调用者部分获得的寄存器窗口移动信息,增加与堆栈数据结构的预定数量的条目相等的帧偏移;iii.)根据在对象代码的被调用者部分中识别出的窗口化的对象寄存器引用,参考从窗口化的对象寄存器引用获得的位移以及根据帧偏移调节的堆栈指针来访问从堆栈数据结构选择的条目;iv)根据从对象代码的被调用者部分获得的寄存器窗口移动信息减'J、帧偏移。13、根据权利要求1所述的计算系统,其中所述存储器还包括仿真的部分,该仿真的部分被布置为对用于对象代码的执行的执行堆栈进行仿真;解码器单元被布置为将对象代码解码以识别至少SAVE和SAVE类型寄存器窗口移动信息;识别出的寄存器窗口移动更新计数器,所述更新包括针对每一SAVE类型移动使计数器增加并且针对每一RESTORE类型移动使计数器减小,计数器藉此计算帧的数量,每一所述帧包含存储在堆栈数据结构上的预定数量的条目;解码器单元被布置为识别对象代码中的SPILL类型指令,该SPILL类型指令将需要从对象代码中的基于寄存器的指令获得的窗口化的对象寄存器引用中所保存的数据值的溢出;编码器单元被布置为产生由目标处理器执行的目标代码,以便将数据值从堆栈数据结构中的条目复制到存储器中的仿真的执行堆栈上所分配的相应条目,其中,所述条目位于由计数器确定的数量的帧中;编码器单元被布置为产生由目标处理器执行的目标代码,以便将计数器重设为默认值,该默认值指示在堆栈数据结构中不存在有效的条目的帧;编码器单元被布置为产生由目标处理器执行的目标代码,以便对存储器中的仿真的执行堆栈中的条目中所存储的数据值进行寻址。14、根据权利要求13所述的计算系统,其中解码器单元还被布置为识别对象代码中的FILL类型指令,该FILL类型指令需要存储器中的仿真的执行堆栈中的条目中所存储的数据值的载入;编码器单元被布置为产生由目标处理器执行的目标代码,以便相对于默认值测试计数器,并且i)当计数器的测试显示堆栈数据结构中存在一个或多个有效的条目的帧时,根据识别出的FILL指令更新计数器,ii)当计数器的测试显示堆栈数据结构上不存在较早的有效的条目的帧时,将数据值从存储器中的仿真的执行堆栈的条目的帧复制到存储器中的堆栈数据结构,作为堆栈数据结构中的当前的条目的帧。15、根据权利要求1所述的计算系统,其中,解码器单元被布置为将对象代码划分为多个对象代码块,并且编码器单元^f皮布置为将目标代码产生为的执行相交织。16、根据权利要求1所述的计算系统,其中,所述对象代码是二进制可执行代码,所述目标代码是二进制可执行代码。17、一种被改编以支持寄存器窗口架构的计算系统的控制方法,该方法包括以下步骤(a)将可由基于寄存器窗口的对象计算架构的对象处理器执行的对象代码解码,其中,寄存器窗口被定位为使从窗口化的寄存器文件中选择的对象寄存器的子集显露,包括以下步骤(al)从对象代码中的指令识别窗口化的对象寄存器引用,其中所述窗口化的对象寄存器引用包括对寄存器窗口中的所述对象寄存器之一的引用;(a2)从对象代码中的用于引起寄存器窗口的移动的指令获得寄存器窗口移动信息;(b)在计算系统的存储器中设置堆栈数据结构,并设置指示在存储器中该堆栈数据结构的头的堆栈指针,其中该堆栈数据结构被布置为存储多个条目;(c)将对象代码转换为目标代码,并在计算系统的目标处理器上执行该目标代码,从而执行以下步骤(cl)参考识别出的寄存器窗口移动信息调节堆栈指针;(c2)参考堆栈指针与从窗口化的对象寄存器引用确定的位移的组合来访问堆栈凄t据结构中的至少一个条目。18、根据权利要求17所述的方法,其中步骤(a2)包括识别对象代码中导致寄存器窗口的至少SAVE和RESTORE类型移动的一个或多个指令,从而获得至少SAVE和RESTORE类型寄存器窗口移动信息;步骤(cl)包括响应于每一条所述SAVE类型寄存器窗口移动信息,使堆栈指针增加预定的帧偏移,响应于每一条所述RESTORE类型寄存器窗口移动信.息,使堆栈指针减小预定的帧偏移;或者响应于每一条所述SAVE类型寄存器窗口移动信息,使堆栈指针减小预定的帧偏移,响应于每一条所述RESTORE类型寄存器窗口移动信息,使堆栈指针增加预定的帧偏移。19、根据权利要求18所述的方法,其中,堆栈数据结构中的每一条目与对象代码中的基于寄存器的指令中的窗口化的对象寄存器引用集合中的一个对应;,在步骤(cl)中,所述帧偏移在堆栈数据结构上将堆栈指针调节与所述集合的大小对应数量的条目;在步骤(c2)中,所述位移根据窗口化的对象寄存器在所述集合内的相对位置,将堆栈指针在堆栈数据结构上移动一定数量的条目。20、根据权利要求17所述的方法,还包括步骤根据从其获得寄存器窗口移动信息的指令的位置将对象代码划分为多个块,并且针对每一个这样的块,相对于对象代码块中的对象代码指令来执行步骤(a)、(b)和(c)。21、根据权利要求17所述的方法,其中,所述对象代码包括执行调用被调用者部分的功能的至少一个调用者部分,并且步骤(c)还包括提供将被调用者部分内联入调用者部分中的单个目标代码块。22、根据权利要求21所述的方法,还包括步骤将堆栈指针设置为第一值,并且执行一个或多个目标代码指令,以便根据在对象代码的调用者部分中识别出的窗口化的对象寄存器引用,参考从窗口化的对象寄存器引用获得的位移以及堆栈指针的第一值来访问从堆栈数据结构中选择的条目;根据从对象代码的调用者部分获得的寄存器窗口移动信息,将帧偏移增加预定数量的条目;执行一个或多个目标代码指令,以便根据在对象代码的被调用者部分中识别出的窗口化的对象寄存器引用,参考从窗口化的对象寄存器引用获得的位移以及根据帧偏移调节的堆栈指针来访问从堆栈数据结构选择的条目;根据从对象代码的被调用者部分获得的寄存器窗口移动信息减d、帧偏移。23、根据权利要求18所述的方法,还包括在计算系统的所述存储器中设置仿真的执行堆栈,该仿真的执行堆栈对用于对象代码的执行的执行堆栈进行仿真;将对象代码解码以识别至少SAVE和SAVE类型寄存器窗口移动信息;针对每一条所述SAVE和SAVE类型寄存器窗口移动信息更新计数器,所述更新包括针对每一SAVE类型移动使计数器增加并且针对每一RESTORE类型移动使计数器减小,计数器藉此计算存储在堆栈数据结构上的条目的帧的数量;识别对象代码中的SPILL类型指令,该SPILL类型指令需要将由对象代码寻址的窗口化的对象寄存器中所保存的数据值溢出到执行堆栈中;将数据值从堆栈数据结构中的一定数量的条目的帧复制到仿真的执行堆栈上所分配的相应空间中,其中,所述条目的帧的数量由计数器确定;将计数器重设为默认值,该默认值指示在堆栈数据结构中不存在有效的条目的帧;产生目标代码,以便对仿真的执行堆栈中所存储的数据值进行寻址。24、根据权利要求23所述的方法,还包括识别对象代码中的FILL类型指令,该FILL类型指令需要仿真的执行堆栈中所存储的数据值被载入到由对象代码寻址的窗口化的对象寄存器中;相对于默认值测试计数器;当计数器的测试显示堆栈数据结构中存在一个或多个有效的条目的帧时,根据识别出的FILL指令更新计数器;将数据值的帧从仿真的执行堆栈复制到堆栈数据结构,以用作当前的条目的巾贞。25、一种记录有计算机可实现的指令的计算机可读存储介质,当所述计算机可实现的指令被执行时,改编计算系统使其支持寄存器窗口架构,其中,该计算机可读存储介质包括(a)被布置为将可由基于寄存器窗口的对象计算架构的对象处理器执行的对象代码解码的代码单元,在所述基于寄存器窗口的对象计算架构中,当前寄存器窗口被定位为使从窗口化的寄存器文件中选择的对象寄存器的子集显露,所述解码包括从对象代码中的指令识别窗口化的对象寄存器引用,其中所述窗口化的对象寄存器引用包括对寄存器窗口中的所述对象寄存器之一的引用;从对象代码中的导致寄存器窗口的移动的指令获得寄存器窗口移动信息;(b)被布置为在计算系统的存储器中设置堆栈数据结构并设置堆栈指针的代码单元,其中该堆栈数据结构被布置为存储多个条目,所述堆栈指针指示在存储器中该堆栈数据结构的头;(c)被布置为将对象代码转换为目标代码并使该目标代码在计算系统的处理器上执行,从而参考识别出的寄存器窗口移动信息调节堆栈指针,并且参考调节的堆栈指针与从窗口化的对象寄存器引用确定的位移的组合来访问堆栈数据结构中的至少一个条目的代码单元。全文摘要目标计算系统(10)被改编以支持寄存器窗口架构,特别用于将非本地对象代码(17)转换为由目标处理器(13)执行的目标代码(21)时。存储器中的对象寄存器堆栈数据结构(“SR堆栈”)(400)具有多个帧(410),每一帧包含与对象处理器(3)中的一个寄存器窗口(510)的对象寄存器子集(502)对应的一组条目(401)。在目标处理器(13)上执行的目标代码(21)访问SR(10)堆栈(400)。SR堆栈(400)存储大量这样的帧410,从而避免了诸如模拟从对象架构的窗口化的寄存器文件的自动溢出和载入操作的开销。在一个实施例中,具有16个通用工作寄存器的目标计算系统(10)被改编以支持依赖包含几十或几百个对象寄存器(502)的寄存器文件(15)的寄存器窗口架构。文档编号G06F9/455GK101523349SQ200780036887公开日2009年9月2日申请日期2007年9月27日优先权日2006年10月2日发明者亚历山大·巴拉克劳·布朗申请人:特兰斯蒂有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1