專利名稱::使用本機指令將操作數(shù)堆棧作為寄存器堆的微處理器存取的制作方法使用本機指令將操作數(shù)堆棧作為寄存器堆的微處理器存取4支術領域本發(fā)明涉及存取微處理器中的寄存器堆堆棧,所述微處理器包含具有面向存儲器結構的微處理器(例如,復雜指令組計算機或CISC機器)和具有加載一存儲結構的微處理器(例如,精簡指令組計算機或RISC機器),以及包含具有Java虛擬機內核結構的微處理器的堆棧機器??梢訰ISC或CISC狀態(tài)且還以Java狀態(tài)操作的組合結構尤其有關。更確切地說,本發(fā)明涉及使用所述結構本機的指令來存取操作數(shù)堆棧,例如存取來自RISC狀態(tài)的Java操作數(shù)堆棧。
背景技術:
:微處理器可劃分成若干基本類別。在堆棧機器中,所有算術一邏輯單元(ALU)操作均是對操作數(shù)堆棧的最上層寄存器進行的。在CISC機器中,所述操作直接在存儲器中進行(即,從存儲器存取操作數(shù)并將結果存儲在存儲器中)。在RISC機器中,所有操作均是對駐存在中央處理單元(CPU)中的可尋址寄存器執(zhí)行的。盡管早期微處理器是堆棧機器,但如今大多數(shù)微處理器是CISC機器或RISC機器。隨著時間的過去,CISC機器和RISC機器已經(jīng)在設計上彼此接近,大多數(shù)現(xiàn)代CISC機器也具有在其中執(zhí)行操作的寄存器堆。通過SunMicrosystems對Java編程語言和Java虛擬機(JavaVM)的引入,堆棧機器被重新引入到現(xiàn)代微處理器中。雖然JavaVM主要希望作為軟件來運行,但存在一些硬件實施方案。Java是由SunMicrosystems開發(fā)的一種面向對象的編程語言,其已成為網(wǎng)絡編程的事實上標準,并且也開始在嵌入式系統(tǒng)領域中使用。Java字節(jié)碼通常在稱為Java虛擬機的軟件層中執(zhí)行,SunMicrosystems出版了關于Java虛擬機的規(guī)范。為了執(zhí)行Java字節(jié)碼,可使用解譯器或"及時"編譯器(其優(yōu)選地結合某種形式的先行技術以分析潛在程序流程瓶頸)或者用于特定硬件平臺的交叉編譯器。或者,可直接在硅中執(zhí)行Java。一些Java硬件處理器具有折疊機制,這意味著若干指令被組合且作為一個來執(zhí)行。然而,大多數(shù)Java處理器將作為解譯器進行操作,其中讀取每一操作碼并接著采取適當行為來執(zhí)行指令。如果要在嵌入式系統(tǒng)中實施Java,那么硬件方法是優(yōu)選的技術解決方案,且近些年來,已針對嵌入式處理器平臺開發(fā)出若干硬件版本的Java虛擬機。這些支持直接執(zhí)行Java指令的處理器通常被設計成32位堆棧機器。一些依賴于對Java二進制格式的擴展,以便提供如直接尋址和位操縱指令的特征。其它的不直接執(zhí)行Java二進制代碼,但具有非常緊密的結構匹配以借此提高虛擬機的性能。在試圖以硬件實施JavaVM時遇到的主要難題在于,一些Java指令具有高層語義內容,且因此非常難以作為原子指令來執(zhí)行。俘獲復雜的Java指令且用主機結構本機的指令將其作為軟件例行程序來執(zhí)行是一種可能的解決方案。但為了進行所述操作,需要一種使用本機(RISC或CISC)指令來存取Java操作數(shù)堆棧的機制。在本受讓人的早期在2002年4月1日申請的題為"MicroprocessorforexecutingbytecompiledJavacode"且在2004年1月22日作為US2004/0015678Al公開的美國專利申請案10/114,678(其主張2001年4月23日申請的美國臨時申請案60/286,197的優(yōu)先權)中,以及在2002年10月31日作為WO2002/086699A3公開的相應國際申請案中,描述了將RISC機器與JavaVM組合的概念。在所述早期公開申請案中,將RISC微處理器與以硬件實施的JavaVM組合,使得硬件可以RISC狀態(tài)或Java狀態(tài)進行操作。為了使RISC微處理器存取Java操作數(shù)堆棧且將復雜的Java指令作為RISC軟件例行程序來執(zhí)行,在狀態(tài)寄存器中設置兩個位——"X"和"Y",以允許相應的X或Y自變量由操作數(shù)堆棧指針所指向的寄存器編號取代。尋求額外的機制以使得這些組合的微處理器改進對來自處理器的RISC(或CISC)狀態(tài)的Java操作數(shù)堆棧的存取。
發(fā)明內容本發(fā)明在同一微處理器內核中實施RISC(或CISC)機器和堆棧機器(例如JavaVM)兩者。微處理器含有寄存器堆。與現(xiàn)有RISC(或CISC)機器一致,處理寄存器堆的指令指定作為操作數(shù)的源和結果的目的寄存器編號。堆棧機器使用同一寄存器堆的一部分(例如,下半部分)來保持Java操作數(shù)堆棧。提供Java操作數(shù)堆棧指針寄存器,每當處理器處于Java狀態(tài)時其指向堆棧頂部并因此確定在處理哪些寄存器。狀態(tài)寄存器不僅包含指定處理器何時處于Java狀態(tài)的位,而且還包含當處理器處于RISC(或CISC)狀態(tài)時用來存取Java堆棧的Java寄存器重映射位。在RISC(或CISC)狀態(tài)下,重映射位在被設置時會致使指令中所指定的寄存器編號(每當其對應于Java操作數(shù)堆棧中的寄存器時)被重映射,以相對于堆棧頂部來存取寄存器。也就是說,所存取的寄存器編號等于操作數(shù)堆棧指針的最大值減去操作數(shù)堆棧指針的值。如果重映射位已經(jīng)被復位成零,那么所存取的寄存器編號是指令中所指定的編號。在Java狀態(tài)下忽視重映射位。重映射位有效地允許RISC(或CISC)指令從Java堆棧中存取操作數(shù),(例如)以便獲得來自堆棧頂部的操作數(shù)和堆棧頂部下方的元素,并將結果放置在堆棧頂部,而不管哪個寄存器實際上保持堆棧值的頂部。圖1是共享共用內核處理器元件的組合式RISC/Java微處理器結構的方框圖。圖2是圖1中的處理器的正常運行序列的流程圖。圖3是展示從各自RISC和Java狀態(tài)看到的微處理器的寄存器堆的相關部分的方框圖。圖4是說明用于將圖1的處理器在RISC狀態(tài)與Java狀態(tài)之間轉換的示范性機制的方框圖。圖5是系統(tǒng)寄存器空間和寄存器堆的相關部分的方框圖,其說明當在處理器的RISC狀態(tài)下執(zhí)行所俘獲的Java指令時本發(fā)明的重映射操作。圖6是通常將實施圖1的微處理器的運行時間系統(tǒng)的方框圖。圖7是根據(jù)本發(fā)明的微處理器連同其處理器控制單元和重映射單元的方框圖。具體實施方式本發(fā)明可適合于組合式RISC/Java處理器結構或組合式CISC/Java處理器結構,或者更一般地適合于具有本機RISC或CISC處理器的堆棧機器的任何組合。如同已經(jīng)指出的,本發(fā)明特別涉及一種用于不但當處理器處于其堆棧機器或Java狀態(tài)時而且還當處理器處于其本機RISC或CISC狀態(tài)時存取操作數(shù)堆棧的技術。出于說明目的,所述描述內容的其余部分將集中在組合式RISC/Java處理器結構上,并在所述上下文中說明本發(fā)明技術。所屬領域的技術人員將容易了解如何改編本發(fā)明的所述RISC/Java版本以供用于其它可適用的處理結構。JavaVM指令組當前包含201個操作碼。所述指令組的較大部分是類型特定的,因此存在許多具有相同意義但適用于不同操作數(shù)類型的Java指令。RISC處理器的指令組根據(jù)每種結構的特定設計特征而變化,但典型的RISC指令組可包含例如以下各項的指令加載、存儲、移動、力n、減、乘、除、非、與、或、異或、比較、移位、旋轉、設置、清除、跳躍以及返回。典型RISC指令組中的較大部分與JavaVM指令組重疊。舉例來說,Java和RISC狀態(tài)兩者中最頻繁執(zhí)行的指令是加載/存儲指令,其在所述兩種狀態(tài)下具有相同的語義內容且可在組合式RISC/Java結構中共享相同的硬件資源。同樣,基本算術和邏輯運算共享相同的意義并以相同方式使用共享的算術/邏輯單元(ALU)。然而,一些低級別位操縱指令可能只在RISC指令組中出現(xiàn)而不在JavaVM指令組中出現(xiàn)。同樣,Java包含高級別對象創(chuàng)建和操縱指令,這不會出現(xiàn)在典型的RISC指令組中。JavaVM指令組包含一些具有難以用硬件實施的高層語義內容的指令。在單個時鐘周期中執(zhí)行此類高級別指令通常是不可行的,且將其分解成若干復雜度較低的指令的任務就資源分派和時序限制而言較為困難。為了降低硬件開銷,可改為將這些Java指令俘獲并作為小RISC程序在組合式RISC/Java處理器中執(zhí)行。所俘獲的指令通常將達到所有執(zhí)行的指令的10%以下。用于每個此類指令的RISC程序存儲在可供處理器存取的程序存儲器中,且可根據(jù)需要由程序員改變。這在對Java指令組的任何未來擴展方面提供了完全的靈活性。但是將高級別Java指令作為RISC程序來執(zhí)行要求組合式處理器在每當其切換到RISC狀態(tài)以執(zhí)行那些指令時仍然能夠存取Java操作數(shù)堆棧。還將需要在處理器返回Java狀態(tài)時從堆棧中存取操作結果。參看圖l,可適于使用本發(fā)明的典型組合式RISC/Java微處理器可包含RISC處理器、用于在RISC處理器中執(zhí)行第一組Java指令的Java模塊、用于在RISC處理器中將第二組Java指令作為微代碼執(zhí)行的RISC模塊以及RISC處理器中的數(shù)據(jù)路徑,其中包含由所述兩個模塊共享的寄存器堆。如在圖1中看到,根據(jù)本發(fā)明的微處理器IO包含Java控制單元11和RISC控制單元13兩者,其共享共用數(shù)據(jù)路徑。所述兩個控制單元11和13獨立操作,但永遠不會同時操作處理器。處理器10不會像其它Java處理器那樣依賴于對Java二進制格式的翻譯或擴展,而是提供兩種正交編程模型。處理器IO可被構造為對于數(shù)據(jù)和指令兩者共享共用總線的基本馮*諾伊曼式(von-Neumann)結構,或者可容易地擴展成具有單獨數(shù)據(jù)總線和指令總線的哈佛式(Harvard)結構??蓪⑻幚砥鞴芫€化,以實現(xiàn)高時鐘頻率和單周期執(zhí)行。微處理器包含寄存器堆15,其連接到數(shù)據(jù)總線30??蓪⒊绦蛴嫈?shù)器16、連接寄存器17和堆棧指針18連同任何數(shù)目的通用寄存器19一起映射到寄存器堆15中。到寄存器堆15的這種映射允許用與通用寄存器19相同的方式尋址程序計數(shù)器16、連接寄存器17和堆棧指針18,使得普通指令可在每當需要時使用這些寄存器。能夠將堆棧指針18作為普通寄存器尋址簡化了局部變量和參數(shù)的分派和存取。堆棧指針18也可由若干指令隱含地使用。程序計數(shù)器16含有正被執(zhí)行的指令的地址。存儲器空間是以字節(jié)形式尋址的。除了Java狀態(tài)以外,指令大小可以是兩個字節(jié)的倍數(shù),其中將程序計數(shù)器的最低有效位固定為零。因為將程序計數(shù)器16映射到寄存器堆15中,所以其可被用作所有使用寄存器操作數(shù)的指令(例如,加載/存儲、算術和邏輯指令)中的源操作數(shù)或目的操作數(shù)。以與跳躍指令相同的方式處理使用編程計數(shù)器16作為其目的寄存器的指令,其中在由新的程序計數(shù)器值指定的地址處清洗管線并恢復執(zhí)行。連接寄存器17用于為子例行程序調用以及為管理程序調用、中斷請求和異常處理保持返回地址。在所有其它時間,可將連接寄存器位置用作通用寄存器??舍槍χ袛嗪彤惓DJ桨瑔为毜募拇嫫鞫眩栽试S具有較低中斷等待時間的較高性能。狀態(tài)寄存器21不同于寄存器堆15,而是可與Java操作數(shù)堆棧指針22、Java局部變量寄存器23和Java俘獲基準地址寄存器24—起映射到系統(tǒng)寄存器空間20中。狀態(tài)寄存器21可包含通常的算術/邏輯運算旗標(例如,飽和、溢出、符號、零和進位旗標)、模式位設置(例如,應用程序、管理程序、中斷和異常模式)、調試狀態(tài)位以及中斷、異常和調試掩蔽位。此外,對于本發(fā)明特別重要的是,狀態(tài)寄存器21包含Java狀態(tài)位和Java寄存器重映射位。每當且僅在設置了狀態(tài)寄存器21中的Java狀態(tài)位時,處理器10才處于其Java狀態(tài)。這個位在復位時被清除,且應當僅在Java執(zhí)行完成時或通過中斷和異?;蛘咄ㄟ^所定義的指令(例如JCALL或RETJ,其中前者用于起始Java狀態(tài),而后者用于在指令俘獲之后返回到Java狀態(tài))來修改。用戶手動修改這個Java狀態(tài)位的嘗試可能會導致不確定的行為。每當設置了Java寄存器重映射位時,如同在堆棧機器中一樣將寄存器堆15重映射以存取變量。這個位在復位時被清除。如果將這個位寫入到JavaVM外部,則可能會導致不確定的行為。以下將更詳細地描述這個重映射位的作用。系統(tǒng)寄存器空間20中的Java操作數(shù)堆棧指針22用于保持Java操作數(shù)堆棧的當前頂部在寄存器堆空間中的位置。Java俘獲基準地址寄存器24含有針對所俘獲的Java指令的程序代碼的基準地址。Java局部變量寄存器23存儲臨時Java局部變量。此外,Java俘獲入口點寄存器可含有針對未實施Java指令的入口點的從基準地址指針到異常例行程序的偏移量。可根據(jù)特定硬件處理器設計的需要提供其它系統(tǒng)寄存器。在RISC和Java兩種狀態(tài)下使用的算術邏輯單元(ALU)25連接到寄存器堆15,且ALU的輸出被供應到數(shù)據(jù)總線30。典型的ALU可包含32位加法器、32位桶式移位器和硬件乘法器。算術和邏輯運算在單個時鐘周期中執(zhí)行。除了32位字大小數(shù)據(jù)類型以外,處理器通常支持半字和字節(jié)數(shù)據(jù)類型,而不會損害代碼大小或性能。通常通過對字節(jié)和半字數(shù)據(jù)進行自動符號或零擴展而為字節(jié)、半字、字和雙字數(shù)據(jù)提供存儲器加載和存儲操作。程序計數(shù)器16的輸出和相關寄存器堆通過通向地址多路復用器33的加法器36處理。地址多路復用器33還連接到地址總線40。指令取出解碼器35從數(shù)據(jù)總線30接收信號,并將輸出提供到堆??刂茊卧?7。處理器結構的這個或其它典型布置可與本發(fā)明一起使用。因為RISC和JavaVM指令組的大部分重疊,所以組合式RISC/Java處理器共享硬件資源,但具備單獨的Java指令解碼器和控制模塊11,所述控制模塊11在處理器處于其Java狀態(tài)時接管執(zhí)行。處理器通過其狀態(tài)寄存器21追蹤其執(zhí)行狀態(tài),且可以無縫方式改變執(zhí)行狀態(tài)。在包含處理器的較大運行時間系統(tǒng)中,通常將存在追蹤并派遣不同過程的操作系統(tǒng)。Java程序通常將是若干此類過程中的一者。與切換成本機過程(RISC或CISC)的上下文切換相比,與切換成Java過程的上下文切換相關的額外開銷較少(如果有的話)。而且,當處理器切換指令解碼器(將RISC控制模塊13切換成Java控制模塊11,反之亦然)時,其不會影響系統(tǒng)設置的安全級別。此外,原則上Java程序可從不同的中斷級別執(zhí)行,而不會干擾處理器的模式設置,但是一般來說不建議用Java編寫中斷例行程序,原因在于等待時間會相對于相應RISC中斷例行程序有所增加。參看圖2,微處理器以RISC狀態(tài)加電51,以便執(zhí)行初始化代碼。在初始化52之后,微處理器可將應用程序作為正常RISC處理器來執(zhí)行,或者可切換到其Java狀態(tài)53并開始執(zhí)行Java程序54。為了調用Java程序,如同其它任何應用程序一樣調用JavaVM。確切地說,JavaVM將執(zhí)行初始化例行程序,隨后類別加載器對類別進行分析,并初始化開始執(zhí)行Java程序所必要的寄存器。類別加載器中的最后指令是jcall指令,其將處理器設置為Java狀態(tài)。這意味著指令解碼器現(xiàn)在解碼Java操作碼而不是本機RISC操作碼。微處理器將繼續(xù)以Java狀態(tài)進行操作,直到發(fā)生這些事件中的一者為止用于切換回到RISC模式的指明Java操作碼58、中斷請求59或未實施的Java指令60。如果這些事件中的任何事件發(fā)生,則處理器將跳躍到預先界定的地址并切換到RISC模式55且以此方式處理事件。在完成RISC例行程序56后,處理器將使用RETJ指令返回到Java狀態(tài)57并在Java代碼先前停止的點處繼續(xù)執(zhí)行Java代碼。因此,在Java狀態(tài)下,處理器能夠執(zhí)行程序的Java部分。此類部分可以是己經(jīng)在公司的軟件庫中實施的網(wǎng)絡能力或算法,并構成傳統(tǒng)軟件模塊以供重新使用。處理器的RISC狀態(tài)通過將復雜的Java指令60作為RISC微代碼來執(zhí)行而幫助執(zhí)行Java代碼。其還提供可用于(例如)控制如傳感器和致動器等非常專用的外圍裝置的靈活硬件接口。為了與JavaVM規(guī)范兼容,需要實施所有Java指令。然而,在針對小型到中型應用的嵌入式處理器中,Java虛擬機所支持的數(shù)字格式中的若干者是多余的。舉例來說,此區(qū)段中很少處理器提供浮點單元。必須俘獲Java的更復雜指令中的若干者并將其作為微代碼來執(zhí)行。我們用"復雜"來表示單個Java指令需要多個機器時鐘周期來執(zhí)行。在Java程序的執(zhí)行期間,每當處理器遇到硬件中不支持的字節(jié)碼時,指令解碼器將自動辨別這些字節(jié)碼,將處理器切換到其RISC狀態(tài)中,并同時跳躍到預先界定的入口點(相對于存儲在Java俘獲基準地址系統(tǒng)寄存器中的地址而界定的,其中應用于基準地址的偏移量取決于特定俘獲指令)。其接著將執(zhí)行會執(zhí)行所俘獲字節(jié)碼的語義的RISC軟件例行程序。當完成時,所述例行程序會用返回到Java狀態(tài)(RETJ)指令結束。俘獲哪些Java指令且將哪些Java指令直接在硬件中實施通常是由設計者決定的實施方案特定問題。通常,俘獲那些創(chuàng)建或操縱Java對象的指令。其它所俘獲指令可包含處理長(64位或多字)數(shù)據(jù)類型的指令、浮動和雙重型指令以及任何與所設計的結構不兼容的指令。使用哪個RISC指令組取決于所選擇的RISC模型,因為本發(fā)明除了本文描述的RISC結構外還可與其它類型的RISC結構一起使用。(如上文提到,本發(fā)明還可適于與CISC結構和指令組一起使用。)參看圖3,處理器的寄存器堆在其Java狀態(tài)下具有推進一彈出堆棧的功能,但在本機RISC狀態(tài)下充當常規(guī)的加載/存儲寄存器堆。這也是允許所述兩個虛擬處理器進行通信的模塊,Java堆棧中提供的值在其RISC狀態(tài)下可由處理器存取。圖3展示從RISC和Java模式看到的寄存器堆的一半。寄存器80、81、……、82由Java控制單元61和電路71的RISC部分兩者看到。寄存器堆結構71的RISC視域將寄存器元件80、81、……、82看作一組加載/存儲寄存器0到M,且RISC結構借助于將特定寄存器指明為源或目的的相應加載/存儲指令72、73、……、74來使這些寄存器與數(shù)據(jù)存儲器介接?;叵氲匠绦蛴嫈?shù)器、連接寄存器和堆棧指針連同通用寄存器一起包含在寄存器堆中。為了保持正交性,這些特殊的寄存器如同其它任何寄存器一樣是可存取的。Java控制單元61將同一寄存器堆看作為推進一彈出堆棧,其通常具有大約(M+1)/2個寄存器元件。將數(shù)據(jù)推進62到寄存器堆棧中,以及將數(shù)據(jù)從寄存器堆棧中彈出63到Java控制單元。其余寄存器可尤其用于程序計數(shù)器、堆??刂萍拇嫫骱团R時高速暫存寄存器。將堆棧實施為循環(huán)堆棧,且所需要的堆棧大小相對較小。堆棧大小是可縮放的,且堆棧元件數(shù)目留作實施方案特定的問題??赏ㄟ^溢出/下溢機制在存儲器83中復制出堆棧溢出/下溢。也可通過逐個情況的方式來開發(fā)可能的堆棧溢出/下溢機制。圖4展示用于將微處理器從一種狀態(tài)轉換到另一種狀態(tài)的機制的一種可能實施方案。Java和RISC控制模塊120和122通過多路復用器124連接到控制線130,所述控制線130通向處理器的共享數(shù)據(jù)路徑。狀態(tài)寄存器126含有Java狀態(tài)位128(其被供應到Java和RISC控制模塊120和122),并確定這些控制單元中有哪些控制單元正在操作。Java狀態(tài)位128還充當多路復用器124所進行的選擇控制。在所述兩個控制模塊中將控制轉換到預先界定的狀態(tài)。因此,控制被同時轉換,其中所述兩個機器將處于相同的界定狀態(tài)下。Java指令俘獲涉及與典型中斷機制相似的步驟。當出現(xiàn)未實施的指令時,JAVA控制模塊檢測到這個,且返回地址被存儲在堆棧頂部。接著,處理器切換到RISC模式并從存儲器中的預先界定位置處取出跳躍地址。接著,RISC模塊在最后步驟中所取出的地址處繼續(xù)執(zhí)行。使得俘獲機制類似于中斷機制會實現(xiàn)最大的靈活性,因為在設計中只預先界定第一跳躍地址。這將使得軟件連接程序能夠通過只連接程序中實際存在的Java操作碼的RISC例行程序來最佳地計劃存儲器使用,因而節(jié)省寶貴的存儲器空間。RISC例行程序應當通過將程序計數(shù)器從堆棧頂部彈出并將其保存在程序計數(shù)器寄存器中來結束。這將確保Java程序在正確的位置處繼續(xù)。此外,微處理器具有堆棧溢出/下溢處理機制。Java推進一彈出堆棧中的這種機制可通過將現(xiàn)有邏輯重新用于指令俘獲來實施。當出現(xiàn)溢出時,處理器俘獲溢出旗標并跳躍到預先界定的地址,在所述地址處其發(fā)現(xiàn)到達將處理溢出/下溢情形的軟件程序的跳躍向量。參看圖5,寄存器堆的功能在Java和RISC狀態(tài)下有所不同。在所述兩種狀態(tài)下,三個寄存器(此處為R15—R13)專用于程序計數(shù)器(PC)、連接寄存器(LR)和系統(tǒng)或應用程序堆棧指針(SP),如上文已經(jīng)論述的。在RISC狀態(tài)下,寄存器堆90的其它寄存器(此處為R12—R0)可用于正常RISC操作,例如尋址操作數(shù)。在Java狀態(tài)下,JavaVM作為零操作數(shù)堆棧機器執(zhí)行,且因此改變寄存器堆功能性以有利于推進一彈出堆棧,其中操作數(shù)堆棧的當前頂部可以是ToS到ToS-7(此處使用寄存器R7—R0)中的任意者。此外,其它寄存器(例如R9禾I1R8)可在Java狀態(tài)下用作含有指向Java局部變量O的當前幀地址的幀寄存器(系統(tǒng)寄存器空間100中的七個Java局部變量寄存器104中的一者),且用作含有指向當前Java類別的恒定集區(qū)的恒定集區(qū)寄存器。除了Java局部變量寄存器之外,系統(tǒng)寄存器空間100還包含操作數(shù)堆棧指針102,其指向操作數(shù)堆棧的當前頂部(同樣,ToS到ToS-7中的任意者)。Java操作數(shù)堆棧(ToS到ToS-7)保持將由Java指令操作的值以及操作結果。操作數(shù)堆桟是當前方法幀的一部分,且操作數(shù)堆棧的一部分保持在寄存器堆中以便加速操作。寄存器堆通常保持操作數(shù)堆棧的多達八個元件,如此處所示,堆棧的剩余部分作為JavaVM幀的一部分存儲在存儲器中。(幀是保持所有變量和參考以支持Java方法的執(zhí)行的運行時間數(shù)據(jù)結構,且可含有針對所述方法的引入自變量以及針對調用方法的引出自變量。在調用所述方法時分派幀,且在程序從所述方法返回時將幀銷毀。示范性幀可包含操作數(shù)堆棧、局部變量、指向可放置下一幀的空閑存儲器空間的指針、所述方法的返回地址、先前方法的幀指針以及先前方法的恒定集區(qū)指針和堆棧指針。)系統(tǒng)寄存器100包含具有兩種功能的Java操作數(shù)堆棧指針102。其展示操作數(shù)堆棧上的元件數(shù)目,并還指向(例如,在位[2:0]中)保持當前堆桟頂部的寄存器。操作數(shù)堆棧指針被初始化為0值,這意味著操作數(shù)堆棧是空的。如果操作數(shù)堆棧溢出或下溢,則產生異常,且異常例行程序負責將操作數(shù)堆棧的內容從寄存器堆復制到存儲在存儲器中的當前方法幀。(舉例來說,在含有多達八個元件的堆棧的寄存器堆中,每當將第九個元件推進到堆棧上時發(fā)生溢出情形。如果試圖從空的堆棧進行存取,則發(fā)生下溢情形。)俘獲例行程序需要在處理器的RISC狀態(tài)下存取Java操作數(shù)堆棧。為了避免必須讀出Java操作數(shù)堆棧指針102并將其轉換到正確的寄存器的繁瑣過程,處理器的Java控制單元先執(zhí)行寄存器重映射操作(其會產生重映射的寄存器堆90a),然后才將控制轉移給RISC單元,所述RISC單元確保堆棧頂部(ToS)始終在寄存器R7中,ToS-l始終在寄存器R6中等。在狀態(tài)寄存器101中,提供重映射位RM。每當處理器作為堆棧機器(即,在Java狀態(tài)下)運行時,這個重映射位RM便被丟棄。然而,在處理器的本機RISC狀態(tài)下,重映射位RM具有以下語義如果RM為0,則存取的寄存器編號=指定的寄存器編號(即,不發(fā)生重映射);如果RM為1,則存取的寄存器編號=操作數(shù)堆棧指針的最大值_操作數(shù)堆棧指針值。舉例來說,在八寄存器堆棧ToS到ToS-7中,操作數(shù)堆棧指針的最大值將是7。在重映射位RM設置為"1"的情況下,寄存器編號R7到R0將分別存取保持堆棧元件ToS到ToS-7的寄存器。RISC指令"添加R7、R6"于是將有效地添加ToS和ToS-l。如果操作數(shù)堆棧指針將指向寄存器R3,那么存儲ToS和ToS-l的實際寄存器分別是R3和R2,且添加操作將使用這兩個物理寄存器來進行添加操作。圖7展示重映射單元173附接到RISC處理器的控制單元171外部的典型布置。將形成每一重映射單元173的邏輯電路復制若干次,復制次數(shù)與寄存器堆175中的讀取和寫入端口的數(shù)目相等。每一重映射單元173均具有控制輸入RM(=1,用于啟用重映射操作;=0,用于傳遞接收到的寄存器地址而不進行重映射)以及來自Java操作數(shù)堆棧指針(圖5中的102)的指示堆棧頂部位置的JOSP。(JOSP—般是對應于可重映射的寄存器位置的數(shù)目的多位信號。)每一重映射單元173具有寄存器地址輸入173,和寄存器地址輸出1730。寄存器地址輸入173z從處理器控制邏輯171接收單獨的寄存器地址。接著,寄存器地址輸出173o向寄存器堆171的端口輸出對應的物理寄存器地址。對于以上圖5中給出的實例,在Java操作數(shù)堆棧指針102提供堆棧頂部值3(JOSP=3)的情況下;那么,每當RM:1時,如果寄存器地址輸入173!分別是7和6(例如,對于指令添加R7、R6),則寄存器地址輸出173o將給出經(jīng)重映射的值3和2作為實際物理位置,以便存取寄存器堆175中的寄存器R3和R2。當將新的值推進到操作數(shù)堆棧時,必須使用特殊的遞增Java操作數(shù)堆棧指針指令"incjosp"來確保堆棧一致性。這個指令將使操作數(shù)堆棧指針102以指定數(shù)量N來遞增,并借此將所有操作數(shù)堆棧元件下推N個元件。這釋放了堆棧頂部的N個元件。此后,到達堆棧上的值可移動到R7。incjosp指令還可用于通過使操作數(shù)堆棧指針遞減來將元件從堆棧中彈出。所述指令還將在堆棧溢出/下溢情況出現(xiàn)時以前述方式自動處理堆棧溢出/下溢情況。Java局部變量也可作為前八個變量的系統(tǒng)寄存器104由RISC俘獲例行程序存取。對于更多的變量,其可在存儲器中的當前幀中存取。參看圖6,圖中展示具有此處理器概念的系統(tǒng)的典型運行時間環(huán)境。開發(fā)者可在普通Java編譯器142中編譯Java源代碼141,并以Java字節(jié)碼144結束。如果處理器使操作系統(tǒng)適應堆加載器和自動存儲器管理系統(tǒng),則這個過程的剩余部分可動態(tài)且自動地發(fā)生。然而,小型嵌入式系統(tǒng)通常并不需要操作系統(tǒng),那么在必須于外部平臺上創(chuàng)建程序的存儲器映像的意義上,這個過程的剩余部分必須手動進行。必須通過連接程序148分析Java字節(jié)碼144。通過連接程序運行的程序將(1)核實字節(jié)碼不含有任何非法操作碼,依據(jù)儀器解決方案來修改代碼或操作碼;(2)將應用程序與指定Java類別運行時間庫145連接;(3)將匯編碼連接到RISC部分143,設立堆積區(qū)域,設立分支和跳躍地址,并制作存儲器映射。來自連接程序的輸出將為可轉移到嵌入式系統(tǒng)152中的ROM或快閃存儲器151的存儲器映像。制作Java處理器的大部分目的是編程者應當能夠盡量無約束地使用Java編程語言。然而,在此情況下,只可使用所支持的類型,且將只有有限的運行時間庫可用。然而,這些限制因素對于Java的主要特征的使用并不形成限制。JavaVM規(guī)范目前含有201個指令;其中有許多是類型特定的且本質上對于不同的數(shù)據(jù)類型是相同的。硬件實施的指令的數(shù)目和俘獲的指令的數(shù)目取決于所使用的RISC結構。其它類型的RISC結構將影響硬件實施和俘獲的指令的數(shù)目。以下指令在本發(fā)明的優(yōu)選實施例中不是硬件實施的,因為不認為這些指令在小型嵌入式處理器中是重要的所有"浮動"類型的指令、所有"雙重"類型的指令以及所有"長"類型的指令。這從所述201個可能的Java指令中消除了大約90個指令。在剩余指令中,68個指令在Java虛擬機中實施,且43個指令被俘獲并作為RISC例行程序執(zhí)行。以下在表1中注釋被俘獲并作為RISC例行程序執(zhí)行的Java指令。表1<table>tableseeoriginaldocumentpage15</column></row><table>通過這些實施方案選擇,通常至少70%的Java指令將直接在處理器中執(zhí)行,而不超過30%的將被俘獲并作為RISC程序執(zhí)行。這些百分比是從動態(tài)測量導出的,且對于大多數(shù)Java程序通常將為約90%和10%。本發(fā)明改進了在執(zhí)行所俘獲的Java指令期間對Java操作數(shù)堆棧值的RISC存取。重映射寄存器位置確保對所俘獲指令的RISC執(zhí)行正確地存取Java操作數(shù)堆棧頂部,且所俘獲操作的結果在返回到Java狀態(tài)時即可存取。權利要求1.一種用于將字節(jié)編譯的Java代碼作為硬件執(zhí)行的微處理器,所述微處理器包括處理器內核;Java控制模塊,其用以在所述處理器內核中執(zhí)行第一組Java指令;本機控制模塊,其用以在所述處理器內核中執(zhí)行本機指令,并在所述處理器內核中將第二組Java指令作為本機微代碼來執(zhí)行;一組系統(tǒng)寄存器,其可由所述Java和本機控制模塊存取且包含狀態(tài)寄存器,所述狀態(tài)寄存器含有指明在任何給定時間所述控制模塊中的哪一者正在操作的處理器狀態(tài)控制信息;以及寄存器堆,其處于所述處理器內核的數(shù)據(jù)路徑中且可由所述兩個控制模塊存取,所述寄存器堆包含多個寄存器元件,所述本機控制模塊將所述多個寄存器元件看作存儲寄存器,所述Java控制模塊將所述寄存器元件的第一部分看作Java操作數(shù)堆棧,并將所述寄存器元件的第二部分看作存儲寄存器;其中所述系統(tǒng)寄存器組還包含Java操作數(shù)堆棧指針,其指向所述寄存器堆中的作為所述堆棧的當前頂部的所述寄存器元件,且所述狀態(tài)寄存器還含有Java寄存器重映射位,使得每當設置所述重映射位時,將所述第二組的Java指令作為本機微代碼執(zhí)行的所述本機控制模塊將由所述本機微代碼中的指令指定的寄存器編號視為對應于相對于所述堆棧頂部的指定寄存器元件。2.根據(jù)權利要求1所述的微處理器,每當設置所述重映射位時,由本機微代碼指令存取的相對于所述堆棧頂部的對應寄存器是所述操作數(shù)堆棧指針的最大值減去由所述Java操作數(shù)堆棧指針指定的寄存器編號。3.根據(jù)權利要求l所述的微處理器,每當已經(jīng)復位所述重映射位時,所述本機控制模塊將由本機指令指定的寄存器編號視為指明所述寄存器堆的對應存儲元件。4根據(jù)權利要求1所述的微處理器,其中所述Java控制模塊忽視所述重映射位。5.根據(jù)權利要求1所述的微處理器,其中所述第二組的Java指令比所述第一組的Java指令復雜,所述第二組的所述指令不能夠在一個時鐘周期內在所述處理器內核中執(zhí)行。6.根據(jù)權利要求5所述的微處理器,其中所述第二組Java指令包含用于創(chuàng)建和操縱Java對象的指令。7.根據(jù)權利要求5所述的微處理器,其中所述第二組Java指令包含處理長和浮點數(shù)據(jù)類型的指令。8.根據(jù)權利要求5所述的微處理器,其中所述第二組Java指令包含雙重型指令。9.根據(jù)權利要求1所述的微處理器,其中所述處理器內核是RISC處理器,所述本機指令是RISC指令,且所述用于實施所述第二組Java指令的本機微代碼是RISC微代碼。10.根據(jù)權利要求l所述的微處理器,其中所述寄存器堆包含含有待執(zhí)行指令的存儲器地址的程序計數(shù)器作為所述寄存器元件中的一者。11.根據(jù)權利要求l所述的微處理器,其中所述寄存器堆包含含有用于在完成子程序調用之后執(zhí)行的返回地址的連接寄存器作為所述寄存器元件中的一者。12.根據(jù)權利要求l所述的微處理器,其中所述寄存器堆包含每當所述存儲器堆為滿時指向臨時存儲器位置以存取局部變量的本機堆棧指針作為所述寄存器元件中的一者。13.根據(jù)權利要求l所述的微處理器,其中所述系統(tǒng)寄存器組包含Java局部變量寄存器,所述寄存器處于所述處理器內核的所述數(shù)據(jù)路徑中且可由所述Java控制模塊存取以在所述Java操作數(shù)堆棧外部臨時存儲Java局部變量和參數(shù)。14.根據(jù)權利要求1所述的微處理器,其中所述系統(tǒng)寄存器組包含Java俘獲基準地址寄存器,所述寄存器含有指向所述第二組Java指令的微代碼的存儲器基準地址。15.—種在微處理器中執(zhí)行Java指令的方法,其中將所述Java指令的子組作為所述微處理器的本機微代碼執(zhí)行,所述方法包括(a)提供Java控制模塊和本機控制模塊,所述Java控制模塊用以控制所述微處理器對第一子組Java指令的直接執(zhí)行,所述本機控制模塊用以控制所述微處理器對本機指令的直接執(zhí)行,所述本機控制模塊還控制將第二子組Java指令作為本機微代碼的執(zhí)行,所述微處理器具有處于所述微處理器的數(shù)據(jù)路徑中的寄存器堆和一組系統(tǒng)寄存器,所述兩者均可由所述Java和本機控制模塊存取,所述寄存器堆包含多個寄存器元件,使得所述本機控制模塊將所述多個寄存器元件看作存儲寄存器,且所述Java控制模塊將所述寄存器元件的第一部分看作Java操作數(shù)堆棧并將所述寄存器元件的第二部分看作存儲寄存器,所述系統(tǒng)寄存器組包含指向所述寄存器堆中作為所述堆棧的當前頂部的寄存器元件的Java操作數(shù)堆棧指針,所述系統(tǒng)寄存器組還包含含有Java寄存器重映射位的狀態(tài)寄存器;(b)在所述Java控制模塊的控制下由所述微處理器執(zhí)行第一組Java指令,直到16.17.18.19.20.21.22.23.辨認出所述第二組的Java指令為止;(c)在辨認出所述第二組的Java指令后,便存取所述Java指令的對應本機微代碼,設置所述Java寄存器重映射位,將操作轉交給所述本機控制單元,并執(zhí)行所述本機微代碼,使得當以所述微代碼執(zhí)行本機指令時,將由那些本機指令指定的寄存器視為對應于所述寄存器堆的相對于所述堆棧的當前頂部的指定寄存器元件;(d)在完成所述第二組的Java指令的所述微代碼后,便將操作歸還給所述Java控制單元,并在下一Java指令處恢復執(zhí)行;以及(e)重復步驟(b)到(d),直到完成所有Java指令為止。根據(jù)權利要求15所述的方法,其中將操作轉交給所述本機控制單元和將操作歸還給所述Java控制單元是通過所述狀態(tài)寄存器中的處理器狀態(tài)控制信息調解的。根據(jù)權利要求15所述的方法,其中所述系統(tǒng)寄存器組包含Java俘獲基準地址寄存器,所述寄存器含有指向所述本機微代碼的存儲器基準地址,且存取所述第二組中的特定Java指令的所述對應本機微代碼的涉及向所述基準地址應用針對所述指令而指定的偏移量并接著在所得偏移地址處存取存儲器。根據(jù)權利要求15所述的方法,使得每當設置所述重映射位時,由所述本機微代碼指令存取的相對于所述堆棧頂部的所述對應寄存器是所述操作數(shù)堆棧指針的最大值減去由所述Java操作數(shù)堆棧指針指定的寄存器編號。根據(jù)權利要求15所述的方法,其中所述第二組的Java指令比所述第一組的Java指令復雜,所述第二組的指令不能夠由所述微處理器在一個時鐘周期內作為原子指令來執(zhí)行。根據(jù)權利要求19所述的方法,其中所述第二組Java指令包含用于創(chuàng)建和操縱Java對象的指令。根據(jù)權利要求20所述的方法,其中所述第二組Java指令包含處理長和浮點數(shù)據(jù)類型的指令。根據(jù)權利要求21所述的方法,其中所述第二組Java指令包含雙重型指令。根據(jù)權利要求22所述的方法,其中所述微處理器是RISC處理器,所述本機指令是RISC指令,且所述用于實施所述第二組Java指令的本機微代碼是RISC微代碼。全文摘要構造一種組合式本機(RISC或CISC)微處理器和堆棧(Java)機器(10、11、13),使得JavaVM指令可用硬件執(zhí)行。大多數(shù)Java指令被直接執(zhí)行(54),而例如操縱Java對象的指令的較復雜Java指令作為本機微代碼執(zhí)行(56)。為了使本機微代碼指令存取Java操作數(shù)堆棧,Java操作數(shù)堆棧指針(22;102)指向作為堆棧當前頂部(ToS)的寄存器堆(15;90)位置,而狀態(tài)寄存器(101)中的重映射位(RM)指示將本機指令中所指定的寄存器重映射(90a)為最大Java操作數(shù)堆棧指針值減去所述Java操作數(shù)堆棧指針的當前值。文檔編號G06F9/22GK101156131SQ200680011695公開日2008年4月2日申請日期2006年3月8日優(yōu)先權日2005年4月15日發(fā)明者克里斯蒂安·蒙森,厄于溫·斯特倫,埃里克·雷諾申請人:愛特梅爾公司