專利名稱:對(duì)虛擬機(jī)解釋器(vmi)加速硬件的軟件支持的制作方法
技術(shù)領(lǐng)域:
本發(fā)明一般來(lái)講涉及計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,更具體來(lái)講,涉及虛擬機(jī)語(yǔ)言的翻譯和執(zhí)行。
背景技術(shù):
計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言用于創(chuàng)建由表示供計(jì)算機(jī)執(zhí)行的指令的人類可讀源代碼所組成的應(yīng)用程序。然而,在計(jì)算機(jī)能夠遵循這些指令以前,所述源代碼必須被翻譯成計(jì)算機(jī)可讀的二進(jìn)制機(jī)器代碼。
諸如C、C++或者COBOL之類的程序設(shè)計(jì)語(yǔ)言通常使用編譯器,以便從源代碼產(chǎn)生匯編語(yǔ)言,然后將所述匯編語(yǔ)言翻譯為被轉(zhuǎn)換為機(jī)器代碼的機(jī)器語(yǔ)言。因此,在運(yùn)行時(shí)以前發(fā)生源代碼的最終翻譯。不同的計(jì)算機(jī)要求不同的機(jī)器語(yǔ)言,因此,以例如C++編寫(xiě)成的程序只能在該程序?yàn)橹鶎?xiě)的專用硬件平臺(tái)上運(yùn)行。
解釋性程序設(shè)計(jì)語(yǔ)言被設(shè)計(jì)成創(chuàng)建具有將在多個(gè)硬件平臺(tái)上運(yùn)行的源代碼的應(yīng)用程序。JavaTM是一種解釋性程序設(shè)計(jì)語(yǔ)言,其通過(guò)產(chǎn)生在運(yùn)行時(shí)以前被轉(zhuǎn)換為公知為“字節(jié)碼”或者“虛擬機(jī)語(yǔ)言”的中間語(yǔ)言的源代碼,來(lái)實(shí)現(xiàn)平臺(tái)無(wú)關(guān)性。在運(yùn)行時(shí),所述字節(jié)碼被解釋器軟件譯成平臺(tái)適用機(jī)器代碼,如美國(guó)專利第4443865號(hào)中所公開(kāi)的那樣。為了解釋每一字節(jié)碼,解釋器軟件執(zhí)行“取出、譯碼、調(diào)度”(FDD)操作系列。對(duì)于每一字節(jié)碼指令,解釋器軟件均包含一個(gè)用本機(jī)中央處理單元(CPU)指令表示的對(duì)應(yīng)執(zhí)行程序。所述解釋器軟件令CPU從存儲(chǔ)器中取出或者讀取一條虛擬機(jī)指令、對(duì)用于這條字節(jié)碼指令的執(zhí)行程序的CPU地址進(jìn)行譯碼、并且通過(guò)將CPU的控制權(quán)轉(zhuǎn)移給那個(gè)執(zhí)行程序來(lái)進(jìn)行調(diào)度。該解釋過(guò)程可能是耗時(shí)間的。
正如在PCT專利申請(qǐng)第WO9918484號(hào)中所公開(kāi)的那樣,在存儲(chǔ)器和CPU之間添加預(yù)處理器(虛擬機(jī)解釋器(VMI))能改善虛擬機(jī)指令的處理。實(shí)際上,虛擬機(jī)并不是一種物理結(jié)構(gòu),而是一種自含式操作環(huán)境,其通過(guò)選擇存儲(chǔ)在VM內(nèi)的或者CPU中的相應(yīng)本機(jī)機(jī)器語(yǔ)言指令,來(lái)為硬件平臺(tái)解釋字節(jié)碼。然后將本機(jī)指令提供給硬件平臺(tái)的CPU,并在硬件平臺(tái)的CPU中連續(xù)地執(zhí)行這些指令。典型的虛擬機(jī)對(duì)于每一字節(jié)碼都需要20-60周期的處理時(shí)間(取決于字節(jié)碼的質(zhì)量和復(fù)雜性)來(lái)執(zhí)行FDD操作系列。
如PCT專利申請(qǐng)第WO9918484號(hào)和第WO9918486號(hào)中所公開(kāi)的那樣,能夠通過(guò)實(shí)施硬件加速器來(lái)實(shí)現(xiàn)處理時(shí)間的進(jìn)一步減少。首先,VMI從存儲(chǔ)器中讀取(取出)一個(gè)字節(jié)碼。然后,VMI查看所取出的字節(jié)碼的多個(gè)屬性(譯碼)。由VMI訪問(wèn)的屬性之一指示該字節(jié)碼是簡(jiǎn)單的還是復(fù)雜的,這決定了VMI是否能夠以硬件來(lái)翻譯該字節(jié)碼。VMI將簡(jiǎn)單的JavaTM字節(jié)碼翻譯為專門的并且優(yōu)化的本機(jī)CPU指令序列,然后由CPU將其取出并執(zhí)行。在CPU執(zhí)行一條指令的同時(shí),VMI取出下一條字節(jié)碼,并將其翻譯為CPU指令。VMI能夠在1-4周期內(nèi)處理簡(jiǎn)單的字節(jié)碼。如果其屬性指示字節(jié)碼是復(fù)雜的,VMI產(chǎn)生一個(gè)本機(jī)CPU指令的類屬序列,從而實(shí)現(xiàn)一個(gè)“軟件陷阱”,其將該復(fù)雜的字節(jié)碼指引給軟件來(lái)翻譯和執(zhí)行。一旦遇到復(fù)雜的字節(jié)碼,VMI就向CPU發(fā)出機(jī)器代碼指令,從而執(zhí)行對(duì)應(yīng)的本機(jī)函數(shù)、即執(zhí)行駐留在CPU中的機(jī)器代碼子程序。作為響應(yīng),CPU中斷執(zhí)行作為先前字節(jié)碼翻譯的結(jié)果的、由VMI產(chǎn)生的本機(jī)指令,并執(zhí)行由該復(fù)雜的字節(jié)碼調(diào)用的本機(jī)函數(shù)。VMI等待來(lái)檢測(cè)從其輸出緩沖器中的新的取出操作,然后恢復(fù)對(duì)所述字節(jié)碼序列的翻譯。盡管VMI訪問(wèn)現(xiàn)有的本機(jī)函數(shù),而不是逐指令地翻譯復(fù)雜的字節(jié)碼,但是它將FDD的操作時(shí)間的影響減少到幾乎0周期,因?yàn)?,每一軟件陷阱的VMI處理(5-20周期)與另一字節(jié)碼的CPU執(zhí)行是同時(shí)發(fā)生的。
在解釋一個(gè)字節(jié)碼序列的同時(shí),虛擬機(jī)可能遇到一個(gè)“遞歸”的復(fù)雜字節(jié)碼。執(zhí)行遞歸字節(jié)碼(RBC)時(shí)出現(xiàn)了難題,這是因?yàn)椋恳籖BC均調(diào)用一個(gè)本機(jī)函數(shù),所述本機(jī)函數(shù)最終產(chǎn)生一個(gè)方法調(diào)用(即,為另一Java字節(jié)碼序列重新啟動(dòng)VMI)。因此,為了對(duì)來(lái)自另一個(gè)序列的字節(jié)碼進(jìn)行譯碼,由RBC調(diào)用的本機(jī)函數(shù)必須訪問(wèn)CPU寄存器中存儲(chǔ)的變量值。本機(jī)函數(shù)通常(但不總是)包括標(biāo)準(zhǔn)指令集,在下文中稱作“前同步碼”和“后同步碼”。標(biāo)準(zhǔn)前同步碼被設(shè)計(jì)成在執(zhí)行子程序以前,保存一些或者全部CPU寄存器的內(nèi)容。被保存的一些內(nèi)容關(guān)注在執(zhí)行本機(jī)函數(shù)期間可能需要被修改的變量值(例如用于重新啟動(dòng)虛擬機(jī)的堆棧指針和返回地址)。然而,通常無(wú)法在由RBC指定的本機(jī)函數(shù)內(nèi)訪問(wèn)這些變量,因?yàn)镽BC方法調(diào)用是在程序設(shè)計(jì)語(yǔ)言的源代碼中定義的,而不是在被要求訪問(wèn)CPU寄存器的機(jī)器代碼中定義的。此外,因?yàn)镽BC方法調(diào)用無(wú)法訪問(wèn)CPU寄存器,所以標(biāo)準(zhǔn)子程序后同步碼無(wú)法將已經(jīng)由RBC方法調(diào)用所修改的變量值寫(xiě)回CPU寄存器中。換言之,因?yàn)镽BC子程序或者由于缺乏環(huán)境設(shè)置(沒(méi)有前同步碼或者后同步碼),或者由于不兼容的環(huán)境設(shè)置與本機(jī)函數(shù)調(diào)用相關(guān)聯(lián),而無(wú)法訪問(wèn)存儲(chǔ)在CPU寄存器中的變量,所以可能無(wú)法正確地執(zhí)行由遞歸字節(jié)碼調(diào)用的子程序??梢酝ㄟ^(guò)實(shí)現(xiàn)手工編碼的軟件來(lái)解決這一難題,所述手工編碼的軟件產(chǎn)生匯編語(yǔ)言,以便為RBC子程序?qū)懭牖蛘咝薷淖兞恐?,然而這一方法需要復(fù)雜的開(kāi)發(fā)工作量。
需要這樣一種解釋編程語(yǔ)言的系統(tǒng),它能準(zhǔn)確地和高效地執(zhí)行遞歸字節(jié)碼指定的指令,同時(shí)更容易實(shí)施。
發(fā)明概要本發(fā)明通過(guò)規(guī)定為由遞歸字節(jié)碼調(diào)用的本機(jī)函數(shù)提供前同步碼和后同步碼并執(zhí)行該本機(jī)函數(shù)的專用函數(shù),來(lái)滿足如上所述的需要。所述前同步碼和后同步碼代替或者修改與本機(jī)函數(shù)相關(guān)聯(lián)的任何標(biāo)準(zhǔn)前同步碼和后同步碼,并使得本機(jī)函數(shù)能夠訪問(wèn)和修改必要的CPU寄存器的內(nèi)容。在另一個(gè)實(shí)施例中,專用函數(shù)能夠從處理器存儲(chǔ)器取出、或者為任何復(fù)雜的字節(jié)碼產(chǎn)生。借此,本發(fā)明維護(hù)了準(zhǔn)確度和速度,同時(shí)簡(jiǎn)化了軟件陷阱或者“VMI加速硬件”方法的實(shí)現(xiàn)。
更具體地說(shuō),本發(fā)明以應(yīng)用編程接口(API)的形式提供VMI支持。當(dāng)VMI在解釋和執(zhí)行字節(jié)碼序列的同時(shí)遇到遞歸的字節(jié)碼的時(shí)候,本發(fā)明的VMI支持軟件使用附加的前同步碼和附加的后同步碼將由遞歸的字節(jié)碼調(diào)用的最高層子程序封裝起來(lái)。當(dāng)該子程序被調(diào)用的時(shí)候,本發(fā)明的所述附加的前同步碼處理CPU寄存器中包含的變量值,從而使CPU將這些值寫(xiě)入可在被調(diào)用的子程序的內(nèi)部來(lái)訪問(wèn)的變量。用這樣的方式,被調(diào)用的子程序能夠修改變量值。本發(fā)明的所述附加的后同步碼在標(biāo)準(zhǔn)子程序后同步碼之后執(zhí)行,從而使CPU取出修改的變量的值并將該值寫(xiě)入CPU寄存器中。由此,當(dāng)CPU恢復(fù)執(zhí)行由隨后的字節(jié)碼翻譯所產(chǎn)生的本機(jī)指令的時(shí)候,所述修改的變量將可用。
簡(jiǎn)要來(lái)講,本發(fā)明包括用于處理虛擬機(jī)指令的方法和系統(tǒng),它在本發(fā)明的示例性的實(shí)施例中是通過(guò)Java程序設(shè)計(jì)語(yǔ)言產(chǎn)生的。在編程級(jí),Java源代碼被編譯為稱作字節(jié)碼的中間語(yǔ)言。字節(jié)碼包括能夠由虛擬機(jī)解釋以便由處理器來(lái)執(zhí)行的虛擬機(jī)指令。依據(jù)本發(fā)明的示例性的實(shí)施例,虛擬機(jī)(在該示例性的實(shí)施例中是VMI)在運(yùn)行時(shí)被初始化。包括所有軟件陷阱的入口地址的表被編譯,其中,軟件陷阱從VM硬件中取消對(duì)于一些復(fù)雜的字節(jié)碼的處理,并且代之以使用軟件來(lái)處理復(fù)雜的字節(jié)碼。參數(shù)被初始化,所述參數(shù)依據(jù)用于每一字節(jié)碼的特征的適當(dāng)?shù)奶幚矸椒▽?duì)字節(jié)碼進(jìn)行分類。舉例來(lái)說(shuō),字節(jié)碼可以被分為簡(jiǎn)單的、復(fù)雜的、或者遞歸的(RBC)。遞歸的字節(jié)碼是字節(jié)碼的第一序列中的虛擬機(jī)指令,它調(diào)用能執(zhí)行字節(jié)碼的第二序列中的一個(gè)或多個(gè)字節(jié)碼,然后返回到字節(jié)碼的第一序列的子程序。遞歸的Java字節(jié)碼的范例是INVOKESTATIC和NEW。那些被配置成用于處理RBC的軟件陷阱配備有適當(dāng)?shù)那巴酱a和后同步碼。
VMI繼續(xù)將一系列字節(jié)碼中的每一個(gè)翻譯為一個(gè)或多個(gè)本機(jī)指令。當(dāng)遇到RBC的時(shí)候,VMI掛起對(duì)字節(jié)碼序列的翻譯,并且通過(guò)適當(dāng)?shù)能浖葳逄幚碓揜BC。一般來(lái)講,軟件陷阱檢索對(duì)應(yīng)于所述RBC的虛擬機(jī)指令的本機(jī)函數(shù)。本發(fā)明的應(yīng)用編程接口(API)規(guī)定了適當(dāng)?shù)淖映绦?,其?zhí)行前同步碼、調(diào)用對(duì)應(yīng)于所述RBC的本機(jī)函數(shù)并且執(zhí)行后同步碼。在執(zhí)行由所述RBC調(diào)用的本機(jī)函數(shù)以前執(zhí)行所述前同步碼。在執(zhí)行由所述RBC調(diào)用的本機(jī)函數(shù)之后并且在所述RBC本機(jī)函數(shù)中的任何RETURN(返回)語(yǔ)句之后執(zhí)行所述后同步碼。如果由所述RBC調(diào)用的子程序包含標(biāo)準(zhǔn)前同步碼和/或標(biāo)準(zhǔn)后同步碼,則本發(fā)明的前同步碼被替代并且通常在執(zhí)行所述標(biāo)準(zhǔn)前同步碼以前執(zhí)行,而且,本發(fā)明中的后同步碼被替代并且通常在執(zhí)行所述標(biāo)準(zhǔn)后同步碼之后執(zhí)行。另外,本發(fā)明的前同步碼和后同步碼可以分別物理地修改或者改寫(xiě)標(biāo)準(zhǔn)前同步碼或者標(biāo)準(zhǔn)后同步碼中包含的一條或多條指令。依據(jù)本發(fā)明的示例性實(shí)施例中的一個(gè)方面,所述前同步碼將值寫(xiě)入可被RBC所調(diào)用的子程序訪問(wèn)的變量。本發(fā)明的后同步碼將由被調(diào)用的子程序所修改的變量值寫(xiě)回到包含該變量的CPU寄存器。然后,由API規(guī)定的子程序開(kāi)始恢復(fù)在所述字節(jié)碼序列的VMI中的翻譯,這將持續(xù)直到遇到另一RBC或者翻譯過(guò)程終止。再有,由API規(guī)定的子程序可以根據(jù)需要執(zhí)行前同步碼和后同步碼,以便使本機(jī)的操作能訪問(wèn)VMI環(huán)境,舉例來(lái)說(shuō),執(zhí)行在本機(jī)的處理開(kāi)始以前的第一前同步碼、處理上述方法以前的第一后同步碼、上述方法執(zhí)行之后的另一前同步碼以及在本機(jī)的處理完成之后的最終后同步碼。
使用諸如C RETURN語(yǔ)句之類的代碼恢復(fù)VMI翻譯。然而,在本發(fā)明的示例性實(shí)施例中,通過(guò)用于釋放被配置為處理RBC的環(huán)境的CPU區(qū)域的恢復(fù)子程序添加由RBC發(fā)出的C RETURN語(yǔ)句,并且將VMI執(zhí)行返回到字節(jié)碼序列中的一個(gè)位置,例如返回到緊跟在最近被翻譯的RBC后面的位置。
本發(fā)明的另一方面是用于執(zhí)行來(lái)自諸如JavaTM之類的解釋語(yǔ)言的虛擬機(jī)指令的系統(tǒng)。該系統(tǒng)包括處理器(CPU)和預(yù)處理器(VMI)、指令存儲(chǔ)器、翻譯器(JVM)以及應(yīng)用編程接口(API)。所述處理器包含并且被配置成能執(zhí)行硬件專用指令,以下簡(jiǎn)稱本機(jī)指令。所述預(yù)處理器是一種虛擬機(jī),例如是VMI,其被配置為從指令存儲(chǔ)器中取出字節(jié)碼并且將所述字節(jié)碼翻譯為本機(jī)的CPU指令。對(duì)于某些類型的字節(jié)碼,API被配置為將值從CPU寄存器寫(xiě)入變量,從而該變量對(duì)上述字節(jié)碼所表示的本機(jī)CPU指令來(lái)說(shuō)是可訪問(wèn)的,并可依據(jù)該字節(jié)碼所表示的本機(jī)CPU指令修改變量值。在本發(fā)明的示例性實(shí)施例中,API規(guī)定了一個(gè)子程序,該子程序在執(zhí)行由該字節(jié)碼調(diào)用的子程序之前實(shí)施前同步碼,在該執(zhí)行之后實(shí)施后同步碼。前同步碼將值從CPU寄存器寫(xiě)到可由該被調(diào)用的子程序訪問(wèn)的變量。在執(zhí)行由該字節(jié)碼表示的指令之后,API通過(guò)執(zhí)行后同步碼子程序而相應(yīng)地修改變量值。
盡管可以與本發(fā)明的API相結(jié)合地實(shí)施軟件陷阱方法以便處理各種類型的字節(jié)碼,但是本發(fā)明的該示例性的實(shí)施例旨在處理遞歸的字節(jié)碼。
本發(fā)明能夠在使用例如由Sun Microsystems制造的JVM之類的虛擬機(jī)來(lái)執(zhí)行JavaTM字節(jié)碼的系統(tǒng)中實(shí)施。然而,本發(fā)明還可以使用例如Microsoft虛擬機(jī)之類的其他JavaTM虛擬機(jī)來(lái)實(shí)施,并且還適用于執(zhí)行諸如Visual Basic、dBASE、BASIC和MSIL(微軟中間語(yǔ)言)之類的其他解釋語(yǔ)言的系統(tǒng)。
本發(fā)明的另外的目的、優(yōu)點(diǎn)和新穎特征部分地將在隨后的說(shuō)明中闡述,同時(shí)部分地在研究了下文時(shí)而對(duì)于本領(lǐng)域中的技術(shù)人員顯而易見(jiàn),或者通過(guò)實(shí)現(xiàn)本發(fā)明而學(xué)到。
附圖簡(jiǎn)述
圖1是一個(gè)方框圖,示出了本發(fā)明的環(huán)境中的示例性實(shí)施例的功能要素。
圖2示出了一個(gè)示例性的字節(jié)碼處理序列。
圖3是依據(jù)本發(fā)明的示例性實(shí)施例的方法的流程圖。
圖4是示出本發(fā)明的示例性實(shí)施例中涉及的操作的相對(duì)時(shí)間關(guān)系的時(shí)間線。
最佳實(shí)施例說(shuō)明現(xiàn)在詳細(xì)參考本發(fā)明的一個(gè)示例性的實(shí)施例,它在附圖中被圖示出,其中類似的附圖標(biāo)記標(biāo)明類似的部件,圖1是本發(fā)明的環(huán)境中的示例性實(shí)施例的方框圖。該環(huán)境的基本部件是硬件平臺(tái)100,它包括處理器110、預(yù)處理器120以及指令存儲(chǔ)器150,它們均通過(guò)系統(tǒng)總線160相連接。預(yù)處理器120包括至少一個(gè)表130和翻譯器140。硬件平臺(tái)100通常包括中央處理單元(CPU)、基本外圍設(shè)備以及操作系統(tǒng)(OS)。本發(fā)明中的處理器110是諸如MIPS、ARM、Inte1TMx86、PowerPCTM或者SPARC型號(hào)微處理器之類的CPU,而且包含并被配置為用于執(zhí)行硬件專用指令,以下簡(jiǎn)稱為本機(jī)指令。在本發(fā)明的示例性實(shí)施例中,所述翻譯器140是JavaTM虛擬機(jī)(JVM),例如是由Sun Microsystems制造的KVM。該示例性實(shí)施例中的預(yù)處理器120最好是在WO9918486中公開(kāi)的虛擬機(jī)解釋器(VMI),并且被配置為從指令存儲(chǔ)器中取出字節(jié)碼并將該字節(jié)碼翻譯為本機(jī)CPU指令。VMI 120是總線160上的外圍設(shè)備,可以充當(dāng)存儲(chǔ)器映像的外圍設(shè)備,其中,將預(yù)定范圍的CPU地址分配給VMI 120。VMI 120管理用于指示指令存儲(chǔ)器150中的當(dāng)前(或者下一個(gè))虛擬機(jī)指令的獨(dú)立虛擬機(jī)指令指針。所述指令存儲(chǔ)器150包含虛擬機(jī)指令,例如包含JavaTM字節(jié)碼170。
所述VMI 120通過(guò)將大部分字節(jié)碼170翻譯為本機(jī)CPU指令的最佳序列,來(lái)加速Java字節(jié)碼170的解釋。然而,VMI 120通過(guò)執(zhí)行軟件陷阱實(shí)施用于處理復(fù)雜字節(jié)碼170的軟件解決方案。一般來(lái)講,本發(fā)明涉及用于擴(kuò)充軟件陷阱的執(zhí)行能力的系統(tǒng)和方法,所述軟件陷阱是以特定類型的復(fù)雜字節(jié)碼即公知的遞歸字節(jié)碼(RBC)230為目標(biāo)的。圖2示出RBC 230的重要特征,那就是對(duì)在字節(jié)碼170的第一系列210中的RBC 230的處理會(huì)導(dǎo)致對(duì)字節(jié)碼170的第二系列220中的字節(jié)碼170的處理以及隨后返回到對(duì)系列210中的字節(jié)碼170的處理。因此,執(zhí)行RBC 230會(huì)產(chǎn)生稱為“方法”的字節(jié)碼子程序。注意,如果系列210等于系列220,則系列210構(gòu)成“遞歸方法”,該術(shù)語(yǔ)不等于“遞歸字節(jié)碼”。通過(guò)定義一個(gè)包含軟件陷阱的通用結(jié)構(gòu)規(guī)范的API,本發(fā)明可支持用于處理RBC 230的軟件陷阱的一般操作。
根據(jù)本發(fā)明并且參考圖3,在運(yùn)行時(shí)初始化VMI 120,這項(xiàng)處理包括設(shè)置VMI 120的翻譯控制寄存器。表130被編譯,該表包括用于所有軟件陷阱的入口地址。參數(shù)被初始化,該參數(shù)允許VMI依據(jù)字節(jié)碼的屬性處理每一字節(jié)碼。當(dāng)字節(jié)碼是復(fù)雜的時(shí)候,VMI通過(guò)適當(dāng)?shù)能浖葳逄幚碓撟止?jié)碼。根據(jù)本發(fā)明,作為共同形成軟件陷阱的本機(jī)指令的類屬序列的一部分,被配置為處理RBC 230的那些軟件陷阱涉及適當(dāng)?shù)那巴酱a和后同步碼,所述前同步碼和后同步碼可以通過(guò)VMI 120產(chǎn)生,但是在該示例性實(shí)施例中,它們被存儲(chǔ)在處理器存儲(chǔ)器中、在處理器存儲(chǔ)器中實(shí)例化并且從處理器存儲(chǔ)器中執(zhí)行。另外,所述前同步碼和后同步碼能夠被存儲(chǔ)在VMI內(nèi)的表130中。因此在API實(shí)現(xiàn)方式中,一旦系統(tǒng)初始化,每一RBC軟件陷阱進(jìn)入點(diǎn)就會(huì)被編程為指向本機(jī)子程序(“PPA子程序”)。所述PPA子程序包括執(zhí)行前同步碼和后同步碼,并且已經(jīng)被實(shí)例化為含有到由RBC調(diào)用的本機(jī)函數(shù)(或多個(gè)本機(jī)函數(shù))的跳轉(zhuǎn)。
作為本發(fā)明的操作的一個(gè)例子,VMI 120繼續(xù)將字節(jié)碼170的系列210中的每一個(gè)翻譯為一個(gè)或多個(gè)本機(jī)指令。參考圖2,字節(jié)碼B0至B2是非遞歸的,因此VMI 120僅從指令存儲(chǔ)器150中取出B0至B2、選擇為每一字節(jié)碼170定義的本機(jī)指令或者多條指令并且將這些指令提供給處理器110來(lái)執(zhí)行。Bn是RBC 230,它的執(zhí)行可能引起來(lái)自第二序列220的一個(gè)或多個(gè)字節(jié)碼(在這里是Bo至Bs)的執(zhí)行。注意在Java中,方法調(diào)用始終進(jìn)入第一字節(jié)碼處的序列,然而其他語(yǔ)言可能不允許在沿一個(gè)指令序列的其他位置處進(jìn)入,這并沒(méi)有技術(shù)上的原因。在執(zhí)行第二序列220中的字節(jié)碼之后,Bs是一個(gè)RETURN字節(jié)碼,它使字節(jié)碼執(zhí)行以便在第一序列210中的某處繼續(xù)。正如不是序列220的最后字節(jié)碼的Bs指示的那樣,Java方法能夠具有幾個(gè)出口點(diǎn)(RETURN字節(jié)碼)。在Bs之后,執(zhí)行通常在第一序列210中Bn+1處繼續(xù),但是并不一定非得是這樣。
如圖3中框310所示,VMI 120在進(jìn)行到框320以取出每一字節(jié)碼170之前對(duì)虛擬機(jī)計(jì)數(shù)器加1。在框330中,VMI 120通過(guò)根據(jù)字節(jié)碼170確定字節(jié)碼170是否為“簡(jiǎn)單的”——即是否存在由用于字節(jié)碼170的至少一個(gè)本機(jī)指令構(gòu)成的硬件翻譯——而對(duì)字節(jié)碼170譯碼。如果存在用于字節(jié)碼170的當(dāng)前硬件翻譯,則該方法前進(jìn)到框370并且相應(yīng)地處理所述簡(jiǎn)單字節(jié)碼。如果沒(méi)有存在用于該字節(jié)碼170的硬件翻譯,則該字節(jié)碼170是復(fù)雜的。在框340中,VMI對(duì)照表140中的參數(shù)檢驗(yàn)字節(jié)碼170,所述參數(shù)可識(shí)別用于復(fù)雜字節(jié)碼的本機(jī)指令的適當(dāng)類屬序列。VMI 120掛起字節(jié)碼170的序列210的翻譯,并且依據(jù)組成適當(dāng)軟件陷阱的這一類屬序列來(lái)處理復(fù)雜的字節(jié)碼,其地址位于表140中。軟件陷阱通常通過(guò)檢索對(duì)應(yīng)于字節(jié)碼170的本機(jī)函數(shù)并且將該本機(jī)函數(shù)調(diào)度給CPU 110、而不是通過(guò)逐指令地解釋由字節(jié)碼170表示的子程序來(lái)處理復(fù)雜的字節(jié)碼。本發(fā)明的應(yīng)用編程接口(API)是一項(xiàng)技術(shù)規(guī)范,其規(guī)定了在實(shí)施處理RBC時(shí)擴(kuò)充該軟件陷阱方法所需的功能,并且規(guī)定了怎樣訪問(wèn)該功能。如果如框380中假定的那樣,字節(jié)碼170不是遞歸的,則依據(jù)在框340中識(shí)別出的適當(dāng)軟件陷阱,在框384中進(jìn)行本機(jī)操作,直到如在框368中那樣將控制權(quán)返回到VMI。如果如在框350中假定的那樣,字節(jié)碼170是遞歸的,則本發(fā)明的API規(guī)定了一個(gè)適當(dāng)?shù)腜PA子程序360,其配置用于RBC 230的環(huán)境,從而,由RBC 230表示的本機(jī)函數(shù)能夠訪問(wèn)包含有執(zhí)行子程序所必需的變量值的CPU 110中的寄存器。必需的變量可以包括指向常數(shù)池、堆棧、本機(jī)和程序代碼的指針。在CPU在框364中開(kāi)始處理對(duì)應(yīng)于RBC 230的本機(jī)操作之前,在框362中,由API規(guī)定的PPA子程序360執(zhí)行前同步碼。本機(jī)的處理繼續(xù),直到在框364中遇到本機(jī)環(huán)境訪問(wèn)函數(shù)為止,這就會(huì)重啟動(dòng)VMI。在框365中、改變VMI的參數(shù)來(lái)處理方法220,直到RETURN字節(jié)碼使任何剩余本機(jī)處理的恢復(fù)(框366)為止。在本機(jī)處理期間遇到另一RETURN字節(jié)碼則把控制權(quán)移回到PPA子程序,在框367中為該P(yáng)PA子程序執(zhí)行后同步碼,并且,在完成PPA子程序360的執(zhí)行之后,在框368中、將控制權(quán)返回到VMI以便根據(jù)新參數(shù)進(jìn)行處理。適當(dāng)PPA子程序360的地址被存儲(chǔ)在表140中并且對(duì)應(yīng)于所述被配置為處理遞歸的字節(jié)碼170的軟件陷阱。在執(zhí)行由所述RBC 230調(diào)用的本機(jī)操作(本機(jī)處理)以前執(zhí)行所述前同步碼。如果一個(gè)標(biāo)準(zhǔn)前同步碼與由RBC 230調(diào)用的本機(jī)函數(shù)相關(guān)聯(lián),則執(zhí)行本發(fā)明的前同步碼,以便或者替換、或者修改與本機(jī)函數(shù)相關(guān)聯(lián)的標(biāo)準(zhǔn)前同步碼。在執(zhí)行由所述RBC 230調(diào)用的本機(jī)函數(shù)之后執(zhí)行所述后同步碼。類似地,在RBC本機(jī)函數(shù)中的C RETURN語(yǔ)句之后執(zhí)行本發(fā)明的后同步碼,以便或者替換、或者修改與由所述RBC調(diào)用的本機(jī)函數(shù)相關(guān)聯(lián)的標(biāo)準(zhǔn)后同步碼(如果存在標(biāo)準(zhǔn)后同步碼的話)。
依據(jù)本發(fā)明的示例性實(shí)施例的一個(gè)方面,所述前同步碼將值寫(xiě)入表示諸如堆棧指針之類的某些重要指針的變量,借此使得由RBC 230調(diào)用的本機(jī)函數(shù)能夠訪問(wèn)該指針。例如,為了提供對(duì)由RBC 230調(diào)用的本機(jī)函數(shù)的環(huán)境的訪問(wèn),定義了幾個(gè)函數(shù)void*vmi_bcc(void*jfp);void*vmi_object(void*jfp);void*vmi_jsp(void*jfp);void*vmi_cpd(void*jfp);void*vmi_cpt(void*jfp);void*vmi_bcc(void*jfp);類似地,以下函數(shù)給出對(duì)常數(shù)池的訪問(wèn)<t>vmi_cpdEntry(void*jfp,unsigned n,<t>)unsigned char vmi_cptEntry(void*jfp,unsigned n)以下函數(shù)給出對(duì)當(dāng)前和下一字節(jié)碼170的訪問(wèn)unsigned char vmi_bc(void*jfp,n)unsigned char vmi_s hortPar(void* jfp,n)unsigned char vmi_3bytePar(void* jfp,n)unsigned char vmi_wordPar(void*jfp,n)以下函數(shù)用于訪問(wèn)JavaTM堆棧<t>vmi_stkEntry(void*jfp,n,<t>)現(xiàn)在參考圖4,VMI的主動(dòng)翻譯(Java字節(jié)碼處理)功能是由Java虛擬機(jī)(JVM)標(biāo)準(zhǔn)規(guī)定的。圖4表示假定的字節(jié)碼處理時(shí)間線,其中間隔T0-T12表示不一定相等的任意時(shí)間的時(shí)間段。在間隔T0期間,VMI使用本發(fā)明的API作為接口來(lái)翻譯字節(jié)碼,直到遇到遞歸的字節(jié)碼(RBC)230為止。交叉參照?qǐng)D2中的假定圖表,VMI處理字節(jié)碼B0至B2,然后遇到Bn。當(dāng)識(shí)別出適當(dāng)?shù)腞BC軟件陷阱(由API指示出)并且執(zhí)行對(duì)應(yīng)的PPA子程序的時(shí)候,RBC 230(Bn)使得控制權(quán)被傳遞到間隔T1中的本機(jī)處理。在間隔T2至T10中,軟件陷阱執(zhí)行由RBC 230調(diào)用的本機(jī)函數(shù),從而訪問(wèn)(在間隔T4中)由前同步碼初始化的環(huán)境。例如,根據(jù)需要,在間隔T5和T6中重復(fù)間隔T3和T4的處理周期(專用于RBC 230的本機(jī)操作和對(duì)環(huán)境訪問(wèn)函數(shù)的調(diào)用)。本機(jī)函數(shù)最后(可能在數(shù)以千計(jì)的本機(jī)執(zhí)行循環(huán)之后)產(chǎn)生本機(jī)環(huán)境訪問(wèn)函數(shù),它在間隔T7重新啟動(dòng)VMI。VMI主動(dòng)地為新調(diào)用的方法處理字節(jié)碼(假定的字節(jié)碼Bo至Br),直到在間隔T7遇到一個(gè)RETURN字節(jié)碼(Bs)為止,這就會(huì)將控制權(quán)返回給本機(jī)函數(shù)處理。在間隔T8中,或者通過(guò)VMI 120硬件、或者通過(guò)軟件(經(jīng)由API并且經(jīng)由諸如C程序設(shè)計(jì)語(yǔ)言RETURN語(yǔ)句之類的代碼實(shí)現(xiàn)的),將控制權(quán)完全從VMI 120返回到本機(jī)處理。本機(jī)處理在間隔T10繼續(xù),這時(shí)另一C RETURN語(yǔ)句將控制轉(zhuǎn)移給PPA子程序,以致在間隔T11中執(zhí)行后同步碼。在控制權(quán)在時(shí)間間隔T12中重新返回到VMI 120(在假定的字節(jié)碼Bn+1處)之后,本發(fā)明的后同步碼將由RBC子程序修改的變量值寫(xiě)回到包含這些變量的CPU寄存器中。根據(jù)圖5中所示的另一個(gè)的實(shí)施例,可以執(zhí)行前同步碼和后同步碼,以便實(shí)現(xiàn)處理新調(diào)用的方法(示例性的字節(jié)碼Bo至Bs)所需的環(huán)境改變,例如,改變本機(jī)處理在間隔T1開(kāi)始之前的第一前同步碼、所述方法在T9至T11中被處理之前的第一后同步碼、在執(zhí)行該方法之后的間隔T12中的另一前同步碼、以及在本機(jī)處理完成之后的間隔T16中的最后的后同步碼。
再次參看圖3,在框368中,由API規(guī)定的PPA子程序還被配置成開(kāi)始恢復(fù)在字節(jié)碼170的序列210的VMI120中的翻譯?;蛘咄ㄟ^(guò)VMI120或者通過(guò)API實(shí)現(xiàn)方式、并且以硬件或者以軟件形式的實(shí)現(xiàn)方式,將控制權(quán)完全地從VMI120返回到本機(jī)處理。這一恢復(fù)例程的軟件實(shí)現(xiàn)方式是通過(guò)諸如C程序設(shè)計(jì)語(yǔ)言RETURN語(yǔ)句之類的代碼實(shí)現(xiàn)的,它通常包括在本機(jī)函數(shù)中。在從本機(jī)處理返回之后,環(huán)境被例如vmi_freeFrame破壞,從而,控制權(quán)能夠被傳遞回到VMI 120。環(huán)境的破壞釋放了CPU 110中的被配置為用于處理RBC 230的環(huán)境的區(qū)域,并且將VMI 120翻譯返回到字節(jié)碼170的序列210中的位置,例如(但不一定)返回到緊跟在最近翻譯的RBC 230之后的位置。
當(dāng)在框310中將控制權(quán)返回到VMI 120的時(shí)候,虛擬機(jī)計(jì)數(shù)器加1,并且,VMI 120取出下一字節(jié)碼170。因此,由VMI 120進(jìn)行的翻譯將繼續(xù),直到遇到另一RBC 230或者翻譯處理終止(例如,VMI遇到另一復(fù)雜的字節(jié)碼,或者在字節(jié)碼之中運(yùn)行以便處理)為止。
鑒于上述內(nèi)容,將被理解的是本發(fā)明提供了一種系統(tǒng)和方法,用于支持處理虛擬機(jī)指令的軟件陷阱方法,以便方便地實(shí)現(xiàn)用于準(zhǔn)確和有效地處理遞歸虛擬機(jī)指令的方法。此外,仍應(yīng)理解的是上文僅僅涉及了本發(fā)明的示例性實(shí)施例,而在不背離如下列權(quán)利要求書(shū)中定義的本發(fā)明的精神和范圍的情況下,可以對(duì)其作出很多改變。
權(quán)利要求
1.一種處理虛擬機(jī)指令的方法,包括初始化參數(shù),以便識(shí)別具有特定特征集合的虛擬機(jī)指令的子集;將一批所述虛擬機(jī)指令翻譯為可由處理器執(zhí)行的本機(jī)指令,直到遇到所述識(shí)別出的虛擬機(jī)指令子集中的一個(gè)成員為止;一旦遇到所述識(shí)別出的虛擬機(jī)指令子集中的一個(gè)成員,就掛起對(duì)所述批虛擬機(jī)指令的翻譯;實(shí)現(xiàn)接口,其中所述接口規(guī)定了本機(jī)處理器指令的集合,該指令集合可以在執(zhí)行由所述識(shí)別出的虛擬機(jī)指令子集的所述成員表示的本機(jī)處理器指令之前,執(zhí)行前同步碼;從與由所述識(shí)別出的虛擬機(jī)指令子集的所述成員表示的指令相對(duì)應(yīng)的處理器中檢索本機(jī)函數(shù);執(zhí)行檢索出的本機(jī)指令;在執(zhí)行由所述識(shí)別出的虛擬機(jī)指令子集的所述成員表示的本機(jī)指令之后,執(zhí)行后同步碼;以及恢復(fù)在所述批虛擬機(jī)指令的虛擬機(jī)中的翻譯,其中,執(zhí)行繼續(xù)直到遇到所述識(shí)別出的虛擬機(jī)指令子集的另一成員為止;以及執(zhí)行所述本機(jī)處理器指令集合。
2.如權(quán)利要求1所述的方法,進(jìn)一步包括在執(zhí)行檢索出的構(gòu)成一個(gè)方法的本機(jī)指令之前執(zhí)行后同步碼,其中,所述后同步碼包括本機(jī)指令,所述本機(jī)指令用于修改處理器的寄存器內(nèi)的變量值,以便實(shí)現(xiàn)執(zhí)行該方法所需要的環(huán)境改變;以及在執(zhí)行檢索出的構(gòu)成一個(gè)方法的本機(jī)指令之后執(zhí)行前同步碼,其中,所述前同步碼包括將值從處理器中的寄存器寫(xiě)入可由在執(zhí)行該方法之后執(zhí)行的本機(jī)指令訪問(wèn)的變量中。
3.如權(quán)利要求1所述的方法,其中,所述前同步碼和所述后同步碼是由虛擬機(jī)產(chǎn)生的。
4.如權(quán)利要求1所述的方法,其中,所述前同步碼和所述后同步碼是從處理器存儲(chǔ)器中檢索出的。
5.如權(quán)利要求1所述的方法,其中,所述前同步碼包括將值從處理器中的寄存器寫(xiě)入變量的本機(jī)指令,其中,所述變量可以被由所述識(shí)別出的虛擬機(jī)指令子集表示的指令訪問(wèn)。
6.如權(quán)利要求1所述的方法,其中,所述后同步碼包括本機(jī)指令,所述本機(jī)指令根據(jù)被由所述識(shí)別出的虛擬機(jī)指令子集表示的指令將處理器的寄存器內(nèi)的變量值修改到處理器的寄存器中。
7.如權(quán)利要求1所述的方法,其中,所述前同步碼和所述后同步碼替換與所述識(shí)別出的虛擬機(jī)指令子集的所述成員相關(guān)聯(lián)的沖突指令。
8.如權(quán)利要求1所述的方法,其中,所述前同步碼和所述后同步碼修改與所述識(shí)別出的虛擬機(jī)指令子集的所述成員相關(guān)聯(lián)的沖突指令。
9.如權(quán)利要求1所述的方法,進(jìn)一步包括開(kāi)始恢復(fù)子程序,其中,所述恢復(fù)子程序包括釋放由前同步碼和后同步碼訪問(wèn)過(guò)的處理器中的寄存器;以及指引虛擬機(jī)在所述批虛擬機(jī)指令中的一處位置恢復(fù)翻譯。
10.一種處理虛擬機(jī)指令的方法,包括配置中央處理單元中的環(huán)境;實(shí)現(xiàn)用于規(guī)定本機(jī)處理器指令集合的接口,所述本機(jī)處理器指令集合包括在執(zhí)行由所述虛擬機(jī)指令表示的本機(jī)處理器指令之前執(zhí)行前同步碼;從與由所述虛擬機(jī)指令表示的指令相對(duì)應(yīng)的處理器中檢索本機(jī)函數(shù);執(zhí)行檢索出的本機(jī)指令;在執(zhí)行由所述虛擬機(jī)指令表示的本機(jī)指令之后執(zhí)行后同步碼;以及釋放所配置的環(huán)境;以及執(zhí)行所述本機(jī)處理器指令集合。
11.一種用于處理虛擬機(jī)指令的設(shè)備,包括處理器(110),它具有本機(jī)指令集,并且被配置為執(zhí)行本機(jī)指令;指令存儲(chǔ)器(150),它被配置為存儲(chǔ)虛擬機(jī)指令;預(yù)處理器(120),其中,所述預(yù)處理器(120)是虛擬機(jī),它被配置為從指令存儲(chǔ)器(150)中取出虛擬機(jī)指令,并且被配置為將取出的虛擬機(jī)指令翻譯為可由處理器執(zhí)行的本機(jī)指令;以及所述指令存儲(chǔ)器(150)和所述處理器(110)之間的接口,它被配置為啟動(dòng)一個(gè)子程序,該子程序?qū)⑺鎏幚砥鲉卧?100)中的可被由虛擬機(jī)指令表示的指令所訪問(wèn)的變量的值寫(xiě)入寄存器,發(fā)出對(duì)應(yīng)于由虛擬機(jī)指令表示的指令的本機(jī)子程序調(diào)用,依據(jù)所述虛擬機(jī)指令修改所述變量的值并且將控制權(quán)返回給所述預(yù)處理器。
12.一種用于執(zhí)行被虛擬機(jī)指令調(diào)用的本機(jī)處理器子程序的方法,包括在執(zhí)行所調(diào)用的子程序之前執(zhí)行本機(jī)指令的前同步碼集合,其中,所述前同步碼被配置為將值從處理器的寄存器中寫(xiě)入可由所調(diào)用的子程序訪問(wèn)的變量;以及在執(zhí)行所調(diào)用的子程序之后執(zhí)行本機(jī)指令的后同步碼集合,其中,所述后同步碼被配置為根據(jù)所調(diào)用的子程序修改處理器的寄存器中的變量值。
全文摘要
一種用于處理虛擬機(jī)指令的系統(tǒng)和方法,其支持軟件陷阱方法。應(yīng)用程序編程接口(API)規(guī)定用于軟件陷阱的附加功能,軟件陷阱從虛擬機(jī)硬件中消除對(duì)于遞歸虛擬機(jī)指令的處理,并代之以使用軟件處理遞歸虛擬機(jī)指令。所述附加功能包括對(duì)用于處理遞歸虛擬機(jī)指令的環(huán)境進(jìn)行配置,這使得虛擬機(jī)指令能夠訪問(wèn)CPU寄存器,以便根據(jù)需要檢索和修改變量的值;當(dāng)完成遞歸虛擬機(jī)指令的處理的時(shí),釋放所配置的環(huán)境;以及,將控制權(quán)返回給用于處理非遞歸虛擬機(jī)指令的虛擬機(jī)。
文檔編號(hào)G06F9/45GK1596398SQ02818700
公開(kāi)日2005年3月16日 申請(qǐng)日期2002年9月6日 優(yōu)先權(quán)日2001年9月25日
發(fā)明者M·M·林德維, S·本-耶德 申請(qǐng)人:皇家飛利浦電子股份有限公司