Dalvik虛擬機(jī)簡(jiǎn)介及架構(gòu)級(jí)移植優(yōu)化方向
《Dalvik虛擬機(jī)簡(jiǎn)介及架構(gòu)級(jí)移植優(yōu)化方向》由會(huì)員分享,可在線閱讀,更多相關(guān)《Dalvik虛擬機(jī)簡(jiǎn)介及架構(gòu)級(jí)移植優(yōu)化方向(20頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、LOGOAndroid Dalvik 虛擬機(jī)初識(shí)及架構(gòu)簡(jiǎn)析LOGO嵌入式系統(tǒng)概述嵌入式系統(tǒng)概述 Dalvik虛擬機(jī)與Java虛擬機(jī)的區(qū)別 Dalvik虛擬機(jī)源碼目錄簡(jiǎn)析 Dalvik虛擬機(jī)專有工具的功能及使用 Dalvik虛擬機(jī)初識(shí)及基本特性1234本本節(jié)節(jié)主主要要內(nèi)內(nèi)容容 Dalvik虛擬機(jī)核心執(zhí)行引擎5 Dalvik虛擬機(jī)的移植及優(yōu)化方向LOGO1、Dalvik虛擬機(jī)初識(shí)及基本特性什么是Dalvik虛擬機(jī)?讓我們從認(rèn)識(shí)Java虛擬機(jī)開始:Java虛擬機(jī)(JVM)是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的。它有自己完善的硬件架構(gòu)(如處理器、堆棧、寄存器等),
2、還具有相應(yīng)的指令系統(tǒng)。使用“Java虛擬機(jī)”程序就是為了支持與操作系統(tǒng)無(wú)關(guān)、在任何系統(tǒng)中都可以運(yùn)行的程序。Davlik虛擬機(jī)同Java虛擬機(jī)同樣是運(yùn)行Java程序的虛擬機(jī),但Davlik虛擬機(jī)具有其獨(dú)特特性:Dalvik虛擬機(jī)是Android程序的虛擬機(jī),是Android中Java程序的運(yùn)行基礎(chǔ)。其指令集基于寄存器基于寄存器架構(gòu),執(zhí)行其特有的文件格式特有的文件格式dex字節(jié)碼來(lái)完成對(duì)象生命周期管理、堆棧管理、線程管理、安全異常管理、垃圾回收等重要功能。它的核心內(nèi)容是實(shí)現(xiàn)庫(kù)(libdvm.so),架構(gòu)由C語(yǔ)言實(shí)現(xiàn)。依賴于Linux內(nèi)核的一部分功能線程機(jī)制、內(nèi)存管理機(jī)制,能高效使用內(nèi)存,并在低速C
3、PU上表現(xiàn)出的高性能。每一個(gè)Android應(yīng)用在底層都會(huì)對(duì)應(yīng)一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例,其代碼在虛擬機(jī)的解釋下得以執(zhí)行。讓我們看看Dalvik虛擬機(jī)處在Android系統(tǒng)架構(gòu)的什么位置:LOGOLOGO2、 Dalvik虛擬機(jī)與Java虛擬機(jī)的區(qū)別 然而:Dalvik VM Java VMI.dalvik基于寄存器,而JVM基于stack II.Dalvik執(zhí)行的是特有的DEX文件格式,而JVM運(yùn)行的是*.class文件格式。優(yōu)勢(shì):1、在編譯時(shí)提前優(yōu)化代碼而不是等到運(yùn)行時(shí)2、 虛擬機(jī)很小,使用的空間也?。槐辉O(shè)計(jì)來(lái)滿足可高效運(yùn)行多種虛擬機(jī)實(shí)例。3、常量池已被修改為只使用32位的索引,以簡(jiǎn)化
4、解釋器LOGOJVM的字節(jié)碼主要是零地址形式的,概念上說(shuō)JVM是基于棧的架構(gòu)。Google Android平臺(tái)上的應(yīng)用程序的主要開發(fā)語(yǔ)言是Java,通過(guò)其中的Dalvik VM來(lái)運(yùn)行Java程序。為了能正確實(shí)現(xiàn)語(yǔ)義,Dalvik VM的許多設(shè)計(jì)都考慮到與JVM的兼容性;但它卻采用了基于寄存器的架構(gòu),其字節(jié)碼主要是二地址/三地址的混合形式?;跅Ec基于寄存器的架構(gòu),誰(shuí)更快?現(xiàn)在實(shí)際的處理器,大多都是基于寄存器的架構(gòu),從側(cè)面反映出基于寄存器比基于棧的架構(gòu)更與實(shí)際的處理器接近。但對(duì)于VM來(lái)說(shuō),源架構(gòu)的求值?;蛘呒拇嫫鞫伎赡苁怯脤?shí)際機(jī)器的內(nèi)存來(lái)模擬的,所以性能特性與實(shí)際硬件又有不同。一般認(rèn)為基于寄存器
5、架構(gòu)的Dalvik VM比基于棧架構(gòu)JVM執(zhí)行效率更高,原因是:雖然零地址指令更緊湊,但完成操作需要更多的load/store指令,也意味著更多的指令分派(instruction dispatch)次數(shù)與內(nèi)存訪問(wèn)次數(shù);訪問(wèn)內(nèi)存是執(zhí)行速度的一個(gè)重要瓶頸,二地址或三地址指令雖然每條指令占的空間較多,但總體來(lái)說(shuō)可以用更少的指令完成操作,指令分派與內(nèi)存訪問(wèn)次數(shù)都較少。 我們從下面的截圖可以明了的看到與同一段Java代碼對(duì)應(yīng)的Java bytecode 與Dalvid bytecode的比較。LOGOLOGODalvik字節(jié)碼以16位為單元(或許叫“雙字節(jié)碼”更準(zhǔn)確 )。上面代碼中有5條指令,其中mul
6、-int/lit8指令占2單元,其余每條都只占1單元,共6單元=12字節(jié)。Java字節(jié)碼以1字節(jié)為單元。上面代碼中有11條指令,每條都只占1單元,共11單元=11字節(jié)。 基于寄存器與基于棧的區(qū)別更詳細(xì)的介紹見補(bǔ)充文檔。基于寄存器與基于棧的區(qū)別更詳細(xì)的介紹見補(bǔ)充文檔。LOGODalvik專有的專有的DEX文件格式文件格式一個(gè)應(yīng)用中會(huì)定義很多類,編譯完成后即會(huì)有很多相應(yīng)的CLASS文件,CLASS文件間會(huì)有不少冗余的信息。dex字節(jié)碼和標(biāo)準(zhǔn)Java的字節(jié)碼(Class)在結(jié)構(gòu)上的一個(gè)區(qū)別是dex字節(jié)碼將多個(gè)文件整合成一個(gè),這樣,除了減少整體的文件尺寸,I/O操作,也提高了類的查找速度。原來(lái)每個(gè)類文
7、件中的常量池現(xiàn)在由DEX文件中一個(gè)常量池來(lái)管理。DEX文件可以進(jìn)行進(jìn)一步優(yōu)化。優(yōu)化主要是針對(duì)以下幾個(gè)方面: 1、調(diào)整所有字段的字節(jié)序(LITTLE_ENDIAN)和對(duì)齊結(jié)構(gòu)中的沒(méi)一個(gè)域 2、驗(yàn)證DEX文件中的所有類 3、對(duì)一些特定的類進(jìn)行優(yōu)化,對(duì)方法里的操作碼進(jìn)行優(yōu)化 DEX字節(jié)碼的生成過(guò)程將在后續(xù)的專有工具介紹中給出。字節(jié)碼的生成過(guò)程將在后續(xù)的專有工具介紹中給出。為什么棄用已有的字節(jié)碼文件(CLASS文件)而采用新的格式呢?LOGO3、 Dalvik虛擬機(jī)源碼目錄簡(jiǎn)析通過(guò)以上的介紹,我們對(duì)Dalvik VM能實(shí)現(xiàn)的功能以及為什么需要這么一個(gè)虛擬機(jī)有了初步的認(rèn)識(shí)。觀其內(nèi)部,Android VM
8、的架構(gòu)是什么樣子的呢?在源碼中,Dalvik VM相關(guān)的內(nèi)容在Android中是一個(gè)獨(dú)立的代碼路徑:dalvik/,其中包含了目標(biāo)機(jī)和主機(jī)的內(nèi)容。其主要的目錄如下所示:Dalvik/|-Dx|-Vm| |-Arch| -Mterp| -Native| -Compiler|-DalvikvmDalvik/dx目錄的內(nèi)容是dx工具庫(kù),其最終將dx專有工具(可執(zhí)行文件)。另外與dx目錄同級(jí)的文件夾dexdump、tools同樣對(duì)應(yīng)幾個(gè)專有工具。Dalvik/vm目錄的內(nèi)容是虛擬機(jī)核心實(shí)現(xiàn),其最終將生成libdvm.so(Dalvik虛擬機(jī))。Davlik /dalvikvm目錄中的內(nèi)容是虛擬機(jī)的入口
9、程序,會(huì)生成dalvilvm可執(zhí)行程序。LOGO由于Dalvik中許多代碼直接來(lái)源于Apache Harmony項(xiàng)目,因此,通過(guò)了解Apache Harmony項(xiàng)目對(duì)我們認(rèn)識(shí)DalvikVM有很大的幫助。Apache Harmony技術(shù)架構(gòu)如下所示:LOGO從應(yīng)用程序的執(zhí)行流程來(lái)看Dalvik VM的組成部分:DX工具:由Java編譯器編譯后的.class轉(zhuǎn)換成DE格式。類加裁器:1、原始加載器,加載native實(shí)現(xiàn)的類;2、加載器object,加載java實(shí)現(xiàn)的類。(所有process共享)執(zhí)行引擎(解釋器):根據(jù)其自身的一套指令集對(duì)dalvik bytecode進(jìn)行解釋。另外包括在此流程中
10、實(shí)現(xiàn)的內(nèi)存管理及線程機(jī)制LOGODEX文件的生成:Android系統(tǒng)和Dalvik虛擬機(jī)提供了工具(DX) 在把Java源代碼編譯成CLASS文件后 使用DX工具 DEX文件的結(jié)構(gòu)相對(duì)于.jar更加緊湊 但是為了獲得高效率我們還得進(jìn)一步對(duì).dex進(jìn)行優(yōu)化。LOGO4、Dalvik虛擬機(jī)專有工具的功能及使用Dalvik的虛擬機(jī)專有工具的功能其實(shí)很簡(jiǎn)單:改造并優(yōu)化java字節(jié)碼。一般來(lái)說(shuō),啟動(dòng)一個(gè)Dalvik虛擬機(jī)需要啟動(dòng)一個(gè)Android應(yīng)用程序來(lái)完成,其實(shí)我們可以直接使用Dalvik虛擬機(jī):dx工具可以單獨(dú)剝離出來(lái)使用。如,我們?cè)趐c上用java編譯器把java源碼編譯成class字節(jié)碼(這個(gè)
11、步驟也可以在Linux服務(wù)器上完成),然后在linux上直接使用dx把該class字節(jié)碼變成dex字節(jié)碼(可以通過(guò)dx直接生成打包好的DEX格式的文件,如.jar等),如下有一個(gè)簡(jiǎn)單 例子:% echo class Foo public static void main(String args) System.out.println(Hello, world); Foo.java% javac Foo.java% dx -dex -output=foo.jar Foo.class% adb push foo.jar /sdcard% adb shell dalvikvm -cp /sdcard
12、/foo.jar FLOGOjava語(yǔ)言是解釋型語(yǔ)言,它是以跨平臺(tái)換取執(zhí)行效率為代價(jià)的。跨平臺(tái)性體現(xiàn)在編譯的跨平臺(tái)性和運(yùn)行跨平臺(tái)性。編譯的跨平臺(tái)體現(xiàn)在源程序不限制于在某一平臺(tái)進(jìn)行編譯,運(yùn)行的跨平臺(tái)性體現(xiàn)在編譯出來(lái)的可執(zhí)行程序也不限制于在某一平臺(tái)上運(yùn)行。這樣神奇是特性是不是特別具有吸引力呢?現(xiàn)在我們把重點(diǎn)放在運(yùn)行的跨平臺(tái)性。運(yùn)行的跨平臺(tái)性是以犧牲虛擬機(jī)的平臺(tái)性相關(guān)性為代價(jià)的,而這正是我們需要解決的問(wèn)題,因?yàn)楣俜讲⑽刺峁﹗nicore架構(gòu)的虛擬機(jī)。Dalvik虛擬機(jī)的平臺(tái)相關(guān)性集中的體現(xiàn)在的執(zhí)行引擎上,它是Dalvik虛擬機(jī)的核心部分,Dex字節(jié)碼就是在這個(gè)部分解釋執(zhí)行 。平臺(tái)相關(guān)性問(wèn)題我們先暫且
13、擱置,因?yàn)樵谙乱徊糠謺?huì)重點(diǎn)分析Dalvik虛擬機(jī)的移植。先來(lái)了解一下解釋器是怎么工作的:5、Dalvik虛擬機(jī)核心執(zhí)行引擎LOGO如Dex字節(jié)碼add-int/2addr對(duì)應(yīng)的架構(gòu)匯編如下: mov r22, rINST #8 r22 #12 r3- B and r22, r22, #15 GET_VREG(r1, r3) r1- vB GET_VREG(r0, r22) r0- vA FETCH_ADVANCE_INST(1) advance rPC, load rINST add r0, r0, r1 GET_INST_OPCODE(ip) extract opcode from rINS
14、T SET_VREG(r0, r22) vAA- r0 GOTO_OPCODE(ip) jump to next instruction#define GET_VREG(_reg, _vreg) ldw _reg, rFP+, _vreg #2#define FETCH_ADVANCE_INST(_count) ldh.w rINST, rPC+, #(_count*2)#define GET_INST_OPCODE(_reg) and _reg, rINST, #255#define SET_VREG(_reg, _vreg) stw _reg, rFP+, _vreg #2#define
15、GOTO_OPCODE(_reg) add pc, rIBASE, _reg #6對(duì)應(yīng)的C實(shí)現(xiàn)是:HANDLE_OP_X_INT_2ADDR(OP_AND_INT_2ADDR, and, &, 0) OP_END#define OP_END LOGO對(duì)應(yīng)的C實(shí)現(xiàn)是:#define HANDLE_OP_X_INT_2ADDR(_opcode, _opname, _op, _chkdiv) HANDLE_OPCODE(_opcode /*vA, vB*/) vdst = INST_A(inst); vsrc1 = INST_B(inst); ILOGV(|%s-int-2addr v%d,v%d,
16、 (_opname), vdst, vsrc1); if (_chkdiv != 0) s4 firstVal, secondVal, result; firstVal = GET_REGISTER(vdst); secondVal = GET_REGISTER(vsrc1); if (secondVal = 0) EXPORT_PC(); dvmThrowException(Ljava/lang/ArithmeticException;, divide by zero); GOTO_exceptionThrown(); if (u4)firstVal = 0 x80000000 & seco
17、ndVal = -1) if (_chkdiv = 1) result = firstVal; /* division */ else result = 0; /* remainder */ else result = firstVal _op secondVal; SET_REGISTER(vdst, result); else SET_REGISTER(vdst, (s4) GET_REGISTER(vdst) _op (s4) GET_REGISTER(vsrc1); FINISH(1);LOGO6、 Dalvik虛擬機(jī)的移植及優(yōu)化方向Dalvik虛擬機(jī)整個(gè)架構(gòu)真正意義上與架構(gòu)相關(guān)的地方
18、只有一個(gè),那就是JNICallbridge。這是因?yàn)閖ava引入了JNI機(jī)制,實(shí)現(xiàn)了java到本地方法的直接調(diào)用。這個(gè)調(diào)用關(guān)系就涉及以參數(shù)傳遞的問(wèn)題,如X86架構(gòu)的參數(shù)全是從右至左壓棧傳遞,而ARM架構(gòu)的參數(shù)傳遞則要遵循ATPCS。因此,Dalvik虛擬機(jī)的移植到這一步可以說(shuō)算完成了。注意,此時(shí)解釋器是C語(yǔ)言現(xiàn)實(shí)的。JNICallbridge的移植需要認(rèn)真的分析一下HintsEABI.c這個(gè)文件,因?yàn)檫@個(gè)文件函數(shù)dvmPlatformInvokeHints會(huì)解析要地方法列表的第二項(xiàng):如一個(gè)本地方法列表為:static JNINativeMethod methods = “simple”, “(
19、II)I”, (void*)add,;接著,被分析提取出來(lái)的參數(shù)列表會(huì)傳遞給dvmPlatformInvoke這個(gè)函數(shù)。為了效率,這個(gè)函數(shù)一般是用匯編完成的。它所在的文件名為:CallEABI.SCallEABI.S和HintsEABI.c位于android/dalvik/vm/arch/xx_ARCHLOGO從前面的介紹知道Dalvik虛擬機(jī)最大的優(yōu)化跨平臺(tái)性,但以此換取執(zhí)行效率相對(duì)低下的劣勢(shì)。因此帶來(lái)一項(xiàng)新的挑戰(zhàn)Dalvik虛擬機(jī)的優(yōu)化。從目前較成熟的技術(shù)來(lái)說(shuō),Dalvik虛擬機(jī)的優(yōu)化可以從兩個(gè)大的方面進(jìn)行。一個(gè)方向是軟件優(yōu)化,包括解釋器的匯編重寫解釋器的匯編重寫和引入引入JIT技術(shù)技術(shù);另一個(gè)方面就是硬件優(yōu)化了。我們知道,java字節(jié)碼或是dex字節(jié)碼,它們的表現(xiàn)形式相當(dāng)接近匯編,匯編語(yǔ)言能夠由CPU直接執(zhí)行,字節(jié)碼為什么不可以呢?事實(shí)上java早已實(shí)現(xiàn)該技術(shù)Jazelle DBX (Direct Bytecode eXecution)技術(shù),即允許它們?cè)谀承┘軜?gòu)的硬件上加速執(zhí)行Java bytecode 。因此,在dalvik虛擬機(jī)上實(shí)現(xiàn)類類Jazelle功能完全是可行的。由于這涉及以硬件的最底層機(jī)制的實(shí)現(xiàn),所以目前只能作為一項(xiàng)展望了。LOGO
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 設(shè)備采購(gòu)常用的四種評(píng)標(biāo)方法
- 車間員工管理須知(應(yīng)知應(yīng)會(huì))
- 某公司設(shè)備維護(hù)保養(yǎng)工作規(guī)程
- 某企業(yè)潔凈車間人員進(jìn)出管理規(guī)程
- 企業(yè)管理制度之5S管理的八個(gè)口訣
- 標(biāo)準(zhǔn)化班前會(huì)的探索及意義
- 某企業(yè)內(nèi)審員考試試題含答案
- 某公司環(huán)境保護(hù)考核管理制度
- 現(xiàn)場(chǎng)管理的定義
- 員工培訓(xùn)程序
- 管理制度之生產(chǎn)廠長(zhǎng)的職責(zé)與工作標(biāo)準(zhǔn)
- 某公司各級(jí)專業(yè)人員環(huán)保職責(zé)
- 企業(yè)管理制度:5S推進(jìn)與改善工具
- XXX公司環(huán)境風(fēng)險(xiǎn)排查及隱患整改制度
- 生產(chǎn)車間基層管理要點(diǎn)及建議