MIPS目標(biāo)平臺CLDC的Java虛擬機(jī)移植
3 CLDC VM移植過程
phoneME Feature軟件結(jié)構(gòu)實(shí)現(xiàn)了完全的模塊化。它使用一個名為includeDB的配置數(shù)據(jù)庫來管理項(xiàng)目源文件和頭文件,可根據(jù)目標(biāo)CPU架構(gòu)和目標(biāo)OS需求在配置數(shù)據(jù)庫內(nèi)添加或修改相應(yīng)的文件。使用includeDB配置數(shù)據(jù)庫,避免了#ifdef宏散布于整個源碼區(qū)間,還避免了使用復(fù)雜的#ifdef嵌套語句結(jié)構(gòu)。
includeDB配置數(shù)據(jù)庫位于src/vm/includeDB,它是純文本文件,針對目標(biāo)CPU架構(gòu)和目標(biāo)OS需求進(jìn)行添加或修改的頭文件和函數(shù)文件都應(yīng)在該配置文件中進(jìn)行注冊。
檢查includeDB文件,可立即得到在OS移植或CPU移植時需要注意的文件。在建立移植軟件時,還使用ineludeDB配置數(shù)據(jù)庫來跟蹤文件的依賴關(guān)系。為MIPS目標(biāo)平臺建立的頭文件和函數(shù)文件都需要添加到includeDB數(shù)據(jù)庫。
phoneME Feature軟件具有良好的模塊化結(jié)構(gòu),其移植工作集中于JavaCall層。移植模型如圖3所示。本文引用地址:http://butianyuan.cn/article/202584.htm
針對MIPS目標(biāo)架構(gòu)的移植過程如下:
(1)OS移植
目標(biāo)OS為經(jīng)裁剪的通用Linux系統(tǒng),內(nèi)核為2.6.12版。phoneME Feature軟件的大多數(shù)代碼文件都與OS無關(guān),只有極少的幾個文件涉及目標(biāo)OS。OS移植接口分為兩部分:一部分為OS通用部分,它位于源碼目錄src/vm/share/runtime下,適合大多數(shù)OS;另一部分則針對目標(biāo)OS,位于源碼目錄src/vm/os/linux下。
OS指定的移植接口由/src/vm/share/runtime目錄下的OS.hpp和OS.cpp文件進(jìn)行定義。實(shí)際上這兩個文件只實(shí)現(xiàn)了一個Os類,向虛擬機(jī)提供特殊功能。
OS移植接口的其他部分包括文件系統(tǒng)(由OsFile.hpp和OsFile.cpp定義)、線程(由Thread.hpp和Thread.cpp定義)、事件處理(由Task.hpp、Task.cpp、TaskCon-text.cpp、TaskContext.hpp和TaskList.hpp等定義)、內(nèi)存管理(由OsMemory.hpp和OsMemory.cpp等定義)等。針對目標(biāo)OS的移植,需建立/src/vm/os/mips目錄(以MIPS目標(biāo)架構(gòu)命名),在目錄下需創(chuàng)建下列文件:JVM_mips.hpp、JVM_mips.cpp;OS_mips.hpp、OS_mips.cpp;OsFile_mips.hpp、OsFile_mips.cpp;OsMemo-ry_mips.hpp、OsMemory_mips.cpp;OsMisc_mips.hpp、OsMisc_mips.cpp。
根據(jù)需要,可能還需創(chuàng)建OsSocket_mips、Globals_mips等文件。這些文件是文件系統(tǒng)、線程、事件處理、內(nèi)存管理等在目標(biāo)OS的具體實(shí)現(xiàn)。如OS_mips.cpp中實(shí)現(xiàn)了取寄存器值、取PC指針值、為PC指針值賦值、sleep等方法。需強(qiáng)調(diào)的是,OS_mips.cpp文件中有兩個方法非常重要,且必須實(shí)現(xiàn):
◆static void initialize();//用于初始化OS,如定時器、線//程、I/O等
◆static void dispose();//用于撤銷初始化的所有工作,//清除線程和其他OS活動
(2)CPU移植
CPU移植的工作主要有兩個:一是移植解釋器和解釋器的產(chǎn)生器;二是移植相應(yīng)的編譯器。
CPU移植的難點(diǎn)在于編譯器的優(yōu)化和調(diào)整,因?yàn)?a class="contentlabel" href="http://butianyuan.cn/news/listbylabel/label/虛擬機(jī)">虛擬機(jī)的匯編解釋器和相應(yīng)的編譯器依賴于具體的CPU架構(gòu)。建立/src/vm/cpu/mips目錄,并編寫相關(guān)文件。以解釋器的產(chǎn)生器為例,需要編寫(包括頭文件和源文件):Assembler_mips、SourceAssembler_mips、SourceMacros_mips、Disassembler_mips、TemplateTable_mips、Interpret-erGenerator_mips、NativeGenerator_mips、SharedStubs_mips、InterpreterStubs_mips、CompilerStubs_mips等。
(3)JavaCall移植
JavaCall函數(shù)集被分成多個子系統(tǒng)。這些子系統(tǒng)包括:圖形子系統(tǒng)、內(nèi)存管理、LCD顯示、字體、文件和目錄、Socket套接字等。
以移植文件系統(tǒng)接口為例:CLDC虛擬機(jī)使用了類似POSIX標(biāo)準(zhǔn)C庫的文件API,由于目標(biāo)平臺是基于Linux的,所以不需要映射OsFile_read()方法到目標(biāo)操作系統(tǒng)。要確保CLDC虛擬機(jī)能正確操作OS下的文件,需要驗(yàn)證以下接口:
◆im OsFile_remove(const JvmPathChar*filename)
◆bool OsFile_rename(const JvmPathChar*from,constJvmPathChar*to)
◆im OsFile_open(const JvmPathChar*filename,constchar*mode)
◆int OsFile_close(OsFile_Handle handle)
◆int OsFile_flush(OsFile_Handle handle)
◆size_t OsFile_read(OsFile_Handle handle,void*buffer,size_t size,size_t count)
◆size_t OsFile_write(OsFile_Handle handle,const void*buffer,size_t size,size_t count)
以上接口實(shí)現(xiàn)了文件的常用操作,如文件的打開、讀、寫、關(guān)閉、刪除、重命名等。
4 CLDC VM移植驗(yàn)證
完成以上移植所需的修改后,建立Makefile,設(shè)置所需的環(huán)境變量,使得phoneME Feature成功通過交叉編譯,生成目標(biāo)系統(tǒng)所需的CLDC VM虛擬機(jī)。
移植的驗(yàn)證較為簡單,將交叉編譯生成的cldc_vm可執(zhí)行文件、庫文件以及Demo示例文件復(fù)制到目標(biāo)平臺,運(yùn)行并檢查結(jié)果。命令結(jié)構(gòu)是:bin/cldc_vm.exe-class-path location-of-compiled-applications/classes classname。
5 CLDC VM移植優(yōu)化
CLDC虛擬機(jī)的移植優(yōu)化可以從幾方面進(jìn)行:
①優(yōu)化參數(shù)。在虛擬機(jī)建立過程中,phoneME提供了很多選項(xiàng),針對不同的目標(biāo)平臺使用不同的選項(xiàng)。
②Thumb指令集的開關(guān)。ARM等CPU支持Thumb指令集,phoneME也支持Thumb指令集。如果目標(biāo)平臺支持Thumb指令集,可以開啟Thumb開關(guān),加快虛擬機(jī)執(zhí)行速度。
③其他。對虛擬機(jī)的優(yōu)化還可從編譯器自身、內(nèi)存子系統(tǒng)等方面進(jìn)行優(yōu)化。
結(jié) 語
基于phoneME Feature軟件生成的CLDC虛擬機(jī)與早期的KVM虛擬機(jī)相比,性能得到較大改善,尤其是在多任務(wù)支持方面(早期的KVM虛擬機(jī)不支持多任務(wù)功能)。筆者在Broadcom 7403和NXP 225上成功實(shí)現(xiàn)CLDC VM的移植。下一步的工作是在國產(chǎn)數(shù)字電視SoC芯片上實(shí)現(xiàn)CLDC VM的移植。目前多核技術(shù)是計(jì)算機(jī)行業(yè)的研究熱點(diǎn),并逐步向嵌入式領(lǐng)域發(fā)展,因此支持多核CPU技術(shù)和并行技術(shù)的CLDC虛擬機(jī)將是未來的研究方向之一。
評論