本文是J2ME_cldc-1_0_3附帶的
KVM Porting Guide的翻譯,對移植
KVM到特定
的平台上很有參考價值。原書有100多頁,我盡量把它譯完,但時間有限,能否完
成我也無法確保。希望對有志於port
KVM的朋友有所幫助。如果有什麼錯漏之處,
或是您覺得不妥的地方,歡迎您email我,討論商榷。
如您要轉貼,請保留原出處,並勿做刪改。謝謝。
1。
KVM簡介
KVM(K Virtual Machine 或稱 KJava Virtual Machine)是一種小巧,易於
移植的JVM,被專門設計用來支持小型的,資訊有限的設備,例如手機,PDA等。
KVM團隊的最高設計目標是開發一個最小的且“完整"的JVM,它必須能提供對
核心Java語言的支持並能運行在資源有限的設備上(例如只有幾十到幾百Kb)。
更規范的說,
KVM的設計要點有:
·小型,VM的核心只占據大約60Kb的靜態內存空間。(根據不同的平台或編譯
選項有所不同)
·輕巧易於移植。
·模塊化,易於定制。
·盡量做到既“完整”又“快速”。
KVM是用C語言實現的,因此可以方便的移植到許多平台上,只要你能找到該平
台的C compiler。
KVM是J2ME的一部分,
KVM通常被作為CLDC和MIDP構架的底層實現。
KVM是由sun實驗室最初的Spotless系統發展而來。(注:sun最初提出KJava是用來
開發palm os的,那時Palm上的KJava程序稱為Spotlet,類似於今天的MIDlet。)
2。
KVM1.0.2與
KVM1.0.3的區別
主要包括:
·性能優化-重新設計了顯示/同步操作(monitor/synchronization),優化了
JavaCodeCompact工具的代碼產生方式。優化了字符串操作(string)。
·增強了事件(even)處理系統,異步輸入輸出模式(asynchronousI/O)以及
networking庫(用來使CLDC和MIDP聯系的更加緊密)。
·增強了Java級的debug接口,預檢驗器(preverifIEr)和緊縮的垃圾收集器
(garbage collector)。
·更有效的JAM(Java Application Manager)。
·Windows/Unix版的
KVM可以在命令行中調整堆(heap)的大小。
3。對編譯器的要求
你的C compiler 必須兼容ANSI-C(這好像不算什麼要求^-^)你的compiler必
須定義基本數據類型如下:
表1-基本數據類型
------------------------------
Type Description
------------------------------
char 8-bit
signed char 8-bit
unsigned char 8-bit
short signed ,16-bit
unsigned short unsigned 16-bit
int signed,16 or 32 bits.
unsigned int 16 or 32 bits.
long signed, 32-bit
unsigned long 32-bit(注:注意在Java語言裡long為64bit)
void * 32-bit pointer
------------------------------
如果你的J2ME configuration或profile支持浮點數,那你的編譯器還必須支持
浮點類型如下:
----------------------
Type Description
----------------------
float 32-bit floating point value
double 64-bit floating point value
----------------------
我們的參考實現(referenceimplementation)只在指針長度為32bit的機器上做
了測試,我們並不能保證在具有長指針(far pointer)或其他類型的指針的平台上
運行。
下列compiler已被證實可以成功編譯
KVM:
■Sun C Compiler 5.0, 5.2 and 5.3 on Solaris,
■GNU C 2.91.66 (egcs-1.1.2) compiler on Red Hat Linux,
■GNU C 2.95.2 compiler on Solaris and Windows NT 4.0,
■Microsoft Visual C++ 6.0 Professional on Windows NT 4.0 and Windows2000
4。
KVM源碼概覽
4.1目錄結構概覽
解壓
KVM包後,在你的目錄下生成如下子目錄。(假定父目錄為J2ME_cldc1.0.3)
目錄J2ME_cldc1.0.3:
■api-Java類庫源碼
■bin-可執行文件,編譯的類庫
■build-編譯用的makefile
■docs-說明文件
■jam-JAM(Java Application Manager)源碼
■kvm-
KVM源碼
■samples-試例程序源碼
■tools-輔助工具的源碼(如JavaCodeCompact, preverifIEr,kdp,palm tool等)
目錄J2ME_cldc1.0.3\kvm:
■VmCommon-所有公用的,平台無關的
KVM源碼都在該目錄下
■VmExtra-公用的,可選的組件的源碼
■VmUnix-針對Unix
■VmWin-針對Windows
目錄J2ME_cldc1.0.3\kvm\VmCommon:(所有公用的,平台無關的
KVM源碼)
■h-include文件
■src-源碼
注:當你要port時,可以把你自己平台相關的源碼置於kvm目錄之中。例如我要port
到WinCE我可以這樣安排我的源碼(kvm\VmWinCE\src-我的源碼,kvm\VmWinCE\h-
我的頭文件,kvm\VmWinCE\build-我的makefile)。
4.2
KVM源碼功能簡述
在j2me_cldc1.0.3\kvm\VmCommon\src和J2ME_cldc1.0.3\kvm\VmCommon\h中包含
了
KVM所有公用的,平台無關的源碼和頭文件,如下表所示:
------------------------------------
File Description
------------------------------------
StartJVM.c VM的啟動和命令行的讀取
bytecodes.c Java bytecodes的定義,自
KVM1.0.2後,bytecode解釋器被
從新設計,這部分從interpret.c分離出來。你可以定制VM,
使用這裡定義的bytecode的子集或超集。
cache.h 內聯緩存(inlinecaching)的支持,用以加快方法檢索(
cache.c method lookup)的速度,並支持“fast” bytecodes.(注:
關於methodlookup請參考JLS15.12.4)
class.h 運行時Java類的內部數據結構和操作
class.c
events.h 實現事件處理系統
events.c
execute.h 解釋器的執行宏和操作
execute.c
fIElds.h 用以存儲不同類型的域(fIEld)的運行時內部結構。當一個
fIElds.c
新類被載入VM時,就會生成一張由這些域組成的表。
frame.h 定義棧幀(stack frame)和異常處理(exceptionhandling
frame.c
)的操作。
garbage.h 垃圾處理器和內存管理。
garbage.c
collector.c
collectorDebug.c
global.h 大量全局變量的定義
global.c
hashtable.h 實現VM內部使用的哈希表
hashtable.c
interpret.h bytecode解釋器。
interpret.c
loader.h 類載入器。
loader.c
log.h 記錄並輸出運行時VM的診斷信息
log.c
long.h 處理64bit運算的特殊的宏
main.h 編譯的選項及系統的預制設定。
messages.h 錯誤與警告信息
native.h JVM所需的native函數和核心native庫,注意,
KVM是不使用
native.c JNI(Java Native Interface)的,JNI對小設備來說開銷太大
nativeCore.c 了。
pool.h 常量池(Constant pool)的管理。
pool.c
profiling.h 用以描述VM的執行的數據聲明與操作
profiling.c
property.h 取得Java系統特性的操作。
property.c
rom.h ROMizer(JavaCodeCompact tool) 所需的宏.
runtime.h 平台特有的操作的函數原型定義,注意這裡定義的函數通過
一個runtime_md.c來實現。這也就是說runtime_md.c是建立
在你想要port的平台特性之上的。
stackmap.c Stackmap操作用於支持額外的垃圾收集。
thread.h 多線程的支持與Java的線程管理。
thread.c
verifIEr.h 類文件審核器
verifIEr.c
------------------------------------
在j2me_cldc1.0.3\kvm\VmExtra\src和J2ME_cldc1.0.3\kvm\VmExtra\h中包含
了
KVM所有外加的公用平台無關的源碼和頭文件,其中主要包括Windows、Unix下最
常見的網絡協議的實現;把類載入目標平台的文件接口(該目標平台擁有一個常規
的文件系統);檢視,解壓縮JAR文件的工具;還有Jave級的debugger和KDWP(
KVM Debug Wire Protocol)接口的實現。除了上述之外,還包括一些用來處理異步
事件的額外的宏,並定義了VM的一些在非嵌入式,基於命令行的系統(如Windows和
Solaris)上運行所需要的啟動操作。
\VmExtra中的文件如下表所示:
----------------------+--------------------------------------------------+
文件 描述
----------------------+--------------------------------------------------+
async.h 支持異步I/O的宏。
loaderFile.c 從文件系統中載入Java類文件的操作。
main.c 缺省的main程序,用於具備文件系統並支持VM從命令行啟
動的平台。
jar.h 閱讀、解壓Jar文件的相關操作。
inflate.h
inflateint.h
inflatetables.h
jar.c
inflate.c
commProtocol.h Windows、Unix下常見的網絡協議的實現,如串行端口通
commProtocol.c 訊,套接字(socket),數據報(datagram)等。
socketProtocol.h
socketProtocol.c
datagramProtocol.h
datagramProtocol.c
resource.c 讀取外部資源的流式(stream-based)協議的實現。
debugger.h Java級debugger和KDWP接口的實現。
debugger.c
debuggerCommands.h
debuggerStreams.h
debuggerInputStream.c
debuggerOutputStream.c
debuggerSocketIO.c
fakeStaticMemory.c 內存管理的定義,可以使
KVM在Windows/Unix下模擬特
殊的USESTATIC模式(也稱"simonizing"),以便調試。
這種模式最初是為Spotless/
KVM系統開發的,用以克服
一些Palm獨有的內存限制。
nativeSpotlet.h 定義事件處理的底層操作和對宿主操作系統的事件的截
nativeSpotlet.c
取例程,以及為事件調用已注冊的handler方法。
(注:我在實際的目錄下找不到該文件。??)
---------------------+-------------------------------------------------+