国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

軟硬件結(jié)合構(gòu)造JVM的方法

2012-04-29 18:06:37趙睿
電腦知識與技術(shù) 2012年34期
關(guān)鍵詞:嵌入式系統(tǒng)

趙睿

摘要:在符合Java虛擬機(jī)體系結(jié)構(gòu)規(guī)范的前提下,JVM的具體實現(xiàn)可以有多種形式。論文在闡述了JVM體系結(jié)構(gòu)規(guī)范后,為JVM各子系統(tǒng)提供了具體的軟硬件實現(xiàn)方法,構(gòu)造了一個完整的JVM實例,之后通過一個典型的Java程序示例,來驗證在嵌入式系統(tǒng)開發(fā)中,軟硬件結(jié)合方式構(gòu)造JVM的可行性。

關(guān)鍵詞:JVM;軟硬件結(jié)合;嵌入式系統(tǒng)

中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2012)34-8326-03

JVM(JavaVirtualMachine,Java虛擬機(jī))用于運(yùn)行Java程序,任何一個Java程序都是運(yùn)行在符合規(guī)范的JVM上的。由于“規(guī)范”僅僅是描述性的、抽象的,因此可以通過不同的機(jī)制來實現(xiàn)JVM。它或者完全用軟件實現(xiàn),或者以軟件和硬件相結(jié)合的方式來實現(xiàn)。傳統(tǒng)的運(yùn)行于操作系統(tǒng)上的JVM用軟件方式來完成取指、分析、執(zhí)行,必定會造成程序執(zhí)行速度低下。在嵌入式系統(tǒng)中,軟件執(zhí)行方式更會因為嵌入式系統(tǒng)計算能力的限制而造成字節(jié)碼解釋執(zhí)行速度過慢,從而影響性能。該文擬尋求一種軟硬件結(jié)合的方式來構(gòu)建JVM,在不改變用戶開發(fā)習(xí)慣的基礎(chǔ)上,尋求執(zhí)行效率和硬件資源消耗的最佳化,以滿足嵌入式系統(tǒng)開發(fā)需求。

1規(guī)范:JVM的體系結(jié)構(gòu)

JVM的結(jié)構(gòu)框圖如圖1,包括在規(guī)范中描述的主要子系統(tǒng)和內(nèi)存區(qū)。它們的分工和作用如圖1所述。

類裝載子系統(tǒng)負(fù)責(zé)根據(jù)給定的全限定名來裝入類型(類或接口)。

當(dāng)JVM運(yùn)行一個程序時,它需要內(nèi)存來存儲許多數(shù)據(jù),這些數(shù)據(jù)被組織在“運(yùn)行時數(shù)據(jù)區(qū)”中,以便于管理。其中,方法區(qū)包含了從class文件中解析的類型信息,如字節(jié)碼、常量池、靜態(tài)變量等,是執(zhí)行的信息源頭;堆用來保存程序運(yùn)行時創(chuàng)建的所有類的實例(對象)或數(shù)組,并且,它是被所有線程所共享的,是開發(fā)人員可見的編程對象;每個Java棧幀包括局部變量區(qū)、操作數(shù)棧和幀數(shù)據(jù)區(qū),分別用于保存?zhèn)鬟f參數(shù)及運(yùn)算中間結(jié)果、提供當(dāng)前運(yùn)算的操作數(shù)、保存方法返回及異常派發(fā)機(jī)制的數(shù)據(jù),是程序運(yùn)行的直接數(shù)據(jù)交互區(qū);PC寄存器是方法區(qū)中指令的指針,引導(dǎo)指令有序執(zhí)行;本地方法棧用于同本地方法進(jìn)行數(shù)據(jù)交互。

執(zhí)行引擎的作用是從運(yùn)行時數(shù)據(jù)區(qū)提取字節(jié)碼和數(shù)據(jù)進(jìn)行解析和執(zhí)行,然后把中間結(jié)果或成員變量等數(shù)據(jù)寫回運(yùn)行時數(shù)據(jù)區(qū),是JVM的執(zhí)行核心。一個完整的執(zhí)行引擎須支持全部的Java指令集。

本地方法接口為設(shè)計者實現(xiàn)低層的本地方法提供途徑,以便和所使用的特定JVM結(jié)構(gòu)更加緊密的結(jié)合。本地方法接口和本地方法棧不是必需的,具體實現(xiàn)可以不提供支持。

2實現(xiàn):一個具體的JVM實例

如前所述,JVM的規(guī)范并沒有針對具體的實現(xiàn)進(jìn)行約束,這就為不同的JVM實現(xiàn)途徑提供了可能。在滿足JVM體系結(jié)構(gòu)規(guī)范的前提下,各子部件可以尋求不同的軟硬件實現(xiàn)方式。

2.1軟件實現(xiàn)模塊

預(yù)處理器是裝載子系統(tǒng)的軟件實現(xiàn),它的輸入是一個Java程序所包含的所有類文件(.class),輸出是可以供硬件Java處理器直接執(zhí)行的字節(jié)碼流。事實上,除了實現(xiàn)類裝載的任務(wù)外,預(yù)處理器還實現(xiàn)了執(zhí)行引擎的一部分功能,即對類文件進(jìn)行解析。

預(yù)處理器實現(xiàn)的解析功能包括:提取程序涉及的每個類文件的字節(jié)碼流;將字節(jié)碼流中的符號引用(包括靜態(tài)變量、實例變量、調(diào)用及返回方法等)解析為具體的內(nèi)存地址;將復(fù)雜抽象字節(jié)碼轉(zhuǎn)化為簡單可執(zhí)行的字節(jié)碼組合;將所有處理后的字節(jié)碼流整合成一個可供硬件處理器直接執(zhí)行的二進(jìn)制文件。由此可知,預(yù)處理器的實現(xiàn)是與具體的內(nèi)存組織形式和Java處理器實現(xiàn)方式密切相關(guān)的。

2.2硬件實現(xiàn)模塊

2.2.1運(yùn)行時數(shù)據(jù)區(qū)實現(xiàn)

“運(yùn)行時數(shù)據(jù)區(qū)”是由具體的硬件存儲單元實現(xiàn)的。其內(nèi)存組織形式見圖2。

方法區(qū)中的內(nèi)容被分解成了幾個區(qū)域。其中字節(jié)碼被保存在一塊單獨的存儲單元中,如圖2[a]所示。當(dāng)程序執(zhí)行時,字節(jié)碼指令是只讀的,因此它可以用一塊只讀存儲器來保存。方法內(nèi)的指令順序存儲,指令執(zhí)行時以main方法為主線順序執(zhí)行,方法的調(diào)用和返回通過跳轉(zhuǎn)來實現(xiàn)。從常量池中獲取操作數(shù)的情況并不常見,同時為了避免執(zhí)行前需要向內(nèi)存中預(yù)存數(shù)據(jù)的操作,常量池并沒有被組織到內(nèi)存中,而是把從常量池中獲取數(shù)據(jù)的行為在預(yù)處理器中轉(zhuǎn)化成了具體的帶操作數(shù)入棧指令bipush或sipush(Java字節(jié)碼的指令集及其行為描述參見文獻(xiàn)[1])。

如圖2[b][c]所示,靜態(tài)變量區(qū)被組織在內(nèi)存的最低地址。由于在預(yù)處理器中已經(jīng)解析出了每個類的靜態(tài)變量占用內(nèi)存空間的大小,因此每個類的靜態(tài)變量取的基地址是可以確定的并應(yīng)用于每個方法的初始化中。堆空間的大小是全部對象的空間的累加值,因此并沒有涉及到垃圾回收機(jī)制。當(dāng)調(diào)用一個新方法時,靜態(tài)變量指針和堆指針被賦值,以確保該方法執(zhí)行時的“作用區(qū)”在正確的位置。

棧幀中的操作數(shù)棧并沒有分配給內(nèi)存。由于操作數(shù)棧是參與運(yùn)算的操作數(shù)的最直接來源,它用一組寄存器來實現(xiàn)以提高系統(tǒng)性能。寄存器的數(shù)目應(yīng)不小于程序執(zhí)行時的操作數(shù)峰值數(shù)目,這樣才不會發(fā)生溢出錯誤。局部變量區(qū)和幀數(shù)據(jù)區(qū)被分配在堆空間的鄰接區(qū)域,如圖2[a][b]所示。當(dāng)前方法需要調(diào)用其他方法時,需要為新方法開辟新的局部變量區(qū)和幀數(shù)據(jù)區(qū),被調(diào)用方法返回時,所開辟的空間被回收,指針重新回到調(diào)用前的狀態(tài)。圖3為某一程序的方法調(diào)用及返回示意圖,被構(gòu)造成樹狀結(jié)構(gòu)。局部變量區(qū)的總大小為該樹全部路徑中權(quán)值(代表每個方法的局部變量空間大?。┖偷淖畲笾?。幀數(shù)據(jù)區(qū)的總大小為該樹全部路徑中權(quán)值(代表每個方法的幀數(shù)據(jù)空間大小)和的最大值。

2.2.2執(zhí)行引擎的實現(xiàn)

執(zhí)行引擎是一個基于硬件資源實現(xiàn)的Java字節(jié)碼處理器。處理器的基本特性如下:

五級流水線結(jié)構(gòu):取碼、緩存、譯碼、執(zhí)行、寫回。取碼段負(fù)責(zé)更新PC寄存器的值,并以PC值作為地址從指令存儲器中不斷讀取字節(jié)碼寫入緩存中。緩存段用來支持Java字節(jié)碼的RISC執(zhí)行機(jī)制,實現(xiàn)了對不定長的字節(jié)碼的智能讀取。譯碼段可以產(chǎn)生控制信號,用于控制不同指令的執(zhí)行和寫回。執(zhí)行段負(fù)責(zé)完成指令對應(yīng)的操作數(shù)的數(shù)據(jù)傳遞、算數(shù)運(yùn)算、邏輯運(yùn)算和讀寫內(nèi)存等操作。寫回段把運(yùn)算結(jié)果寫回到棧操作數(shù)寄存器、基地址寄存器等寄存器中。

流水線阻塞解決數(shù)據(jù)冒險:如上所述的流水線的五級中,執(zhí)行段從寄存器中讀取數(shù)據(jù),而寫回段將運(yùn)算結(jié)果寫入寄存器。這樣,就有可能產(chǎn)生數(shù)據(jù)冒險現(xiàn)象。假如第N條指令將數(shù)據(jù)寫回到寄存器,而第N+1條指令需要從寄存器中提取操作數(shù),那么第N+1條指令就會取到未更新的寄存器值,從而產(chǎn)生錯誤。一個解決數(shù)據(jù)冒險的方法是在這兩條指令之間添加nop指令用來暫停執(zhí)行、寫回段,即阻塞了流水線一個周期。之后,第N+1條指令就可以獲取已經(jīng)更新的寄存器值。處理器可以根據(jù)相鄰兩條指令的字節(jié)碼信息智能判斷是否發(fā)生數(shù)據(jù)冒險,從而決定是否需要阻塞流水線。

Java字節(jié)碼RISC執(zhí)行機(jī)制:不同的Java字節(jié)碼所帶操作數(shù)的個數(shù)不同,因此它具有CISC的特點。字節(jié)碼不定長的特征給處理器取指令模塊的設(shè)計帶來困難,由于字節(jié)碼及其操作數(shù)的順序存儲特點,一旦“多取”或“少取”,就會引發(fā)后續(xù)一系列的錯誤,包括漏取錯取字節(jié)碼,漏取錯取數(shù)據(jù),甚至將操作數(shù)當(dāng)做字節(jié)碼來執(zhí)行的情況。因此,需要尋找一種方法,能夠智能讀取字節(jié)碼數(shù)據(jù)的長度,保證字節(jié)碼的有序執(zhí)行。為了解決字節(jié)碼不定長的問題,引入“緩存”,它實質(zhì)上是n(n>>1)個8位寄存器的組合。緩存在未滿的情況下一直接收從字節(jié)碼存儲器讀取的字節(jié)碼及操作數(shù)并依次存儲。同時,如果緩存存儲了至少足夠執(zhí)行一次的字節(jié)碼和操作數(shù),字節(jié)碼和其操作數(shù)將一并被取出執(zhí)行,否則,處理器將處于等待狀態(tài),直到有“完備”的字節(jié)碼和操作數(shù)可用。當(dāng)執(zhí)行微程序時,處理器執(zhí)行完ROM中的微指令才執(zhí)行下一條字節(jié)碼,與此同時,緩存一直處于接收狀態(tài)。因此,在執(zhí)行微程序的“間隙”,取字節(jié)碼處于工作狀態(tài),或許此后不必為了執(zhí)行一個三字節(jié)指令等待兩個時鐘周期,因為緩存中已經(jīng)積累了足夠多的字節(jié)碼數(shù)據(jù)可取。

微程序?qū)崿F(xiàn)方法調(diào)用及返回:Java有專門的字節(jié)碼支持方法的調(diào)用和返回(如invokevirtual、invokespecial、ireturn、return)。這些指令的實現(xiàn)涉及到“保存現(xiàn)場”、“參數(shù)傳遞”、“創(chuàng)建被調(diào)用方法現(xiàn)場”、“結(jié)果返回”、“恢復(fù)現(xiàn)場”等一系列行為,很難或者需要消耗大量硬件資源才能在一個流水線周期內(nèi)完成?;谝褜崿F(xiàn)的簡單指令,利用微程序來執(zhí)行這類指令是一個不錯的方法,因此需要在硬件處理器中添加ROM來保存微程序。

本地方法棧和本地方法接口是非必須的,該文描述JVM實現(xiàn)并未涉及。

3小結(jié)

基于軟硬件結(jié)合方式構(gòu)建的Java虛擬機(jī),滿足JVM系統(tǒng)規(guī)范的要求。各子系統(tǒng)分別給出了明確、具體的軟硬件實現(xiàn)方案。開發(fā)人員不需要改變編程習(xí)慣,借助于常用的集成開發(fā)環(huán)境,即可將工程應(yīng)用于嵌入式系統(tǒng)的開發(fā)。

參考文獻(xiàn):

[1]王立東,張凱.Java虛擬機(jī)分析[J].北京理工大學(xué)學(xué)報,2002(2).

[2]嚴(yán)東華,張凱.Java虛擬機(jī)及其移植[J].北京理工大學(xué)學(xué)報.2002(2).

[3]丁宇新,程虎.Java虛擬機(jī)中無用單元的精確回收[J].計算機(jī)學(xué)報,1999(11).

[4]探矽工作室.深入嵌入式Java虛擬機(jī)[M].北京:中國鐵道出版社,2003.

猜你喜歡
嵌入式系統(tǒng)
Teaching Research on IoT and—Embedded System of Software Engineering
基于Xilinx口袋實驗室的組合邏輯電路設(shè)計實驗
面向應(yīng)用的智能專業(yè)嵌入式系統(tǒng)教學(xué)
基于物聯(lián)網(wǎng)的遠(yuǎn)程紅外控制器
嵌入式系統(tǒng)軟件開發(fā)技術(shù)探析
基于AVR單片機(jī)的SPI接口設(shè)計與實現(xiàn)
辦公自動化系統(tǒng)的設(shè)計
嵌入式系統(tǒng)在醫(yī)療器械中的應(yīng)用分析
基于物聯(lián)網(wǎng)項目驅(qū)動的嵌入式系統(tǒng)教學(xué)改革的研究與實踐
嵌入式系統(tǒng)課程“中斷、異常與事件”教學(xué)實踐及啟示
九台市| 邢台市| 固阳县| 五常市| 鹤庆县| 固镇县| 五家渠市| 平江县| 育儿| 南靖县| 昭觉县| 西乌珠穆沁旗| 西吉县| 义乌市| 芜湖市| 河津市| 仙居县| 徐州市| 托克托县| 车致| 若羌县| 改则县| 佛冈县| 兴城市| 尖扎县| 新乡市| 搜索| 嘉善县| 桑日县| 清流县| 泸水县| 张北县| 巴彦县| 怀化市| 榆中县| 亚东县| 新闻| 屏东市| 安多县| 安岳县| 富阳市|