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 文件在使用之前就进行了一次验证,
所以这个验证器被称为“预验证器”。