设为首页 收藏本站
查看: 1025|回复: 0

[经验分享] KVM Porting 指南(转贴)

[复制链接]

尚未签到

发表于 2016-1-8 10:16:24 | 显示全部楼层 |阅读模式
  http://www.3geye.net/bbs/thread-183-1-1.html
  
  
KVM Porting 指南(转贴)
KVM Porting 指南(转贴)
英文原名:KVM Porting Guide (KVM 1.0.3)

  翻译:Ding

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方法。
                     
                     (注:我在实际的目录下找不到该文件。??)
---------------------+-------------------------------------------------+      

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-161776-1-1.html 上篇帖子: KVM中使用usb设备 下篇帖子: Ubuntu下KVM的安装配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表