E-mail:wu_yi_ding@yahoo.com
本文是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方法。
(注:我在实际的目录下找不到该文件。??)
---------------------+-------------------------------------------------+