在ARM上实现的一种Java虚拟机.docx
- 文档编号:7333265
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:41
- 大小:206.09KB
在ARM上实现的一种Java虚拟机.docx
《在ARM上实现的一种Java虚拟机.docx》由会员分享,可在线阅读,更多相关《在ARM上实现的一种Java虚拟机.docx(41页珍藏版)》请在冰豆网上搜索。
在ARM上实现的一种Java虚拟机
在ARM上实现的一种Java虚拟机
AJavaVirtualMachineImplementedOnArm
摘要
本文叙述了Java虚拟机(JVM)的概念,ARM体系结构的介绍及如何根据现有代码修改和移植实现一个ARM上的Java虚拟机—ArmJVM。
着重介绍了虚拟机的体系结构,实验室已有基于WIN32平台的代码从Windows到Linux再到ArmLinux的修改、移植、优化过程以及对移植后的虚拟机的改进工作。
其中详细介绍了ARMLinux、Linux与Windows程序设计的异同、ArmJVM虚拟机具体实现中遇到的难点和解决、gcc的内嵌汇编以及arm汇编简要介绍。
最后通过测试ArmJVM来验证其正确性和运行效率。
关键词
ARM,Linux,Java虚拟机(JVM),本地方法,动态链接,gcc内嵌汇编
Abstract
ThispaperdescribestheconceptionofJavaVirtualMachine(JVM),theARMarchitectureandhowtoimplementtheJVMonARMwhichmodifiedandportedfromtheexistcodesinWIN32ofmylab.ItemphasizesthearchitectureofJVMandhowtoporttheexistedcodesfromWin32platformtoLinuxandthentoArmLinux.ItdescribesthedetailsabouttheJVMporting,includingthedifferencesbetweenWindows,LinuxandArmLinux,theproblemwithimplementingtheArmJVMonArmmachine,thegccinlineasmlanguageandthearmasmlanguage.Atlast,thecorrectnessandefficiencyoftheimplementationisvalidatedbytestingArmJVM
Keywords
Arm,Linux,JavaVirtualMachine(JVM),NativeMethod,DynamicLink,GccInlineAsm
目录
在ARM上实现的一种Java虚拟机1
AJavaVirtualMachineImplementedOnArm1
第一章绪论4
第二章开发平台及运行环境10
1.硬件平台10
2.软件平台13
3.运行环境14
第三章实现方案14
1.原有代码MiniJavaVM概述14
2.代码修改重组16
3.移植到X86PC的Linux平台上17
4.从X86PC的Linux移植到ARMLinux17
5.代码的优化17
6.移除对STL的使用17
7.API的剪裁17
第四章移植18
1.从Windows到Linux(X86下)18
Makefile的编写18
动态链接库的使用19
编码问题25
VisualStudioC++与GCC对于c++的支持不同27
GCC行内汇编29
2.从X86Linux到ARMLinux31
ARM指令集及汇编代码的重写31
动态链接库定位问题36
所需库的编译37
第五章改进与优化37
1.解压代码效率分析及重写38
2.API的裁剪40
第六章验证ArmJVM的正确性41
1.ArmJVM的使用方法41
2.测试操作码实现的正确性44
3.其他方面验证46
第七章不足与后续工作46
1.本地方法46
2.I/O操作46
3.多线程46
4.效率47
5.后续工作:
47
致谢47
参考文献47
第一章绪论
嵌入式系统
1.1嵌入式系统概述
何谓嵌入式系统?
根据英国电机工程师协会的定义所作的翻译,“嵌入式系统为控制、监视或辅助设备、机器或甚至工厂操作的装置”。
它具备了下列四项的特性:
1)通常执行特定功能
2)一位电脑与外围构成核心
3)严格的时序与稳定性要求
4)全自动操作循环
嵌入式系统是电脑软件与硬件的综合体,亦可涵盖机械或其他的附属装置。
整个综合体设计的目的在于满足某种特殊功能。
嵌入式系统的架构可分为五部分:
处理器、内存、输入与输出、操作系统与应用软件。
他们常见于各种实验仪器、办公设备、交通运输设备、电信设备、制造设备、建筑设备、医疗设备及个人电脑等。
嵌入式系统另外可以分为硬件及软件两部分,其中硬件的设计包括单片机控制电路的设计、网络功能设计、无线通信设计及使用接口等等,嵌入式软件为信息、通信网络或消费性电子等产品系统中的必备软件,专司硬件产品的驱动、控制处理或基本接口功能,以提升硬件产品的价值,为该硬件产品不可或缺的重要部分,它常以韧件形式,如控制器或驱动程序等方式呈现。
现今嵌入式系统大多数的产品仍然以低级的8位处理器配合少量的内存与电路来作控制,不过高级的嵌入式系统产品也逐渐增加。
我们的这个ArmJVM即是运行于高级的嵌入式产品ARM7上。
1.2嵌入式系统的可移植性
嵌入式系统产品总是针对某个特定领域的应用而开发的,因此嵌入式系统不存在通常意义上的可移植性。
这里我们所说的嵌入式系统的可移植性实际上指的是嵌入式开发平台缩提供的自动移植功能。
为了方便快捷的适应不同的目标系统,一个移植性良好的嵌入式开发平台必须具备两个特性:
剪裁性和开放性。
剪裁性是指开发平台能提供多种可选的功能,应用开发者可以根据性能、功耗、体积等特征参数选用一些功能,舍弃一些功能,开发出规模合适的应用产品。
从某种角度来说,剪裁性实际上是一种针对不同应用的移植性。
开放性提供了管理和维护平台的基本途径。
开发平台是应用产品系统开发关键部分,它不仅是一种设计方法,也是一种技术管理的方法。
研发部门希望不断积累的经验能以可见的知识保存起来,开发经验不会随着技术人员的流失而流失,这就要求开发平台在不断加强的同时符合一定的规范,从而定制出满足特定要求的嵌入式系统开发平台。
通常在底层的硬件驱动程序上,效率和可移植性是相互矛盾的,必须找到一个折衷。
Java虚拟机概述
说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:
Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(JavaAPI)。
它们的关系如下图所示:
[1]
运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件)。
最后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。
从上图也可以看出Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平台上。
这个平台的结构如下图所示:
[1]
在Java平台的结构中,可以看出,Java虚拟机(JVM)处在核心的位置,是程序与底层操作系统和硬件无关的关键。
它的下方是移植接口,移植接口由两部分组成:
适配器和Java操作系统,其中依赖于平台的部分称为适配器;JVM通过移植接口在具体的平台和操作系统上实现;在JVM的上方是Java的基本类库和扩展类库以及它们的API,利用JavaAPI编写的应用程序(application)和小程序(Javaapplet)可以在任何Java平台上运行而无需考虑底层平台,就是因为有Java虚拟机(JVM)实现了程序与操作系统的分离,从而实现了Java的平台无关性。
[1]
什么是Java虚拟机?
Java虚拟机是运行所有Java程序的抽象计算机,它仅仅是由一个规范来定义的抽象的计算机。
当提及“Java虚拟机”时,可能指的是如下三种不同的东西:
抽象规范
一个具体的实现
一个运行中的虚拟机实例[2]
Java虚拟机负责Java程序设计语言的内存安全、平台无关和安全特性。
Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
Java虚拟机(JVM)在多个平台上实现统一语言。
Java之所以得以大行其道,除了它是一门面向对象、构造精美的语言之外,更重要的原因在于:
它摆脱了具体机器的束缚,使跨越不同平台编写程序成为可能。
项目背景
越是高级的语言,其编译和运行的系统开销就越大,应用程序也越大,运行越慢。
因此一般来说,编程人员都会首选汇编语言和C语言,然后才会考虑C++语言或Java语言。
但是随着不断增长的市场需求,很多嵌入式设备必须适应网上交流的需要,为了迎合此要求,考虑到开发Internet应用程序的便利,众多开发者都发现使用Java语言是有意义的。
而随着内存及32位处理器价格的下降,最初在嵌入系统使用Java太昂贵的问题不再有了,使用Java的成本开始减少。
于是,Java在嵌入式领域迎来了新的机会。
在嵌入式系统的应用开发中,研发人员需要面对许多新的设备与新的技术,同时也遇到种种限制,例如运行速度、内存配置、外形尺寸以及与时间相关的技术问题。
Java具有良好的跨平台性、面向对象的特性、内在的Internet集成,因此获得了大批拥有雄厚技术实力的开发商,如Sun、MicroSoft等,可以帮助人们顺利地完成嵌入式系统的开发,而且它的优秀的面向对象特性、平台无关性和丰富的类库将大大方便开发人员的开发和调试,提高工作效率。
可以相信,Java在嵌入式环境中的应用将越来越多,我们有必要研究Java技术核心—虚拟机,包括其结构、运行机制及虚拟机移植到不同的嵌入式系统平台的关键技术。
Java虚拟机(JVM)在多个平台上实现统一语言。
Java之所以得以大行其道,除了它是一门面向对象、构造精美的语言之外,更重要的原因在于:
它摆脱了具体机器的束缚,使跨越不同平台编写程序成为可能。
Java是当今最为有生命力的一种语言。
由于它本来就是为嵌入式系统的设计所开发的,所以,同嵌入式Linux的结合也就顺利成章了。
Java程序语言在其产生之初,就是为机顶盒设备设计的。
后来,由于它在互联网上的出色表现,使它赢得了巨大的声誉和财富。
现在它又回到自己原来的领地—嵌入式系统。
不过,现在用Java来开发嵌入式系统,产生了许多复杂的新问题:
由于新设备、新技术的出现,使其在速度、内存、大小、和时间定义等方面面临着一些以前从没有遇到过的问题。
我们将在一个嵌入式设备—ARM上实现一个简单的Java虚拟机,这个Java虚拟机能在嵌入式设备有限资源的情况下执行Java程序。
当前,国内外关于嵌入式JVM的研究,一般是对其进行部分的优化,比如对垃圾回收机制进行改进,而且一般是对开源项目Kaffe的改进。
并且都没有实际的可用产品,而嵌入式设备的内存和存储器容量都是有限的,因此对JVM程序本身的大小也有限制。
因此,我们的项目将根据目标机器的实际需要进行开发,并根据平台本身做相应优化,根据需要对JavaAPI进行剪裁和修改,以达到基于本平台的最大运行效率,得到我们自己需要的Java虚拟机程序。
ArmJVM的功能
✧能够装载并解析javaclass文件
对于已经编译好的javaclass文件,能够读取该class文件的内容,装载该类,并保存在程序内部的数据结构中。
当在程序运行的过程中需要解析该类时,进行解析,并替换符号引用为直接引用
✧在完成虚拟机的初始化后,能够找到main函数并执行程序错误!
未找到引用源。
]
对于指定的入口类,在虚拟机完成了初始化后,寻找该类的main()方法,如果找到,则执行该方法,否则抛出异常,虚拟机运行中止。
✧支持Java虚拟机规范中规定的200多个操作码的功能
实现了Java虚拟机的200多个操作码的功能,由此使MiniJavaVM这个虚拟机模拟Java虚拟机的功能成为可能,这200多个操作码包括:
Ø栈和局部变量操作指令
✓将常量池入指令
✓从栈中的局部变量中装载值指令
✓将栈中的值存入局部变量指令
✓通用栈操作指令
Ø类型转换指令
Ø整数运算指令
Ø逻辑运算指令
✓移位操作指令
✓按位布尔运算指令
Ø浮点运算指令
Ø对象和数组指令
✓对象操作指令
✓数组操作指令
Ø控制流指令
✓条件分支指令
✓比较指令
✓无条件转移指令
✓表跳转指令
Ø异常指令
Øfinally子句指令
Ø方法调用与返回指令
✓方法调用指令
✓方法返回指令
Ø线程同步指令
✧具有内存管理和垃圾收集机制
Java虚拟机对内存的管理使得java程序具有很高的安全性,程序员不用担心内存访问越界问题,也不用为在合适的时候释放分配的空间而费心。
垃圾收集机制的存在解决何时回收不用的内存和如何回收内存的问题。
✧支持非本地方法调用
按照Java虚拟机规范中的要求来设置非本地方法的调用情况,包括参数压栈,分配局部变量空间,压入方法调用的栈桢等。
✧支持本地方法调用
Java虚拟机中所有与本地方法相关的部分都重新写过,以动态链接库的形式为MiniJavaVM工程提供支持。
MiniJavaVM的本地方法只实现最基本的功能,不再负责虚拟机的安全机制。
✧支持异常处理
有了异常处理,就能够在程序运行时平稳处理意外情况。
根据Javaclass文件中的异常表,MiniJavaVM程序支持所有的异常处理,并在不能解决异常时输出异常信息,虚拟机停止运行。
✧能够运行与I/O无关的完整Java程序,并提供参数供查看运行效果提供了-version,-showversion,–help,-?
,–verbose命令。
●version命令显示MiniJavaVM的版本信息,然后退出
●showversion命令显示MiniJavaVM的版本信息,然后继续运行Java程序
●help,-?
命令显示帮助信息
●verbose命令输出详细数据显示运行过程
第二章开发平台及运行环境
1.硬件平台
本项目采用的开发板为导师翁恺老师设计的,采用的CPU为EP7312,EP7312是为超低功率应用产品而设计的,例如要求数字音频解压的手持设备、互联网产品和小功率工业用控制器。
该芯片的核心逻辑功能建立在一个ARM720T处理器上,其运行时钟速率达74和90兆赫,并带有8KB4路联合并行处理统一高速缓存和写缓冲器。
增强的存储器管理部件与ARM720T相结合,可支持成熟的操作系统,例如MicrosoftWindowsCE和Linux.
EP7312可进行超低功率运行。
它的核心运行功率仅为2.5伏,它的输入输出运行范围在2.5至3.3伏之间。
该芯片有三种基本电源状态:
运行、空转和待机。
EP7312集成了一个可与许多低成本、高质量的CirrusLogic音频转换器直接连接的接口。
通过在高度集成的EP7312上简单地增加所需内存和外设,可完成一个小功率系统的解决方案。
所有必需的逻辑接口都已集成在片上。
EP7312具有如下特性:
∙ARM7TDMI处理器和MMU支持Thumb模式
o8KB4路联合并行处理高速缓存
∙支持MP3、WMA、AAC、ADPCM、Audible等
∙48KB片上SRAM
∙用于数字版权管理或IP安全设计的32位唯一MaverickKeyID
∙74兆赫和90兆赫动态时钟速率
∙LCD控制器、中断控制器和启动ROM
∙IrDA、PWM
(2)和16550UART
(2)接口
∙实时时钟和两个通用16位计时器
∙集成外设接口
o可与两个外部组合相连接的32位SDRAM接口
o8/32/16位SRAM/Flash/ROM
o非胶合数字音频加CODEC端口
o两个同步串行接口(SSI1,SSI2)
o8x8键盘扫描仪和专用LED断续开关(通过实时时钟控制)
o27个通用输入/输出引脚
∙超低功耗
o74兆赫下90毫瓦
o90兆赫下108微瓦(典型值)
o待机状态下小于0.03毫瓦
∙封装:
208引脚LQFP,256球PBGA,204球TFBGA
o可适用于消费和工业温度条件
另外还在板上加入了CS8900NICIC的网卡。
EP7312的内核为ARM7TDMI,在ARMLinux下显示的情况如下:
Processor:
ARMARM720Trev2(v4l)
BogoMIPS:
65.33
Hardware:
ARM-Prospector720T
Revision:
0000
Serial:
0000000000000000
ARM是AdvancedRISCMachine的缩写。
ARM芯片具有RISC体系的一般特点,如:
具有大量的寄存器,绝大多数操作都在寄存器中进行,寻址方式简单,指令格式固定等等。
此外,ARM还采用了一些特别的技术,以保证高性能的同时减小芯片的体积、降低芯片的功耗。
ARM7系列处理器是低功耗的32位RISC处理器。
它主要用于对功耗和成本要求比较苛刻的消费类电子产品。
ArmBoy就是在ARM7TDMI系列处理器上的一个可移植的BIOS和C语言标准函数库的实现。
结合了Thumb指令集的ARM7TDMI支持0.25、0.18、0.13微米的CMOS制造工艺,内核仅占1mm2不到。
Thumb较好的处理了RISC处理器常见的代码大小问题。
系统设计者可以充分利用32位RISC内核提供的高性能和大寻址范围。
这使得应用开发可以提高功能和性能而保持有竞争性的系统开销和功耗。
ARM7TDMI还集成了ARM的EmbeddedICEJTAG软件调试逻辑,使用ARM的软件开发工具包和Multi-ICE接口。
EmbeddedICE逻辑允许源代码级调试、代码下载和数据断点,使得编程和调试过程非常的简便快捷。
ARM7TDMI处理器核的主要性能特点如下:
内核:
32位的RISC体系结构;3级流水线(见下图);32位ALU,并带有高性能硬件乘法器。
存储系统:
冯·诺依曼体系结构,指令与数据共用一个存储区,不区分指令和数据总线;32位同一指令/数据总线,简化了SoC集成工艺。
指令系统:
采用ARMv4T版本的指令集体系结构,支持32位ARM指令集和16位Thumb指令集;ARM和Thumb之间可以无缝切换,不会增加额外的开销;支持协处理器指令和扩展接口。
片上和在线调试:
支持扩展调试功能,包括EmbeddedICE、JTEG、ETM。
软件平台
由于我们的最终软件要运行于ARMLinux,因此我认为使用Linux作为我们的开发平台是最佳选择,这样我们可以先实现运行于X86PCLinux的可执行程序,然后再通过交叉编译环境得到运行于目标ARMLinux平台的可执行代码。
最终我们所采用的软件开发平台为Linux和GCC工具链,GCC的ARM交叉编译器工具链版本为2.95.2,基于x86PC的编译器使用了GCC3.4和GCC3.2.220030222(RedHatLinux3.2.2-5)两个版本编译运行通过。
针对嵌入式系统来说,其编译器数不胜数。
其中,gcc和汇编器as是非常优秀的变异工具,而且免费。
当作为交叉变异工具使用时,gcc支持很多种的平台和宿主机-目标及的组合,当然也包括所使用的X86PC+RedHatLinux——arm7+ArmLinux的组合形式。
GCC作为GNU工作集的一个组成部分,与源码级调试器gdb仪器工作,提供了在开发一个嵌入式Linux系统中要用到的所有软件工具。
对于使用交叉编译器的基本工作过程如下图:
运行环境
我们的代码将最终运行于ARMLinux中,在我们的项目中,测试平台为:
ARMLinux
Linux2.4.3-rmk1-wk1onEP7312
其中CPU为EP7312,内核为ARM720T,使用16M的RAM和4M的FlashROM,由于Flash的比较小,因此还使用了nfs,一些程序和动态链接库存在了nfs上,只有重要的库文件烧到了Flash上。
第三章实现方案
2.原有代码MiniJavaVM概述
本项目使用了部分我们实验室上一届师兄所写的一个Java虚拟机——MiniJavaVM代码,原有代码的运行环境如下:
开发平台:
WindowsXP/2003
开发语言:
ANSIC/C++
开发工具:
VisualStudioC++/VisualS
运行平台:
WindowsXP/2000/2003
MiniJavaVM的框架合理地组织了虚拟机运行时所需的各模块,将各模块的输入与输出有效地结合在一起,使这些模块组合在一起完成了Java虚拟机的功能。
这些模块包括:
命令参数解析模块、类的装载和解析模块、内存管理模块、执行引擎模块、方法调用模块、异常处理模块、多线程处理模块(未完成)。
这个MiniJavaVM总的组织方式如图2.2.1所示。
其中除命令参数解析模块外,其他模块一起构成了完整的MiniJavaVM虚拟机,这些模块之间协同合作,完成了虚拟机的功能。
其中命令参数解析模块负责解析命令,根据MiniJavaVM后的参数来设定虚拟机的运行模式及输出信息;类的装载和解析模块能从class文件或是rt.jar文件中装载指定名称的Java类,并采用迟解析的方式在需要时解析该类,类的信息维护在虚拟机的一个数据结构中;内存管理模块负责为类的实例及静态字段分配空间,并在虚拟机内维护类的实例和静态字段,当虚拟机空间不足时会启动垃圾回收机制来回收内存;执行引擎模块负责解释执行200多个操作码,解释的过程包括对栈桢、栈、PC、局部变量区的修改;多线程处理模块负责维护虚拟机内的表示线程的数据结构,在语言级提供多线程支持;方法调用模块负责处理方法调用过程,对于非本地方法,包括找到调用方法的指针,新建栈桢、将方法参数设置在新栈桢的局部变量区,调用方法并将返回值压栈的过程,对于本地方法,包括找到调用方法的指针,将方法参数用汇编的方式压栈,调用本地方法并将返回值压栈的过程;异常处理模块负责处理虚拟机抛出的异常,记录异常产生处的异常信息,并试图通过查找当前方法的异常表来处理异常信息,如果能够通过异常表找到处理异常的代码,则修改PC的值使虚拟机处理当前异常,否则,当虚拟机不能处理该异常时,输出异常信息,然后终止虚拟机的运行。
通过这几个模块的协同合作,MiniJavaVM虚拟机能够很好地模拟Java虚拟机的功能。
其中,分别有三个工程:
JavaNativeCall,JavaVM,jvm,JavaNativeCall这个工程为JNI部分,即本地代码接口部分,被编译成dll动态链接库文件供JavaVM工程显式调用。
而JavaVM也被编译为dll动态链接文件,供jvm工程隐式调用,即静态调用,JavaVM是虚拟机的主体部分,提供了虚拟机的所有功能的实际实现。
Jvm工程供编译为最终可执行文件用的,实现了用户界面接口,并根据要求调用JavaVM
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 实现 一种 Java 虚拟机