分类: LINUX
2009-06-24 13:54:23
到今天为止,移植KVM虚拟机的工作可以说是大概完成了,还有一点小的缺陷,但先把整个过程说一下吧。
所做的工作的目的是把以CLDC1.1为基础的KVM和移植到CPU是以ARM体系结构,以linux为嵌入式操作系统的开发板上。我们这里所说的linux并不是uClinux,而是一般的linux。下面说一下交差编译的环境:
建立交差编译环境
好!环境介绍完后,首先要介绍一下建立交差编译环境。其实这个我也没做过,把linux操作系统的镜像拿来后,环境就在了。但从别人的文章和linux上可以看出,环境搭配并不难。主要是把JDK下载下来,要下载那种支持UNIX的,以bin为后缀的文件,安装的过程就不说了。然后再把交差编译工具解压,先bunzip2 cross -2.95.3.tar.bz2,然后再tar xvf cross -2.95.3.tar。再把下载的KVM源文件j2me_cldc-1_1-fcs-src-winunix.zip解压到文件夹。
接下来是设置环境变量,首先先设置Arm-linux-gcc 2.95.3交差编译工具的路径,打开/etc/profile或是 ~/.bash_profile,在上面添加以下一句:
export PATH=/usr/local/arm/2.95.3/bin:$PATH
JAVA_HOME=/usr/local/JAVA/j2sdk
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/lib:.
export JAVA_HOME PATH CLASSPATH
第一句是为了可以随时调用arm-linux-gcc命令;第二句是设置JAVA_HOME环境变量,主要还是为了方便写三、四句。第三句和第一句的作用一样,是为了可以随时调用到java及javac命令。第四句是为了方便引用JAVA类库。
在这里要注意的是,第三句“$JAVA_HOME/bin:$PATH”都是把原来的系统环境变量PATH加到“$JAVA_HOME/bin”的后面,形成一个新的环境变量,如:原来PATH的内容为“abcdefg”,用“PATH=$JAVA_HOME/bin:$PATH”之后,就变成了“$JAVA_HOME/bin:abcdefg”。在这里,千万不能写成“PATH=$PATH :$JAVA_HOME/bin”,也就是把“$PATH”放到前面,这样一来就变成“abcefg:$JAVA_HOME/bin”了。你可能奇怪会问,这有什么不行的呢?原因是这样的,CentOS自带了一个jre,版本是
java -classpath classes JavaCodeCompact \
\
-arch KVM_Native -o nativeFunctionTableUnix.c classesUnix.zip
Exception in thread "main" java.lang.NoClassDefFoundError: while resolving class:
JavaCodeCompact
at java.lang.VMClassLoader...............................
at java.lang.Class..................................................
Caused by: java.lang.ClassNotFoundException: sun.misc.Compare not found in [file:classes/,
file:/usr/share/java/libgcj-
at java.lang.Class..................................................
at java.lang.Class..................................................
make[2]: *** [nativeFunctionTableUnix.c] Error 1
make[2]: Leaving directory `/usr/local/JAVA/j2me_cldc/tols/jcc'
make[2]: *** [nativeFunctionTableUnix.c] Error 2
make[1]: Leaving directory `/usr/local/JAVA/j2me_cldc/tols/jcc'
make: *** [all] Error 1
错误提示我在解析JavaCodeCompact.class这个类时找不到sun.misc.Compare这个类。我上网上找了一下,sun.misc.Compare这个类包里的类主要是sun公司开发JVM时内部用的一个类包。这时我看到在找sun.misc.Compare这个类包时的路径是:file:classes/, file:/usr/share/java/libgcj-
修改文件
这里,我们要修改的只有两处,那就是j2me_cldc/kvm/VmUnix/build/Makefile文件。因为我们的KVM是要运行在arm-linux(这里cpu为arm体系结构,操作系统为linux的开发板简称为arm-linux)系统上。所以,KVM必须用arm-linux-gcc编译器编译。我们打开Makefile文件,把
ifeq ($(GCC), true)
CC = gcc
………...
else
处的gcc改成arm-linux-gcc:
ifeq ($(GCC), true)
CC = arm-linux-gcc
………...
Else
第二处就是j2me_cldc/kvm/VmUnix/src/runtime_md.c文件,把这个文件中void InitializeFloatingPoint()函数中的两句注释掉,如:
#if defined(LINUX) && PROCESSOR_ARCHITECTURE_X86
/* Set the precision FPU to double precision */
// fpu_control_t cw = (_FPU_DEFAULT & ~_FPU_EXTENDED) | _FPU_DOUBLE;
// _FPU_SETCW(cw);
#endif
这样,就不会出现错误了,但也不支持浮点数了。这里我还不知道如何才能让它支持浮点数,并不出现错误。
最后,我们进入j2me_cldc/build/linux目录,执行make命令,这样,就会顺序完成。