專利名稱:虛擬機(jī)調(diào)用本地接口的方法及裝置的制作方法
虛擬機(jī)調(diào)用本地接口的方法及裝置
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)技術(shù),特別是涉及一種虛擬機(jī)調(diào)用本地接口的方法及裝置。背景技術(shù):
虛擬機(jī)(Virtual Machine)是運(yùn)行在物理計(jì)算機(jī)上的一個(gè)應(yīng)用程序,是通過相關(guān)的虛擬機(jī)軟件在物理計(jì)算機(jī)上所模擬出的計(jì)算機(jī)系統(tǒng),并像真正的計(jì)算機(jī)那樣工作。虛擬機(jī)可以分為Java虛擬機(jī)以及開源虛擬機(jī)等。在實(shí)際使用過程中,Java虛擬機(jī)借助Java指令集中本地調(diào)用的“本地接口特定指令”來實(shí)現(xiàn)內(nèi)部運(yùn)行的Java代碼與其它語言編寫的應(yīng)用程序和庫進(jìn)行交互,使得任意一個(gè)本地應(yīng)用程序均能嵌入Java虛擬機(jī)中?!氨镜亟涌谔囟ㄖ噶睢笔荍ava指令集中專門定義的 “本地編程接口,,特定指令,必須事先在Java指令集中專門定義。但是,Java指令集歸屬于Sim Microsystems公司,使用Java指令集涉及了著作權(quán)的問題,并且必須事先在Java指令集中進(jìn)行定義,在調(diào)用本地應(yīng)用程序的過程中非常地不方便,限制了虛擬機(jī)反應(yīng)速度的提高。開源虛擬機(jī)大多沒有本地接口特定指令,例如VirtualGBA、Skyeye。這些開源虛擬機(jī)實(shí)際上是通過軟件去實(shí)現(xiàn)目標(biāo)CPU (Central Processing Unit,中央處理器)的指令集、 存儲(chǔ)空間和寄存器等。某個(gè)開源虛擬機(jī)可以模擬ARM (Advanced RISC Machines)平臺(tái)以提供在計(jì)算機(jī)環(huán)境下的模擬實(shí)驗(yàn)。目標(biāo)CPU集成了中央處理器、存儲(chǔ)器和外設(shè)。外設(shè)可以是LCD (Liquid Crystal Display,液晶顯示器)控制器、輸入輸出設(shè)備和定時(shí)器等。例如,此開源虛擬機(jī)中的應(yīng)用程序在訪問顯示屏?xí)r,應(yīng)用程序會(huì)將內(nèi)容直接寫入目標(biāo)CPU的內(nèi)存或寄存器中,而目標(biāo)CPU的內(nèi)存或寄存器對于虛擬機(jī)來說會(huì)映射至宿主機(jī)的內(nèi)存中,進(jìn)而虛擬機(jī)在一定時(shí)間內(nèi)刷新顯示到顯示屏中。此開源虛擬機(jī)在模擬應(yīng)用程序時(shí)需要將相應(yīng)的操作與物理計(jì)算機(jī)中的設(shè)備結(jié)合起來進(jìn)行模擬,大大降低了反應(yīng)速度。
發(fā)明內(nèi)容基于此,有必要提供一種能提高反應(yīng)速度的虛擬機(jī)調(diào)用本地接口的方法。此外,還有必要提供一種能提高反應(yīng)速度的虛擬機(jī)調(diào)用本地接口的裝置。一種虛擬機(jī)調(diào)用本地接口的方法,包括以下步驟載入指令;解釋所述指令以及指令參數(shù);判斷所述指令是否為調(diào)用指令,如果是,則判斷調(diào)用的目標(biāo)地址是否為本地接口地址,若是,則讀取所述指令參數(shù);根據(jù)所述指令參數(shù)跳轉(zhuǎn)執(zhí)行對應(yīng)的本地接口函數(shù)。優(yōu)選地,還包括當(dāng)所述指令不是調(diào)用指令或調(diào)用的目標(biāo)地址不是本地接口地址時(shí),解釋并執(zhí)行所述指令。優(yōu)選地,所述根據(jù)所述指令參數(shù)跳轉(zhuǎn)執(zhí)行對應(yīng)的本地接口函數(shù)的步驟之后還包括將所述本地接口函數(shù)的執(zhí)行結(jié)果存儲(chǔ)于所述指令參數(shù)中。優(yōu)選地,所述將所述本地接口函數(shù)的執(zhí)行結(jié)果存儲(chǔ)于所述的指令參數(shù)中的步驟之后還包括執(zhí)行返回指令的步驟。一種虛擬機(jī)調(diào)用本地接口的裝置,至少包括指令載入模塊,用于載入指令;指令解釋模塊,用于解釋所述指令以及指令參數(shù);判斷處理模塊,用于判斷所述指令是否為調(diào)用指令,如果是,則進(jìn)一步判斷調(diào)用的目標(biāo)地址是否為本地接口地址,若是,則讀取所述指令參數(shù);本地實(shí)現(xiàn)模塊,用于根據(jù)所述指令參數(shù)跳轉(zhuǎn)執(zhí)行對應(yīng)的本地接口函數(shù)。優(yōu)選地,還包括執(zhí)行模塊,用于當(dāng)所述指令不是調(diào)用指令或調(diào)用的目標(biāo)地址不是本地接口地址時(shí)解釋并執(zhí)行所述指令。優(yōu)選地,所述本地實(shí)現(xiàn)模塊包括本地執(zhí)行單元,用于讀取指令參數(shù),并根據(jù)所述指令參數(shù)執(zhí)行對應(yīng)的本地接口函數(shù);結(jié)果存儲(chǔ)單元,用于將所述本地接口函數(shù)的執(zhí)行結(jié)果存儲(chǔ)于所述指令參數(shù)中。優(yōu)選地,所述本地實(shí)現(xiàn)模塊還包括返回執(zhí)行模塊,用于執(zhí)行返回指令。上述虛擬機(jī)調(diào)用本地接口的方法及裝置對于程序中需要進(jìn)行本地調(diào)用的指令通過直接讀取該指令參數(shù)來執(zhí)行該指令,該方法的實(shí)現(xiàn)不依賴某種特定指令集,特別是不依賴他方有知識(shí)產(chǎn)權(quán)的指令集,從而使虛擬機(jī)調(diào)用本地接口的方法更靈活,不需要通過真實(shí)硬件進(jìn)行指令參數(shù)的讀取以及執(zhí)行指令,極大地提高了反應(yīng)速度。
圖1為一個(gè)實(shí)施例中虛擬機(jī)調(diào)用本地接口的方法的流程圖;圖2為一個(gè)實(shí)施例中虛擬機(jī)調(diào)用本地接口的裝置的結(jié)構(gòu)示意圖;圖3為另一個(gè)實(shí)施例中虛擬機(jī)調(diào)用本地接口的裝置的結(jié)構(gòu)示意圖;圖4為一個(gè)實(shí)施例中本地實(shí)現(xiàn)模塊的結(jié)構(gòu)示意圖。
具體實(shí)施方式圖1示出了一個(gè)實(shí)施例中虛擬機(jī)調(diào)用本地接口的方法,包括以下步驟步驟S101,載入指令。本實(shí)施例中,應(yīng)用程序在虛擬機(jī)中是以指令的形式表達(dá)的, 虛擬機(jī)通過執(zhí)行指令來實(shí)現(xiàn)應(yīng)用程序的功能。對于函數(shù)調(diào)用,應(yīng)用程序進(jìn)入調(diào)用的函數(shù)時(shí), 被編譯為調(diào)用指令,此時(shí),將該函數(shù)所需要的參數(shù)放入堆?;螂S機(jī)存儲(chǔ)器中,進(jìn)而產(chǎn)生指令完成指令的載入。
步驟S102,解釋指令以及指令參數(shù)。本實(shí)施例中,例如,對于“call gui_init”的指令,在虛擬機(jī)中是以“OxAB,”的形式出現(xiàn)的,因此經(jīng)過解釋可以獲知,OxAB為call指令, Ox⑶,oxEF為gui_init函數(shù)的目標(biāo)地址,即調(diào)用的目標(biāo)地址。步驟S103,判斷指令是否為調(diào)用指令,如果是,則進(jìn)入步驟S105,如果否,則進(jìn)入步驟S106。本實(shí)施例中,判斷指令的類型是否為調(diào)用指令,如果是,則需要進(jìn)入進(jìn)一步的判斷,以獲知該指令所調(diào)用的目標(biāo)地址是否為本地接口地址。步驟S105,判斷調(diào)用的目標(biāo)地址是否為本地接口地址,若否,則進(jìn)入步驟S106,若是,則進(jìn)入步驟S107。本實(shí)施例中,本地調(diào)用可以是虛擬機(jī)對顯示屏、定時(shí)器、輸入輸出設(shè)備等外設(shè)的訪問,也可以是對物理計(jì)算機(jī)上其他本地應(yīng)用程序的訪問,即對本地接口地址的訪問,例如,Java虛擬機(jī)中的源代碼為Java代碼,Java虛擬機(jī)是以Java代碼的形式運(yùn)行所有指令的,物理計(jì)算機(jī)上為其它語言(如C語言)編寫的應(yīng)用程序和庫,通過本地調(diào)用允許物理計(jì)算機(jī)中的應(yīng)用程序和庫嵌入到Java虛擬機(jī)中,實(shí)現(xiàn)已有應(yīng)用程序和庫支持Java代碼,而不必花費(fèi)大量的時(shí)間與Java虛擬機(jī)的源代碼相鏈接,也不需要通過Java指令集等有知識(shí)產(chǎn)權(quán)的指令集來實(shí)現(xiàn)虛擬機(jī)的本地調(diào)用。步驟S106,解釋并執(zhí)行該指令。本實(shí)施例中,經(jīng)過對該指令中目標(biāo)地址的判斷可以獲知該指令的執(zhí)行不需要進(jìn)行本地調(diào)用,因此通過虛擬機(jī)直接解釋并執(zhí)行該指令即可,正常運(yùn)行該指令。步驟S107,讀取該指令參數(shù)。本實(shí)施例中,讀取該指令參數(shù)的步驟為通過虛擬機(jī)讀取該指令參數(shù)。從虛擬機(jī)的隨機(jī)存儲(chǔ)器或當(dāng)前的堆棧中讀取執(zhí)行該指令所需要的指令參數(shù)。步驟S109,根據(jù)指令參數(shù)跳轉(zhuǎn)執(zhí)行對應(yīng)的本地接口函數(shù)。本實(shí)施例中,根據(jù)讀取到的指令參數(shù)虛擬機(jī)可以找到對應(yīng)的本地接口函數(shù),進(jìn)而跳轉(zhuǎn)執(zhí)行該本地接口函數(shù)。虛擬機(jī)在讀取所需的指令參數(shù)后直接跳轉(zhuǎn)執(zhí)行對應(yīng)的本地接口函數(shù),大大地提高了虛擬機(jī)的應(yīng)用程序訪問外設(shè)以及本地調(diào)用的速度,不需要進(jìn)行事先定義以及依賴于JAVA指令集及其它類似的指令集,大大增強(qiáng)了虛擬機(jī)的靈活性。步驟Sl 10,將本地接口函數(shù)的執(zhí)行結(jié)果存儲(chǔ)于指令參數(shù)中,并執(zhí)行返回指令。本實(shí)施例中,將執(zhí)行結(jié)果存儲(chǔ)于調(diào)用該本地接口函數(shù)時(shí)所傳入的指令參數(shù)中,通過返回指令的執(zhí)行返回虛擬機(jī)的應(yīng)用程序中繼續(xù)執(zhí)行其它指令。圖2示出了一個(gè)實(shí)施例中的虛擬機(jī)調(diào)用本地接口的裝置,包括指令載入模塊10、 指令解釋模塊30、判斷處理模塊50以及本地實(shí)現(xiàn)模塊70。指令載入模塊10,用于載入指令。本實(shí)施例中,應(yīng)用程序在虛擬機(jī)中是以指令的形式表達(dá)的,虛擬機(jī)通過執(zhí)行指令來實(shí)現(xiàn)應(yīng)用程序的功能。對于函數(shù)調(diào)用,應(yīng)用程序進(jìn)入調(diào)用的函數(shù)時(shí),被指令載入模塊10編譯為調(diào)用指令,此時(shí),指令載入模塊10將該函數(shù)所需要的參數(shù)放入堆棧或隨機(jī)存儲(chǔ)器中,進(jìn)而產(chǎn)生指令完成指令的載入。指令解釋模塊30,用于解釋指令以及指令參數(shù)。本實(shí)施例中,例如,對于“call gui_init”的指令,在虛擬機(jī)中是以“OxAB,”的形式出現(xiàn)的,因此經(jīng)過指令解釋模塊30解釋可以獲知,OxAB為call指令,Ox⑶,oxEF為gui_init函數(shù)的目標(biāo)地址,即調(diào)用的目標(biāo)地址。判斷處理模塊50,用于判斷指令是否為調(diào)用指令,如果是,則進(jìn)一步驟判斷調(diào)用的目標(biāo)地址是否為本地接口地址,若是,則讀取指令參數(shù)。本實(shí)施例中,判斷處理模塊50判斷指令的類型是否為調(diào)用指令,如果是,則需要進(jìn)入進(jìn)一步的判斷,以獲知該指令所調(diào)用的目標(biāo)地址是否為本地接口地址。 本地調(diào)用可以是虛擬機(jī)對顯示屏、定時(shí)器、輸入輸出設(shè)備等外設(shè)的訪問,也可以是對物理計(jì)算機(jī)上其他本地應(yīng)用程序的訪問,即對本地接口地址的訪問,例如,Java虛擬機(jī)中的源代碼為Java代碼,Java虛擬機(jī)是以Java代碼的形式運(yùn)行所有指令的,物理計(jì)算機(jī)上為其它語言(如C語言)編寫的應(yīng)用程序和庫,通過本地調(diào)用允許物理計(jì)算機(jī)中的應(yīng)用程序和庫嵌入到Java虛擬機(jī)中,實(shí)現(xiàn)已有應(yīng)用程序和庫支持Java代碼,而不必花費(fèi)大量的時(shí)間與Java虛擬機(jī)的源代碼相鏈接,也不需要通過Java指令集等有知識(shí)產(chǎn)權(quán)的指令集來實(shí)現(xiàn)虛擬機(jī)的本地調(diào)用。 本地實(shí)現(xiàn)模塊70,用于根據(jù)指令參數(shù)跳轉(zhuǎn)執(zhí)行對應(yīng)的本地接口函數(shù)。本實(shí)施例中, 本地實(shí)現(xiàn)模塊70取該指令參數(shù)。從虛擬機(jī)的隨機(jī)存儲(chǔ)器或當(dāng)前的堆棧中讀取執(zhí)行該指令所需要的指令參數(shù)。另一實(shí)施例中,如圖3所示,上述虛擬機(jī)調(diào)用本地接口的裝置還包括了執(zhí)行模塊 90,該執(zhí)行模塊90用于當(dāng)指令不是調(diào)用指令或調(diào)用的目標(biāo)地址不是本地接口地址時(shí),解釋并執(zhí)行該指令。本實(shí)施例中,經(jīng)過對該指令中目標(biāo)地址的判斷可以獲知該指令的執(zhí)行不需要進(jìn)行本地調(diào)用,因此通過執(zhí)行模塊90直接解釋并執(zhí)行該指令即可,正常運(yùn)行該指令。在一個(gè)具體的實(shí)施例中,如圖4所示,上述虛擬機(jī)調(diào)用本地接口的裝置中本地實(shí)現(xiàn)模塊70包括本地執(zhí)行單元701以及結(jié)果存儲(chǔ)單元703。本地執(zhí)行單元701,用于讀取指令參數(shù),并根據(jù)指令參數(shù)執(zhí)行對應(yīng)的本地接口函數(shù)。結(jié)果存儲(chǔ)單元703,用于將本地接口函數(shù)的執(zhí)行結(jié)果存儲(chǔ)于指令參數(shù)中。本實(shí)施例中,結(jié)果存儲(chǔ)單元703將執(zhí)行結(jié)果存儲(chǔ)于調(diào)用該本地接口函數(shù)時(shí)所傳入的指令參數(shù)中。其它實(shí)施例中,上述本地實(shí)現(xiàn)模塊70還包括了返回執(zhí)行模塊,該返回執(zhí)行模塊用于執(zhí)行返回指令。本實(shí)施例中,返回執(zhí)行模塊通過返回指令的執(zhí)行返回虛擬機(jī)的應(yīng)用程序中繼續(xù)執(zhí)行其它指令。上述虛擬機(jī)調(diào)用本地接口的方法及裝置對于程序中需要進(jìn)行本地調(diào)用的指令通過直接讀取該指令參數(shù)來執(zhí)行該指令,該方法的實(shí)現(xiàn)不依賴某種特定指令集,特別是不依賴他方有知識(shí)產(chǎn)權(quán)的指令集,從而使虛擬機(jī)調(diào)用本地接口的方法更靈活,不需要通過真實(shí)硬件進(jìn)行指令參數(shù)的讀取以及執(zhí)行指令,極大地提高了反應(yīng)速度。以上所述實(shí)施例僅表達(dá)了本發(fā)明的幾種實(shí)施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對本發(fā)明專利范圍的限制。應(yīng)當(dāng)指出的是,對于本領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進(jìn),這些都屬于本發(fā)明的保護(hù)范圍。因此,本發(fā)明專利的保護(hù)范圍應(yīng)以所附權(quán)利要求為準(zhǔn)。
權(quán)利要求
1.一種虛擬機(jī)調(diào)用本地接口的方法,包括以下步驟 載入指令;解釋所述指令以及指令參數(shù);判斷所述指令是否為調(diào)用指令,如果是,則判斷調(diào)用的目標(biāo)地址是否為本地接口地址, 若是,則讀取所述指令參數(shù);根據(jù)所述指令參數(shù)跳轉(zhuǎn)執(zhí)行對應(yīng)的本地接口函數(shù)。
2.根據(jù)權(quán)利要求1所述的虛擬機(jī)調(diào)用本地接口的方法,其特征在于,還包括當(dāng)所述指令不是調(diào)用指令或調(diào)用的目標(biāo)地址不是本地接口地址時(shí),解釋并執(zhí)行所述指令。
3.根據(jù)權(quán)利要求1所述的虛擬機(jī)調(diào)用本地接口的方法,其特征在于,所述根據(jù)所述指令參數(shù)跳轉(zhuǎn)執(zhí)行對應(yīng)的本地接口函數(shù)的步驟之后還包括將所述本地接口函數(shù)的執(zhí)行結(jié)果存儲(chǔ)于所述指令參數(shù)中。
4.根據(jù)權(quán)利要求3所述的虛擬機(jī)調(diào)用本地接口的方法,其特征在于,所述將所述本地接口函數(shù)的執(zhí)行結(jié)果存儲(chǔ)于所述的指令參數(shù)中的步驟之后還包括執(zhí)行返回指令的步驟。
5.一種虛擬機(jī)調(diào)用本地接口的裝置,其特征在于,至少包括 指令載入模塊,用于載入指令;指令解釋模塊,用于解釋所述指令以及指令參數(shù);判斷處理模塊,用于判斷所述指令是否為調(diào)用指令,如果是,則進(jìn)一步判斷調(diào)用的目標(biāo)地址是否為本地接口地址,若是,則讀取所述指令參數(shù);本地實(shí)現(xiàn)模塊,用于根據(jù)所述指令參數(shù)跳轉(zhuǎn)執(zhí)行對應(yīng)的本地接口函數(shù)。
6.根據(jù)權(quán)利要求5所述的虛擬機(jī)調(diào)用本地接口的裝置,其特征在于,還包括執(zhí)行模塊,用于當(dāng)所述指令不是調(diào)用指令或調(diào)用的目標(biāo)地址不是本地接口地址時(shí),解釋并執(zhí)行所述指令。
7.根據(jù)權(quán)利要求5所述的虛擬機(jī)調(diào)用本地接口的裝置,其特征在于,所述本地實(shí)現(xiàn)模塊包括本地執(zhí)行單元,用于讀取指令參數(shù),并根據(jù)所述指令參數(shù)執(zhí)行對應(yīng)的本地接口函數(shù); 結(jié)果存儲(chǔ)單元,用于將所述本地接口函數(shù)的執(zhí)行結(jié)果存儲(chǔ)于所述指令參數(shù)中。
8.根據(jù)權(quán)利要求7所述的虛擬機(jī)調(diào)用本地接口的裝置,其特征在于,所述本地實(shí)現(xiàn)模塊還包括返回執(zhí)行模塊,用于執(zhí)行返回指令。
全文摘要
一種虛擬機(jī)調(diào)用本地接口的方法,包括以下步驟載入指令;解釋所述指令以及指令參數(shù);判斷所述指令是否為調(diào)用指令,如果是,則判斷調(diào)用的目標(biāo)地址是否為本地接口地址,若是,則讀取所述指令參數(shù);根據(jù)所述指令參數(shù)跳轉(zhuǎn)執(zhí)行對應(yīng)的本地接口函數(shù)。上述虛擬機(jī)調(diào)用本地接口的方法及裝置對于程序中需要進(jìn)行本地調(diào)用的指令通過直接讀取該指令參數(shù)來執(zhí)行該指令,該方法的實(shí)現(xiàn)不依賴某種特定指令集,特別是不依賴他方有知識(shí)產(chǎn)權(quán)的指令集,從而使虛擬機(jī)調(diào)用本地接口的方法更靈活,不需要通過真實(shí)硬件進(jìn)行指令參數(shù)的讀取以及執(zhí)行指令,極大地提高了反應(yīng)速度。
文檔編號(hào)G06F9/48GK102193829SQ20111013237
公開日2011年9月21日 申請日期2011年5月20日 優(yōu)先權(quán)日2011年5月20日
發(fā)明者鐘衍徽 申請人:深圳市江波龍電子有限公司