收藏 分享(赏)

arm9平台上kvm移植的研究和实现_0.doc

上传人:天天快乐 文档编号:1177546 上传时间:2018-06-17 格式:DOC 页数:7 大小:38KB
下载 相关 举报
arm9平台上kvm移植的研究和实现_0.doc_第1页
第1页 / 共7页
arm9平台上kvm移植的研究和实现_0.doc_第2页
第2页 / 共7页
arm9平台上kvm移植的研究和实现_0.doc_第3页
第3页 / 共7页
arm9平台上kvm移植的研究和实现_0.doc_第4页
第4页 / 共7页
arm9平台上kvm移植的研究和实现_0.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

1、 ARM9 平台上 KVM 移植的研究和实现摘 要: 在移动应用开发中,为了将 J2E 技术应用到 AR9 嵌入式平台上,需要事先在该AR9 平台上成功移植 KV。但是,在将 SUN 公司的 LD 1.1 参考实现移植到 AR9 平台的过程中,由于编译工具版本更新导致的编译工具与参考实现之间的版本不兼容问题,影响了 KV的成功移植。为此,研究了 KV 的代码执行机制,并分析了 SUN 公司的 LD 1.1 参考实现的build 过程。在此基础上,采用目前主流编译器来移植 KV,对编译生成 KV 各个阶段产生的所有错误和警告进行了深入分析,并给出了消除那些影响移植结果的错误和警告的适当解决方法。

2、所提出的解决方法不仅实现了参考实现源码的成功编译,而且提高了移植后 KV程序的健壮性。KV 移植测试的实验结果表明,KV 成功地被移植到了 AR9+Ebedded Linux 平台上。关键词: 移动应用开发; J2E; LD; KV 移植中图分类号:TP399 文献标志码:A 编号:1006-8228(2012)05-22-04The researh and ipleentatin f KV prting n AR9 platfrsYi Jiaang, ang Bin, Xia Hui, Hu Hai(Shl f puter uniatin Engineering, hangsha Unive

3、rsity f Siene Tehnlgy, hangsha, Hunan 410004, hina)Abstrat: In bile appliatin develpent, e need t suessfully prt KV t AR9 ebedded platfrs befre e use J2E tehnlgy n AR9 platfrs. Hever, in the press f prting SUN s LD 1.1 referene ipleentatin t AR9 platfrs, the versin inpatibility prble beteen piling t

4、ls and the referene ipleentatin, hih is brught by versin updating f piling tls, leads t failure in KV prting. This paper studies the ehanis f exeuting KV de, and analyses the building press f SUN s LD 1.1 referene ipleentatin. Based n this rk, the paper uses urrently ppular piling tls t prt KV, anal

5、yses in depth all the errrs and arnings prdued in phases f building KV, and gives the apprpriate slutins t eliinate thse errrs and arnings hih affet the prting result. Slutins prpsed in the paper nt nly ahieve the suess f piling referene ipleentatin sure de but als iprve the rbustness f prted KV prg

6、ras. The experiental results f KV prting tests sh that KV is suessfully prted t an AR9 + Ebedded Linux platfr.Key rds: bile appliatin develpent; J2E; LD; KV prting0 引言目前移动手机上运行的操作系统种类繁多,包括 Linux、inds bile、Pal S、Sybian S、Ggle Andrid 等。Java 和 J2E 技术克服了手机平台多样性造成的应用程序移植困难的问题,为移动应用程序的跨平台开发和运行提供了可能。J2E 是

7、Sun 公司面向具有有限硬件资源的设备的 Java 版本,这些资源受限的设备包括PDA、手机、机顶盒和其它消费电子设备与嵌入式设备 1。LD2 和 IDP3已经成为用于移动手机应用开发的 J2E 标准。J2E/LD 技术的核心是 Sun 公司的 KV(Kilbyte Virtual ahine)4。KV 最初设计是用于资源受限的低端移动设备的 JV(Java virtual ahine) 。正是 JV 的存在才使得 Java 具有 一次编译,处处运行 的特征5,6,因此,KV 的移植便成为 J2E 应用于移动开发的首要前提。随着编译工具的不断更新,在编译生成 KV 的过程中不可避免地出现了一些

8、影响移植结果的新问题。对于这些新问题,一部分 KV 移植者沿用较低版本的编译工具以回避版本不兼容问题,而其他移植者虽然处理了新版本编译器带来的错误但却忽视了其产生的大多数警告。这样做要么使得移植后的 KV 与最新编译的 J2E 应用仍可能产生版本不兼容问题,要么使得被忽略的那些警告可能导致程序 bug 从而降低了移植后 KV 的程序健壮性或鲁棒性。为了使移植后的 KV 能够稳定健壮地运行最新编译的 J2E 应用,本文将采用当前主流的编译工具对移植到 AR9 平台上的 KV 源码进行编译,同时对编译产生的所有错误和警告进行分析和研究,并给出消除这些错误和警告的适当解决方法。1 KV 的代码执行机

9、制为了更好地理解 KV 的移植过程,我们需要对 KV 的代码执行机制作一些研究。我们先来看一下 JV 的代码执行机制,在此基础上才能更好地理解 KV 的代码执行机制。Java 源程序(*.java)Java 字节码(*.lass)Java API 类库(*.lass)Java 虚拟机(内含 interpreter)操作系统及电脑硬件 Bytede 结构 编译 运行 翻译成本地代码执行加载及校验加载及校验图 1 JV 的代码执行机制在图 1 中,文本格式的 Java 源程序(文件后缀名为.java)由 Java 编译器编译为 Java 字节码文件(文件后缀名为.lass) ,且每一个 Java

10、类对应一个.lass 文件。在运行阶段,Java 虚拟机先装入或加载指定的 .lass 文件,进行必要的校验,然后找到指定的入口方法(例如 ain) ,由 interpreter 翻译运行 .lass 文件中的字节码7 。虚拟机在执行过程中根据需要(如创建新对象等)动态加载用户程序的其他 .lass 文件或者系统类库的 .lass 文件并校验和运行8。Java API 类库(一个大型的现成软件组件(类)集合)是一些为用户程序运行提供支持或起辅助作用的 .lass 格式的标准的 Java 类,它是 Java 语言的一个标准组成部分。加载过程通常都是被推迟到必要的时候才进行。 JV 中的 inte

11、rpreter一般采用解释的方式执行字节码。它按照程序执行的顺序逐条取出指令字节码,翻译成一段等效的本地代码序列来执行,这个解释执行过程一直重复到程序的最后一条指令执行完为止7。下面我们再来看一下 KV 的代码执行机制(如图 2 所示) 。yApp.Javajava yApp.lasspreverifier 预验证过的yApp.lassverifier interpreter KV 下载到目标设备预验证过的核心 API 类库(*.lass)用 J 处理得到与 api 类库对应的两个.文件J prelink/prelde 指定 LD 类库指定LD 类库图 2 KV 的代码执行机制我们知道,KV

12、需要运行在硬件资源受限的嵌入式设备上,因此有必要对虚拟机的功能进行简化,提高其运行效率,并减小其体积。为此,将虚拟机原本复杂而耗资源的大部分校验工作移出虚拟机,交由 P 开发平台上一个工具软件 preverify 来进行预验证或预校验,从而减轻移动设备的负担,而在 KV 中只留下一个简单的轻量级的校验器6,9。另一方面,由于嵌入式设备硬件资源的限制和减小体积的需要,LD 只包括了必要的 Java核心类库。同时,出于安全性考虑,需要将 P 开发平台上由 preverify 预验证过的 LD 类库 打包 存放到虚拟机中去。这将由 J (Javadepat)工具软件来负责对预验证过的 LD 类库进行

13、处理,并将其预连接或预加载(prelink/prelad)到 KV 中。这样做也可以避免动态加载这些类运行时的开销。因此,我们在编译和预验证用于 KV 的 Java 代码时,需要将-lasspath 选项指定为 LD 类库的路径,然后将预验证过的 lass 文件下载到目标设备由 KV 来执行。2 LD 参考实现移植所用的 KV 源码是来自 SUN 公司的 LD 1.1 参考实现。表 1 中描述了该 LD 1.1 参考实现源码包中的目录结构4。表 1 LD 1.1 参考实现的目录结构子目录 说明 api LD 需要的核心 Java 类库源代码 bin 包含 kv 等所有二进制执行文件和已编译好的

14、核心 Java 类库的 lass 文件 build 用于编译生成面向不同操作系统平台的 KV的 akefile d 相关的说明文档 ja KV 的可选组件 JA(Java Appliatin anager)的源码 kv 面向不同平台的 KV 的源码 tls 一些需要用到的工具软件的源码,如Javadepat,preverifier,KDP Debug Prxy 3 LD 参考实现的 build 过程KV 移植主要是采用合适的编译工具对 LD 1.1 参考实现中的源码进行编译,以生成运行在目标平台上的 kv 可执行文件。用于源码 build 的 akefile 文件根据源码目录的层次结构相应地被

15、组织成一个层次结构。主akefile 文件放在 build 目录中,由这里跳转去执行其它 akefile 文件。在 build 目录中,根据目标平台上操作系统的不同类型分别对应有不同的主 akefile 文件。在主 akefile 文件中可以确定要参与 build 的代码段,api 部分是必选的,kdp 和 j 都是可选的。因为要应用于嵌入式系统,故未选择 kdp。对于 JA(Java Appliatin anageent) ,为简化起见没有选择该部分。所有的选择可以通过修改 akefile 文件中的相关开关选择项值进行,也可在命令行中用参数覆盖。以 AR+Linux 为目标平台对 LD 参考

16、实现进行 build 的操作很简单,只需进入 build/linux 目录,通过 ake 命令执行那个主 akefile 文件,就开始 build 过程了。下面的图 3 描述了其build 过程。编译生成 preverify 工具(x86 平台可执行文件)编译和预验证 api lasses,在压缩得到 lass.zip 文件(预验证过的 api 类库)编辑生成 J 工具(Java 可执行程序),用 J 处理 lass.zip 得到两个.文件,nativeFuntinTableUnix.和 RjavaUnix.将 kv 的*.文件编译为*.目标文件 将 api 类库对应的两个.文件编译为两个.目

17、标文件 将 kv 的*. 文件和 api 类库对应的两个 .文件连接在一起,生成 kv(AR 平台可执行文件) 编译生成 kv,同时将 api 类库预连接到 kv 中图 3 以 AR+Linux 为目标平台的 build 过程4 LD 参考实现的源码编译KV 移植所采用的编译环境为:Java 编译器 Java 1.6.0_22, (Fedra9 自带)X86 平台 G 4.3.0编译器和交叉编译器 Ar-Linux-G 4.3.2。首先,KV 的运行平台是 AR+Linux 平台,所以需要在 KVVUnixbuild 目录中将用于编译 KV的 akefile 文件中的编译器设置为交叉编译器 A

18、r-Linux-G10,即:ifeq($(G),true)=ar-linux-g而 preverify 等工具软件是运行在 X86 平台上的,故无需改变其原采用的编译器。表 2 列出了执行 ake 命令的过程中各个编译对象所采用的编译器。表 2 各个编译对象所采用的编译器编译对象 运行平台 采用编译器 Preverify Tl X86 G Api lasses NA Java J Tl X86 Java KV Ar+Linux Ar-Linux-G 其次,在最终对 KV 源码进行编译之前,需要先对所需工具软件和 API 类库进行编译。因此,LD 源码编译过程包括以下四个阶段:编译生成 prev

19、erify 工具,编译和预验证 API 类库,编译生成 J 工具,编译和连接生成 KV。下面我们对 LD 源码编译过程中各阶段产生的 errrs 和 arnings 进行分析,并给出适当的解决方法。4.1 编译生成 preverify 工具在使用 X86 G 编译 tls/preverifier 目录下的源文件时,编译产生的 errrs arnings 及其解决方法可以见表 3。表 3 编译生成 preverify 时的错误和警告及其解决方法编译错误和警告 解决方法 arning 1:内嵌函数 exit 的不兼容隐式声明 添加语句 #inlude arning 2:传递给 inv 函数的参数

20、2 来自于不兼容指针类型 将第 2 个参数 fr 另存为指向非 nst 类型的指针,并改为传递该指针 对于表 3 中给出的解决方法,说明如下。 arning 1:因为 G 对函数 exit 的隐式声明和内置函数 exit 不兼容,所以需要在 nvert_d.文件中添加语句 #inlude 。 arning 2:用于字符编码转换的 inv 函数的声明为 size_t inv(inv_t d, har *inbuf, size_t *inbytesleft, har *utbuf, size_t *utbytesleft);因为 inv 函数会修改第 2 个参数 inbuf 和第 4 个参数 ut

21、buf 指针所指向的地方,而源码中传递给 inv 函数的第 2 个参数 fr 是指向 nst har 类型的,其值是不能改变的,所以有警告。解决方法是将参数 fr 另存为指向非 nst 类型的指针并改为传递该指针,如下所示。har*fr2=(har*)fr; /需要进行显示类型转换ret=inv(i, fr2, ileft, t, left);4.2 编译和预验证 api 类库在使用 Java 编译 api 目录下的 Java 源文件时,编译产生的 errrs arnings 及其解决方法可以见表 4。表 4 编译 api 类库时的错误和警告及其解决方法编译错误和警告 解决方法 arning:

22、不能映射为 ASII 编码的字符 在 api/akefile 文件中,对于 java 命令添加 -ending p1252 选项 errr:无法访问 java.lang.StringBuilder 类文件 在 api/akefile 文件中,对于 java 命令添加 -sure 1.4 选项 对于表 4 中给出的解决方法,说明如下。 arning:在将 Java 源文件编译为 .lass 文件之前,JDK 需要将源程序文本文件从原编码格式统一转换为 Java 内部默认的 Unide 格式。如果不指定 Java 源文件编码格式,JDK 会以操作系统的默认编码格式作为转换前源文件的编码格式。这里编

23、译环境所用 Linux 操作系统的默认编码格式是 UTF-8(对于英文字母就是ASII 编码) ,因此该 arning 说明转换前源文件编码格式不是 UTF-8。在 vi/vi 中可用 :set fileending 命令查看源文件字符编码格式,结果为 fileending=latin1,这表示源文件采用的是 p1252:inds Latin-1 编码。所以,在 api 目录下的 akefile 文件中,对于 java 命令需要使用 -ending p1252 选项指定源文件编码格式。 errr:java.lang.StringBuilder 类是 JDK1.5 之后出现的11。而核心 api

24、 类库源文件的版本低于 JDK1.6 编译器的版本,所以要在 java 命令中使用 -sure 1.4 选项指定源码版本。4.3 编译生成 j 工具在使用 java 编译 tls/j 目录下的 Java 源文件时,编译产生的 errrs arnings 及其解决方法可以见表 5。对于表 5 中给出的解决方法,说明如下。 arning 1:同表 4 中的 arning。 errr:根据代码可以判断这里的 enu 是用作标识符,所以要在 java 命令中使用 -sure 1.4 选项指定源码版本(之后 enu 处会产生 false arning) 。 arning 2:可以用 Java SE 6

25、API 中的类来替换这两个 Sun 专有 API 类,需要改写相关源代码。为了简化起见这里暂不处理。表 5 编译生成 j 工具时的错误和警告及其解决方法编译错误和警告 解决方法 arning 1:不能映射为 ASII 编码的字符 在 tls/j/akefile 文件中,对于 java 命令添加 -ending p1252 选项 errr:JDK1.5 之后, enu 是关键词,不能被用作标识符 在 tls/j /akefile 文件中,对于 java 命令添加 -sure 1.4 选项 arning 2:使用了 Sun 公司专有的 API 类,即 sun.is.pare 和 sun.is.Sr

26、t,未来版本中可能会被移除 目前版本可以支持,暂不处理。 4.4 编译和连接生成 kv在使用交叉编译器 Ar-Linux-G 编译 KV 目录下的源文件时,编译产生的 errrs arnings 及其解决方法可以见表 6。表 6 编译生成 kv 时的错误和警告及其解决方法编译错误和警告 解决方法 由两个静态函数的预先定义的位置不当引起的一系列错误和警告 将这两个静态函数的预先定义移出所在函数体,并放在该函数体前面 arning 1:整型常数对于 lng 类型太大 在这些整型常数或整型常量代表的常数后面加后缀 LL arning 2:有三个变量可能会在未初始化赋值的情况下被使用 不作处理,因为程

27、序本身已经保证了正确性 arning 3:定义了但没有使用的 variable 和 label 不影响程序正确性,可以不处理 errr:_FPU_EXTENDED 和_FPU_DUBLE 没有被声明 选择不编译相关的两个语句,或者将这两个语句都注释掉 对于表 6 中给出的解决方法,说明如下。 G 4.0 以上版本不支持将一个静态函数的预先定义直接放到另一个函数的函数体内部。因此,需要将两个静态函数 funtin Vfy_verifyethd 和 funtin Vfy_hekNeInstrutins 的预先定义移出到所在函数体的前面。 arning 1:因为 32 位机器的 int 和 lng

28、类型都是 32 位,这些报警的整型常数已超出 32位表示的范围,所以它们是 64 位整型常数,需要在这些整型常数或整型常量代表的常数后面加后缀 LL(lng lng 类型,交叉编译器支持该类型) 。 arning 2:报警的原因是,在变量的定义和使用之间存在 sith 或 if-else 等多分支语句,而且多分支语句中存在没有对变量赋值的分支或路径。这些变量分别是 typeKey 、 targetlassKey 和 thislass 。经检查,程序中可以保证这些变量在有效使用前都已被初始化赋值过,故无需处理。 arning 3:略。 errr:在 kv/VUnix/h 目录下的 ahine_d

29、.h 文件中,将编译开关选项PRESSR_ARHITETURE_X86 的定义改为 0,选择不编译函数 funtin InitializeFlatingPint 内的两个语句(也可以简单注释掉这两个语句) 。因为该函数只是用来设置 X86 PU 集成的 FPU 的精度模式,所以不编译这两个语句并不影响针对 AR 处理器所生成的 KV 对浮点的支持。移植结果测试移植测试采用的目标开发板平台为 S32440+Ebedded Linux 2.6.32.2。按以上方法解决编译时产生的 errrs 和 arnings 后,可以得到一个 KV 可执行文件。在 Linux终端中输入命令:file kv,将显

30、示该 KV 是一个 AR 平台的可执行文件,需要下载到 AR 开发板上运行。 编写一个 Hell rld! Java 源程序,编译和预验证时指定-lasspath 选项为 LD 类库。在 Linux 终端中输入如下命令:rtt he# java -sure 1.4 -lasspath/he/j2e_ld/api/lasses -d /he/exaples Hell.javartt he# preverify -lasspath/he/j2e_ld/api/lasses -d ./he/exaples这里要注意 Java 命令要加选项-sure 1.4,指定源码版本。最后,将预验证过的 Hell

31、.lass 下载到开发板上 KV 可执行文件所在的目录中,在开发板终端中执行命令:./kv Hell,可以看到 Hell rld! 的输出,如图 4 所示。这说明 KV 移植成功(该 KV 支持浮点运算) 。图 4 KV 移植结果测试6 结束语本文采用目前主流版本的编译器来移植 KV,对 KV 源码编译各个阶段所产生的错误和警告进行了深入分析,并给出了消除它们的适当解决方法。这些解决方法一方面消除了主要由编译器版本更新导致的错误,实现了 KV 的成功编译;另一方面消除了那些可能会导致 KV程序 bug 的警告,提高了移植后 KV 程序的健壮性或鲁棒性。KV 移植结果的测试实验表明,按本文所述解

32、决方法消除相关错误和警告后编译所得的 KV 被成功地移植到了 AR9 嵌入式平台上。本文可以为以后新编译环境下成功移植 KV 提供有益的参考。为了在 AR9 平台上实现 J2E的应用,我们进一步的工作将是在成功移植功能完整的 KV 的基础上移植 IDP 2.0。参考文献:1 冯东,罗蕾.TK 系统下的 J2E 运行平台设计J.单片机与嵌入式系统应用,2009.4.2 Sun irsyste,In.nneted Liited Devie nfiguratin(LD).java.sun./prduts/ld/.3 Sun irsyste, In. bile Infratin Devie Prfil

33、e(IDP).java.sun./prduts/idp/.4 Sun irsystes, In. KV Prting Guide, LD 1.1, J2E,arh 2003.5 Sun irsystes, In. The Java Virtual ahine Speifiatin,Send Editin,1999.6 周显军,李众立,张俊然.基于 S34510B 芯片 KV 虚拟机的移植和测试J.微计算机信息,2015.23(10-2).7 马嘉,周明天,陈虹.一种基于 AR7 的嵌入式 Java 虚拟机性能优化技术研究J.计算机应用研究,2015.24(5).8 Bill Venners.曹晓刚,蒋靖译.深入 Java 虚拟机.机械工业出版社 ,2015.9 叶磊,陈榕,赵岳松.KV 在基于构件的嵌入式操作系统上的移植和研究J.计算机应用研究,2005.9.10 袁文菊,孙天泽, 李梅.Java 虚拟机向 AR 平台的移植J. 微计算机信息,2015.23(8-2).11 Sun irsyste, In. Java Platfr, Standard Editin 6 APISpeifiatin,dnlad.rale./javase/6/ds/api/.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 学术论文 > 大学论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报