快捷搜索:

KVM简介和编译

KVM(K Virtual Machine)是SUN公司的一种主要面向嵌入式设备的小型Java虚拟机,在PC机上也能应用。

KVM最大年夜的特征是极为小巧,只有一个可履行文件,大年夜概200K多一点。响应地,KVM的功能也很弱,它只有cldc1.1的类库,以是没有图形界面;它也没有采纳优化技巧来前进机能,是一种对照原始的虚拟机。

正由于KVM的小巧和简单,它是Java喜欢者钻研虚拟机的抱负入门课本。而且它是开源的,在http://www.sun.com/software/communitysource/j2me/cldc/download.xml可以下载到。

本人今朝正在对KVM进行深入钻研,并乐意把所学到的内容以blog的形式宣布出来与大年夜家分享,请大年夜家给以辅导。我的MSN是 fyzhao2004@hotmail.com,盼望有合营喜欢的同伙能和我取得联系,交流履历,合营进步。

编译历程:

以PC-Linux平台为例,编译用的主Makefile在build/linux目录下,在默认的环境下,只要系统中安装有gcc,输入make敕令就可以完成编译,并在kvm/VmUnix/build目录下天生可履行文件kvm。Kvm本身便是完备的可履行文件,不必要依附于其它的库和文件。

查看build/linux目录下的Makefile文件,可看到make会分手再到其它4个目录中再去编译,下面分手看每一次编译所做的事情:

1、tools/preverifier/build/linux/Makefile – 在tools/preverifier/build/linux目录中有一些源文件,它们是与虚拟机相自力的,这个Makefile的感化便是把这些源文件编译成可履行文件preverifier,即“预验证器”。预验证器只能在PC平台上事情,它的感化是完成class文件字节码的验证。

字节码的验证原先是Java虚拟机在载入类时所进行的一次安然反省,为什么在这里,在虚拟机之外,也要进行一个验证呢?这与KVM应用系统类库的要领有关:

平日,虚拟机只是一个Java法度榜样的运行框架,要应用某个类时,就从文件系统或者收集等媒体载入,以是,共同虚拟机应用的经常要有一个类库,用于寄放系统自带的class文件。比如在JDK的lib目录下寄放了一些jar文件,它们就会在必要的时刻被装载。

kvm是针对嵌入式设备所设计的小型虚拟机,假如再配套一个外接的类库就会很未方便,盼望类库也能集成在可履行文件中。但Java是一种动态装载的说话,要把类库放到可履行文件中,就要首先反类库“静态化”。在静态化的历程中,首先就要载入类,并包管字节码的安然性,以是也要有验证,这里天生的preverifier便是用来验证类文件的。与虚拟中的验证器不合的是,preverifier的输入是类文件,输出也是类文件,只不过输出的类文件已经是被验证过的了,应用时不必要再进行验证,preverifier相称于class文件在应用之前就进行了一次验证,以是这个验证器被称为“预验证器”。

2、api/Makefile – 在api目录下寄放有cldc1.1的所有Java源文件,这个Makefile的感化首先是把Java源文件编译成.class文件,当然这要调用本机的javac,要确保PC上安装有JDK;编译完成后,调用上面天生的preverifier进行预验证,颠末预验证的class已经是安然的;接下来把class文件打包成classes.zip。

3、tools/jcc/Makefile – 这便是把类库“静态化”的地方,在此中会调用java敕令把classes.zip里的class文件转化成C源文件。

4、kvm/vmunix/src/Makefile – 这是着末的一步,所把有虚拟机的源文件和第3步所天生的类库的源文件编译并连接成可履行文件kvm。

交叉编译要留意的问题:

假如是要在嵌入式设备上应用kvm,就会必要应用arm-linux-gcc来编译。由以上的编译历程可知,前三个步骤都是只能在PC上完成的,只有着末一个步骤是面向目标平台的。以是只要改动kvm/vmunix/src/Makefile中的CC为arm-linux-gcc就可以编出可以在嵌入式设备上运行的kvm啦。

您可能还会对下面的文章感兴趣: