1、Tsinghua University嵌入式系统实验报告Java 虚拟机 Kaffe 移植1 | Page实 验 任 务将 Java 虚拟机 Kaffe 移植到 Sitsang 平台上部署的 Linux 中。实 验 目 的1. 通过实验熟悉 Java 虚拟机的实现,学习 Kaffe 的代码。2. 在实验过程中逐渐理解交叉开发模式,掌握交叉编译技术。3. 提高阅读文档的能力。实 验 内 容平 台 搭 建 开发环境:Ubuntu 9.04 gcc-4.4 调试环境:Windows XP SP2 Kaffe 版本: 1.1.9 1.1.4在 SITSANG 平 台 上 安 装 LINUX这一步骤即为
2、基础实验的重复。主要包括以下几部分内容:1. 通过 Jflashui 将 RedBoot 烧录进实验板。2. 通过超级终端与 RedBoot 通信,将打过 patch 的 Linux 内核和 jffs2 文件系统通过以太网接口传入实验板。3. 将存在于内存的 Linux 内核和文件系统烧录到 flash 芯片上。这里应当注意的是,在将 jffs2 文件系统烧录到 flash 芯片时,执行以下命令,fis create JFFS2 -b 0xa0800000 -l 0x01800000 f 0x00200000应将参数 0x01800000 改为 0x03400000,即将文件系统的大小由 24
3、M 改为 52M。因为 kaffe 编译完成之后需要十几兆的空间,加之其他的链接库文件,实验指导书中所原有的 24M 大小已经不能满足空间的需要,需要将其改大。通过命令fis list可以查看 flash 芯片上已经存在的分区大小,可以看到将 jffs2 文件系统的大小调整为 52M,不会对已有的分区造成影响。在 PC 上 编 译 KAFFE2 | Page由于交叉编译 Kaffe 时需要用 Kaffe 中的 kaffeh 程序将 Java 的 Native Library 转换成 C 的头文件和源代码以便于 Java 程序和 C 的 Native Library 进行连接,所以需要有一个可以
4、在 PC 上运行的kaffeh,也就需要在 PC 上编译一遍 Kaffe。将下载到的 Kaffe 源代码解压缩,按照文档,顺序执行如下命令:./configuremakemake install就可以编译并安装 Kaffe 到/usr/local/kaffe。不过实际操作的时候,由于我们的实验环境是默认配置全新安装的 Ubuntu,缺少很多必要的库,在 configure 时遇到了种种提示。将需要的库都下载、编译、安装之后,成功在 PC 上编译出Kaffe。此时我们测试了 test 目录下的测试 java 程序,确认 Kaffe 能够正确运行。KAFFE1.1.9交 叉 编 译 KAFFE1.
5、1.9在 PC 上编译完成 kaffe 之后,我们便进行开始交叉编译 kaffe 的工作,但在编译的过程中却出现了诸多的问题,主要是交叉编译环境中缺少 kaffe 必要的库文件所致。交 叉 编 译 ZLIB在交叉编译 Kaffe 时,提示找不到 zlib。下载最新版本的 zlib 源代码,并用如下命令叉编译:export PATH=/usr/local/arm-linux/bin:$PATH./configure -host=arm-linux -build=i686-linux发现 zlib 并不支持-host 参数,因此换成CC=arm-linux-gcc LD=arm-linux-ld
6、./configure发现 arm-linux-ld 命令并不能将编译的结果连接起来,原因不明,最终使用以下的命令,CC=arm-linux-gcc ./configure -prefix=/usr/local/arm-linux3 | Pagemakemake install将 zlib 的相应文件安装到交叉编译环境中去。交 叉 编 译 ZZIP在交叉编译 Kaffe 时,提示找不到 libzzip,因此在交叉编译环境中安装 zzip。export PATH=/usr/local/arm-linux/bin:$PATH./configure -prefix=/usr/local/arm-li
7、nux -host=arm-linux -build=i686-linux -with-zlib=/usr/local/arm-linuxmakemake install将 zzip 安装到交叉编译环境中交 叉 编 译 LIBLTDL在交叉编译 Kaffe 时,提示找不到 libltdl,因此在交叉编译环境中安装 ltdl。export PATH=/usr/local/arm-linux/bin:$PATH./configure -prefix=/usr/local/arm-linux -host=arm-linux -build=i686-linuxmakemake install将 ltd
8、l 安装到交叉编译环境中编 译 选 项在交叉编译 kaffe 的过程中,需要的库的数量远远超出了我们的预期,有些库的安装又需要其他的库文件,形成了递归的交叉编译的局面,工作量实在太大。因此我们考虑是不是可以通过configure 选项的方式,禁掉一些功能而解除库的依赖关系。首先,kaffe 上的图形组件需要 x11 或者 qt,这两个组件在 sitsang 上均没有实现,因此加上相关的编译选项。其次,指定 zzip 为我们交叉编译的 zzip。4 | Page最终的编译过程如下:export KAFFEH=/usr/local/kaffe/bin/kaffehexport PATH=/usr/
9、local/arm-linux/bin:$PATH./configure -prefix=/usr/local/arm-linux/kaffe -host=arm-linux -build=i686-linux -with-includes=/usr/local/arm-linux/include -with-libraries=/usr/local/arm-linux/lib -with-engine=intrp -enable-pure-java-math -disable-sound -without-x -disable-gtk-peer -without-classpath-gtk-
10、awt -without-kaffe-qt-awt -without-kaffe-x-awt -enable-debug ZZIP_LIBS=/usr/local/arm-linux/lib/libzzip.la -disable-Werror -enable-xscalemakemake install并成功通过编译,在/usr/local/arm-linux/kaffe 目录下生成了所需的各种文件。移 植 KAFFE1.1.9先将编译生成的 kaffe 目录打包为 kaffe.tar.gz,并在主机上建立 ftp 服务器。通过 telnet 和 sitsang 板进行通信,在 sitsan
11、g 上通过 ftp 客户端压缩包下载到 sitsang 上。通过命令tar zvxf kaffe.tar.gz将 kaffe 解压到 /usr/local/arm-linux/kaffe 目录下。测 试 KAFFE1.1.9通过 ftp 上传一个编译好的 HelloWorld 程序的 class 文件 Hello.class进入/usr/local/arm-linux/kaffe/bin 目录下,运行如下命令./java成功出现了帮助信息运行如下命令,./java Hello5 | Page出现了错误提示,未找到 java 核心库 javanio.so 等一系列错误。经过我们的分析,我们认为应
12、该在 sitsang 平台上安装 classpath。交 叉 编 译 CLASSPATH编译 classpath 需要禁用 classpath 的一些功能,从而不需要 sitsang 上所没有的库文件。经过不断的尝试,终于通过以下命令交叉编译 classpathexport PATH=/usr/local/arm-linux/bin:$PATH./configure -host=arm-linux -prefix=/usr/local/arm-linux -disable-gtk-peer -disable-gconf-peer -disable-plugin -with-jnimakemak
13、e instal将位于/usr/local/arm-linux/lib/classpath 目录下的各种 java 库文件移植到 sitsang 板上之后。运行命令./java Hello出现了一个为ExceptionInitializerError的异常,对于这个问题,我们认为应当是硬件的配置与代码中的定义不符造成的,但是我们研究了很久依然没有找到解决的方法,因此最终放弃了 kaffe1.1.9KAFFE1.1.4我们仔细考察了 kaffe 的各个版本之后,认为,高版本的 kaffe 由于实现了很多的额外功能,移植中出现的问题必然会多一些,因此我们决定移植一个低版本的 kaffe 试试看。我
14、们选择了 kaffe1.1.4 版本。由于之前的 kaffe1.1.9 的工作,已经将各种需要的库文件移植到sitsang 板上,因此,在编译 kaffe1.1.4 的过程中,没有出现任何问题,很顺利的完成了编译工作。交 叉 编 译 KAFFE1.1.4进行 Kaffe 的交叉编译,命令如下:6 | Pageexport KAFFEH=/usr/local/kaffe/bin/kaffehexport PATH=/usr/local/arm-linux/bin:$PATHCC=arm-linux-gcc ac_cv_c_char_unsigned=yes ./configure -prefix
15、=/usr/local/arm-linux/kaffe -host=arm-linux -build=i386-linux -target=arm-linux -enable-pure-java-math -with-awt=no -with-jar=/usr/local/arm-linux/classpath/share/classpath/glibj.zip -with-engine=jit -disable-soundmakemake install移 植 KAFFE1.1.4先将编译生成的 kaffe 目录打包为 kaffe.tar.gz,并在主机上建立 ftp 服务器。通过 teln
16、et 和 sitsang 板进行通信,在 sitsang 上通过 ftp 客户端压缩包下载到 sitsang 上。通过命令tar zvxf kaffe.tar.gz将 kaffe 解压到 /usr/local/arm-linux/kaffe 目录下。测 试 KAFFE1.1.4通过 ftp 上传一个编译好的 HelloWorld 程序的 class 文件 Hello.class进入/usr/local/arm-linux/kaffe/bin 目录下,运行如下命令./java Hello出现了我们一直期待的画面。7 | Page至此,kaffe 在 sitsang 板上移植成功。实 验 总 结到
17、此为止,本学期嵌入式系统的实验基本就结束了。从开始的基础实验,到最后的创新实验,我们觉得收获了很多。最重要的是,我们了解了如何进行嵌入式系统的移植和简单开发,在此之前,我们并没有了解过类似的知识,也并没有过类似的实验经验。我们非常感谢老师为我们提供详细的基础实验指导书,让我们能够顺利的完成基础实验,同时对于一些基本的嵌入式系统移植及开发相关的技术有了一定的了解,为后续的创新实验打下了良好的基础。对于创新实验,我们完成了在 sitsang 板上移植 kaffe 虚拟机,虽然与我们之前的预期目标还有一定的差距,但是我们也最终实现了 sitsang 板上的一次移植。对于嵌入式系统的移植有了比较深的了
18、解与认识。当然我们的创新实验过程中也存在一定的不足,总结如下:首先作为大四的一门课,我们组内同学积极性不是像大三那么高,对于实验本身兴趣也不是很大,所以能够提供的帮助也就不是很多,我们觉得这是最重要的一个问题。正是由于大家的积极性都不是很高,所以整个实验过程就比较拖沓,前面很长一段时间,直到中期检查,我们实际上都并没有做很多事情,这就导致了后面我们的时间有点紧张,甚至直接影响到了我们缩减实验目标。我们认为这是最需要总结的地方。谈一下我们的主要收获。在移植 kaffe 的过程中,我们遇到了很多的问题。从刚开始完全不知道如何交叉编译,一步一步摸索。刚开始就在 PC 上用 gcc 编译,在这一步就发
19、现了很多问题,我们发现我们的 ubuntu 系统缺少了很多库,导致了一些错误,我们安装一个库,就出现了另一个新的错误,就这样不断重复,最终编译成功了。现在回过头来看,在 PC 上编译成功可以算是一个新的节点,但是离最终完成还有很长一段距离。后来开始进行交叉编译,在编译的过程中,我们发现交叉编译工具链版本有点旧,里面缺少一些交叉编译的库,于是我们又开始重复之前的工作,只不过这一次全部变成了交叉编译,在经过很多次“递归”交叉编译以后,我们最终编译成功。即使这样了,在把编译好的东西传到 sitsang 板的过程中,我们也遇到了很多问题,经过很长时间的努力,我们移了上去。但是最终 kaffe 1.1.9 还是没有成功运行,我们查找了很多材料,也重新8 | Page交叉编译,重新上传,重新测试了很多遍,但是还是没有发现问题在哪。最终我们移植了 kaffe 1.1.4 版本, anyway,我们还是成功移植了一个 kaffe。体验到了实验成功的喜悦,的确,在不断调试不断测试的那几天时间里,我们组的心情还是很郁闷的,特别是周围同学一组一组都已经查完实验了之后。最后感谢陶品老师,郑宁汉老师以及助教对我们的帮助!谢谢!