KVM Porting 指南(转贴)
http://www.3geye.net/bbs/thread-183-1-1.html
KVM Porting 指南(转贴) | |
KVMPorting指南(转贴) 英文原名:KVMPortingGuide(KVM1.0.3) 翻译:Ding E-mail:[email protected] 本文是j2me_cldc-1_0_3附带的KVMPortingGuide的翻译,对移植KVM到特定 的平台上很有参考价值。原书有100多页,我尽量把它译完,但时间有限,能否完 成我也无法确保。希望对有志于portKVM的朋友有所帮助。如果有什么错漏之处, 或是您觉得不妥的地方,欢迎您email我,讨论商榷。 如您要转贴,请保留原出处,并勿做删改。谢谢。 1。KVM简介 KVM(KVirtualMachine或称KJavaVirtualMachine)是一种小巧,易于 移植的JVM,被专门设计用来支持小型的,资讯有限的设备,例如手机,PDA等。 KVM团队的最高设计目标是开发一个最小的且“完整"的JVM,它必须能提供对 核心Java语言的支持并能运行在资源有限的设备上(例如只有几十到几百Kb)。 更规范的说,KVM的设计要点有: ·小型,VM的核心只占据大约60Kb的静态内存空间。(根据不同的平台或编译 选项有所不同) ·轻巧易于移植。 ·模块化,易于定制。 ·尽量做到既“完整”又“快速”。 KVM是用C语言实现的,因此可以方便的移植到许多平台上,只要你能找到该平 台的Ccompiler。KVM是J2ME的一部分,KVM通常被作为CLDC和MIDP构架的底层实现。 KVM是由sun实验室最初的Spotless系统发展而来。(注:sun最初提出KJava是用来 开发palmos的,那时Palm上的Kjava程序称为Spotlet,类似于今天的MIDlet。) 2。KVM1.0.2与KVM1.0.3的区别 主要包括: ·性能优化-重新设计了显示/同步操作(monitor/synchronization),优化了 JavaCodeCompact工具的代码产生方式。优化了字符串操作(string)。 ·增强了事件(even)处理系统,异步输入输出模式(asynchronousI/O)以及 networking库(用来使CLDC和MIDP联系的更加紧密)。 ·增强了Java级的debug接口,预检验器(preverifier)和紧缩的垃圾收集器 (garbagecollector)。 ·更有效的JAM(JavaApplicationManager)。 ·Windows/Unix版的KVM可以在命令行中调整堆(heap)的大小。 3。对编译器的要求 你的Ccompiler必须兼容ANSI-C(这好像不算什么要求^-^)你的compiler必 须定义基本数据类型如下: 表1-基本数据类型 ------------------------------ TypeDescription ------------------------------ char8-bit signedchar8-bit unsignedchar8-bit shortsigned,16-bit unsignedshortunsigned16-bit intsigned,16or32bits. unsignedint16or32bits. longsigned,32-bit unsignedlong32-bit(注:注意在Java语言里long为64bit) void*32-bitpointer ------------------------------ 如果你的J2MEconfiguration或profile支持浮点数,那你的编译器还必须支持 浮点类型如下: ---------------------- TypeDescription ---------------------- float32-bitfloatingpointvalue double64-bitfloatingpointvalue ---------------------- 我们的参考实现(referenceimplementation)只在指针长度为32bit的机器上做 了测试,我们并不能保证在具有长指针(farpointer)或其他类型的指针的平台上 运行。 下列compiler已被证实可以成功编译KVM: ■SunCCompiler5.0,5.2and5.3onSolaris, ■GNUC2.91.66(egcs-1.1.2)compileronRedHatLinux, ■GNUC2.95.2compileronSolarisandWindowsNT4.0, ■MicrosoftVisualC++6.0ProfessionalonWindowsNT4.0andWindows2000 4。KVM源码概览 4.1目录结构概览 解压KVM包后,在你的目录下生成如下子目录。(假定父目录为j2me_cldc1.0.3) 目录j2me_cldc1.0.3: ■api-Java类库源码 ■bin-可执行文件,编译的类库 ■build-编译用的makefile ■docs-说明文件 ■jam-JAM(JavaApplicationManager)源码 ■kvm-KVM源码 ■samples-试例程序源码 ■tools-辅助工具的源码(如JavaCodeCompact,preverifier,kdp,palmtool等) 目录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.2KVM源码功能简述 在j2me_cldc1.0.3\kvm\VmCommon\src和j2me_cldc1.0.3\kvm\VmCommon\h中包含 了KVM所有公用的,平台无关的源码和头文件,如下表所示: ------------------------------------ FileDescription ------------------------------------ StartJVM.cVM的启动和命令行的读取 bytecodes.cJavabytecodes的定义,自KVM1.0.2后,bytecode解释器被 从新设计,这部分从interpret.c分离出来。你可以定制VM, 使用这里定义的bytecode的子集或超集。 cache.h内联缓存(inlinecaching)的支持,用以加快方法检索( cache.cmethodlookup)的速度,并支持“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定义栈帧(stackframe)和异常处理(exceptionhandling frame.c )的操作。 garbage.h垃圾处理器和内存管理。 garbage.c collector.c collectorDebug.c global.h大量全局变量的定义 global.c hashtable.h实现VM内部使用的哈希表 hashtable.c interpret.hbytecode解释器。 interpret.c loader.h类载入器。 loader.c log.h记录并输出运行时VM的诊断信息 log.c long.h处理64bit运算的特殊的宏 main.h编译的选项及系统的预制设定。 messages.h错误与警告信息 native.hJVM所需的native函数和核心native库,注意,KVM是不使用 native.cJNI(JavaNativeInterface)的,JNI对小设备来说开销太大 nativeCore.c了。 pool.h常量池(Constantpool)的管理。 pool.c profiling.h用以描述VM的执行的数据声明与操作 profiling.c property.h取得Java系统特性的操作。 property.c rom.hROMizer(JavaCodeCompacttool)所需的宏. runtime.h平台特有的操作的函数原型定义,注意这里定义的函数通过 一个runtime_md.c来实现。这也就是说runtime_md.c是建立 在你想要port的平台特性之上的。 stackmap.cStackmap操作用于支持额外的垃圾收集。 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( KVMDebugWireProtocol)接口的实现。除了上述之外,还包括一些用来处理异步 事件的额外的宏,并定义了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.hwindows、Unix下常见的网络协议的实现,如串行端口通 commProtocol.c讯,套接字(socket),数据报(datagram)等。 socketProtocol.h socketProtocol.c datagramProtocol.h datagramProtocol.c resource.c读取外部资源的流式(stream-based)协议的实现。 debugger.hJava级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方法。 (注:我在实际的目录下找不到该文件。??) ---------------------+-------------------------------------------------+ |