




已阅读5页,还剩56页未读, 继续免费阅读
(通信与信息系统专业论文)java+soc中的类装载器设计研究.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中文摘要 j a v as o c 中的类装载器设计研究 专业:通信与信息系统 硕士生:王华宁 指导老师:谭洪舟教授 摘要 随着专用集成芯片技术的高速发展,用硬件实现j a v a 虚拟机成为可能。利用j a v a 处理器核“j o p ”来构建j a v as o c 可以显著提高j a v a 程序在嵌入式应用中的运行速度。 但是,j a v a 处理器并不能完成j a v a 体系中的类装载功能,j a v a 虚拟机的可执行文件需 要在p c 开发平台上经过装载解析,才能被下载到j a v as o c 上运行,丧失了j a v a 体系的 跨平台特性。 本文将针对在j a v a 处理器的应用过程中所遇到的几个难点,从而提出基于集成了 j o p 处理器核的j a v as o c 平台实现类装载功能,构建基于此平台的一个较完善的j a v a 体系;结合操作系统设计原理和j v m 规范,从底层的处理器设计到上层的应用程序, 全面提高j a v a 应用程序在嵌入式应用中的运行速度的同时,也完善了其平台无关的特 性。本文通过设计一个在系统启动时运行的引导程序,实现j a v a 程序的类装载,解析和 初始化功能,并通过t f t p 协议使得系统可以通过网络运行应用程序。该设计在f p g a 原型验证平台上正确运行。 论文创新的提出一种独特的适用于嵌入式环境的j a v a 类装载器设计方法一一用经过 解析,可以直接由j a v a 处理器执行的j a v a 程序束装载其他未经解析的j a v a 应用程序, 构建他们的运行环境,使得这些程序也可以被j a v a 处理器直接执行。 关键字:类装载器,j a v a 虚拟机,平台无关,j a v as o c 英文摘要 c l a s sl o a d e r d e s i g ni nj a v as o c m a j o r : n a m e : s u p e i s o r : c o m m u n i c a t i o na n di n f o r i n a t i o ns v s t e m su o m m u n l c a t l o na n qi n t o r i n a t l o ns v s t e m s h u a - n i n gw - a n g p r o f e s s o r h o n g z h o ut a n a b s t r a c t 7 r h ed e v e l o p m e n to fa s i ct e c h n o l o g ym a k e si t p o s s i b l et oi m p l e m e n tj a v a r t u a l m a c h i n e ( j v m ) b yh a r d w a r e t h ej a v as o cw h i c hi n t e g r a t e saj a v ap r o c e s s o r j o p a c c e l e r a t e st h es p e e do fj a v ae m b e d d e da p p l i c a t i o n se 能c t i v e l y h o 、v e v e r ,s i n c e “sj a v a p r o c e s s o rc a nn o tf i m s ht h ec l a s sl o a d i n gp r o c e d u r e ,m ej a v ae x e c u t a b l en l e sn e e dt ob e r e s o l v e do nt l l eh o s tp cp l a t f o r n lb e f o r ei tm n so nj a v as o c a sar e s u l t ,o n eo fj a v a s o u t s 切n d i n gf - e a t u r e s c r o s s p l a t f o r mi si o s t i no r d e rt os o l v es o m ep r o b l e m sp r e s e n t e di na p p l i c a t i o no fj a v ap r o c e s s o r ,t h i st h e s i s p r o m o t e sad e s i g l lo fc l a l s sl o a d e ra n db u i l d su pac o m p i e t ej a v aa r c h i t e c t i 鹏,b a s e do n “s j a v as o ce m b e d d e dp l a t f o 肌w h i c hi n t e 掣a t e daj o pc o r eo ni t r e f e r r i n gt oo p e r a t i n gs y s t e m d c s i g n 砸n c i p l ea n dj v ms p e c i f i c a t i o n ,t l l i sd e s i g ns p e e d su pj a v ae m b e d d e d 印p l i c a t i o n s 自o mp r o c e s s o rl e v e rt o 印p l i c a t i o nl e v e l ,a n dm e a n w t l i i ec o m p l e m e n t st h ec r o s s p l a t f o m l f - e a t u r eo fj a v a t h j sc l a s sl o a d e rm n s 心e rs y s t e mr e s e ta n dt a k e st h ec h a 唱eo fl o a d i n g , r e s o l v i n ga n di i l i t i a l i z i n gj a v aa p p l i c a t i o nc i a s s e s t f t pp r o t o c o i i si n t e g r a t e di n 仕l ec l 嬲s l o a d e rs ot h a tt h ej a v as o cs u i t st ot h ei n t e m e ta p p l i c a t i o n t t l i sd e s i g ni sv e r i f i e do n 肌 f p g ap r o t o t y p ed e m o n s 倾t i o np l a t f o m ac r e a t i v em e t h o di sa d o p t e di n “sc l a s sl o a d e rd e s i g n t h ec l a s sl o a d e ri se s s e n t i a l l ya r e s o l v e dj a v ap r o 伊a mw i l i c hc a nb ee x e c u t e dd i r e c t l yb yj a v ap r o c e s s o r i to 蔬r ss e r v i c eo f i i i j a v as o c 中的类装载器设计 l o a d i n ga n dr e s o i v i n go t h e rj a v ae x e c u t a b l ef i i e sf o rj a v aa p p l i c a t i o n sa tr u n t i m ea n dm a k e s t t l e s e 丘l e sr e a l l ye x e c u t a b l ef o rj a v ap r o c e s s o r k e y w o r d c l a s sl o a d e r j v m ,p l a t f 0 衄i n d e p e n d e n c e ,j a v as o c i v 论文原创性声明 本人郑重声明:所呈交的学位论文,是本人在导师的指导下, 独立进行研究工作所取得的成果。除文中已经注明引用的内容外, 本论文不包含任何其他个人或集体已经发表或撰写过的作品成 果。对本文的研究做出重要贡献的个人和集体,均已在文中以明 确方式标明。本人完全意识到本声明的法律结果由本人承担。 学位论文作者签名:至辞守 日期:加f 年f 月7 日 学位论文使用授权声明 本人完全了解中山大学有关保留、使用学位论文的规定,即: 学校有权保留学位论文并向国家主管部门或其指定机构送交论文 的电子版和纸质版,有权将学位论文用于非赢利目的的少量复制 并允许论文进入学校图书馆、院系资料室被查阅,有权将学位论 文的内容编入有关数据库进行检索,可以采用复印、缩印或其他 方法保存学位论文。 学位论文储鲐醉号翩张一 日期:加3 年f 月7 日 日期:励占年厂月 7 日 第l 章引言 第1 章引言 j a v a 技术是当前i t 领域最热门和最具发展潜力的技术之一。j a v a 语言以其面向对象, 平台无关,网络安全,多线程等特性,在现代网络世界大受欢迎。大量的j a v a 程序充斥 着整个互联网世界,因此,如何提高j a v a 程序的运行性能,对互联网世界和现代i t 行 业有深刻的意义。 任何j a v a 程序都必须运行在j a v a 虚拟机上。j a v a 虚拟机,简称m 1 ,定义为:运 行经过编译的j a v a 目标代码的计算机的实现。j a v a 程序经过编译后生成的目标代码即 j a v a 字节码是j v m 的可执行代码。本质上,j v m 和常见的x 8 6 ,s p a r c 一样,是一种处 理器,有自己的指令集和特有的执行机制。不同之处在于,j v m 设计的目标是面向对象, 平台无关,安全,多线程等优秀特性,因此其指令集所实现的功能比较复杂,传统中都 是在已有的计算机系统平台上以软件模拟的办法来实现指令功能,这正是j v m 被称为 “虚拟”的重要原因。图1 1 表示了当前普遍应用的,在通用p c 平台上j a 、,a 系统的 层次结构。这些常见的j a v a 系统中,作为j a v a 运行平台的本地计算机必须利用j a v a 解 释器解释j a v a 字节码指令,或者通过j a v a 编译器把j a v a 字节码指令编译成本地c p u 可 以执行的代码来运行【2 】。这些就是j v m 的软件实现方式。 图1 1 j a 、,a 系统结构 1 j a v a n u a lm a c h i n e 本文所有“j a v a 虚拟机”均缩写为m j a v as o c 中的类装载器设计 j v m 不但可以用软件实现,也可以用硬件实现,即在芯片层次上加入可以直接执行 j a v a 字节码的硬件部件。 j v m 的硬件实现主要有两种形式,一种是用硬件实现j a v a 解释器或者编译器的功 能,将这种硬件解释器和编译器作为协处理器加入到通用对s cc p u 核中,和软件实现 方式一样,所有j a v a 指令都先经过硬件解释器编译器的预处理,翻译成本地代码再交 给通用对s cc p u 核执行。经过分析,本文认为这种实现方式的优势有两点。其一,硬 件实现使得翻译或解释字节码的速度比起软件j v m 更快。其二则对非j a v a 指令可屏蔽 j a v a 协处理器,使得c p u 可以同时处理j a v a 指令和非j a v a 的本地指令,获得更广的应 用【3 1 。 另一种硬件实现方式则是j a v a 处理器,j a v a 处理器的出现使j a v a 虚拟机突破了虚 拟的特点,因为对于j a v a 处理器而言,其本地代码就是j a v a 字节码,即j a v a 字节码不 需要经过任何翻译和转换的过程,可以直接被j a v a 处理器执行。比起前面提到的几种实 现方式,j a v a 处理器更加直接的实现了j v m ,提高了j a v a 程序的运行速度,拓展了更 大的性能提高空间。但这种方式不能执行其它非j a v a 指令,若一定要执行其它非j a v a 指令,可以选择双c p u 的实现方式,把通用的r j s c 核和j a v a 核结合起来,当检测到 j a v a 指令的时候交给j a v a 核处理。这种双c p u 的方式可以结合分布式计算的优势,具 有灵活的设计方法和更大的性能提升空间。 目前j a v a 处理器产品有s u n 公司的p i c o j a v a ,m i c r o j a v a ,u l t r “a v a 系列产品【4 】,奥 地利w i e n 大学提出的j o p 处理器核【5 1 【1 0 1 等。 无论是采取什么样的形式实现j v m ,在设计m 时都必须遵循由s u n 公司制定的 j a v a 虚拟机规范【6 1 ,这样才能保证j a v a 程序在不同的m 上的运行结果都一致。 然而,无论是哪种硬件实现方式,其对j v m 规范的支持都是不完全的。因为j a v a 字节码程序在被执行前必须经过一个装载解析的过程【_ 7 1 ,硬件实现的j v m 只能执行已经 经过解析的j a v a 字节码指令。以奥地利w i e n 大学的j o p 处理器核为例,必须使用一个 p c 机上运行的类装载工具对j a v a 应用程序进行解析处理并生成一个j a v a 运行时环境的 内存镜像,这个内存镜像才能被下载到嵌入式平台中被j o p 处理器执行。这使得j a v a 程序的平台无关性丧失了。本文基于集成了这个j o p 处理器核的j a v as o c 嵌入式平台, 提出设计一个可以直接在j o p 处理器中运行的类装载器组件,由其负责对其他j a v a 应 用程序类的装载解析,从而构建一个完整的j a v a 平台,扩展j a v a 处理器的应用场景。 2 第2 章v m 的体系结构 第2 章j v m 的体系结构 j v m 规范是基于平台无关,而向对象,安全等原则制定的,编译后的j a v a 目标代码 能够在任何平台,任何系统上运行【8 1 。从指令集的复杂程度,数据访问方式等各方面看, j v m 规范中的内容都比通用r i s cc p u 规范要复杂得多,讵是为了实现平台无关性的需 要。 与其它实际的处理器芯片面向寄存器的指令集设计不同,j a v a 指令集是完全面向堆 栈的,即所有的指令操作对象均是一个堆栈上的数据。j v m 规范只规定了很少量的寄存 器,这样的规定使得j a v a 程序同样可以在通用寄存器数目较少的j 占片上运行【9 i 。 如图2 1 所示,整个j v m 体系结构可分为两大子系统:类装载器子系统和执行引擎。 在j a v as o c 系统中,j a v a 执行引擎就是其j a v a 处理器核,而类装载器子系统正是本文 提出的设计。 丽两u 际翮u l 黛目一 2 1 执行引擎 蠢翻 疆;磐嚣# ;磐群# 臻菩番自i 瓣鳞 ;黪;搿# 群辫;黪c # # 瓣1 貉 溺鬻缓缫缓筏戮戮燃雾矽 图2 一lj v m 的基本结构【0 1 执行引擎是j v m 的核心,负责执行所有已经经过解析的j a v a 字节码指令。从软件 设计的角度上看,类装载器为执行引擎创建合适的数据结构,基于这个数据结构,执行 引擎提供有效的算泫来执行每条j a v a 字节码指令。本节将详细介绍j a v a 字节码指令执 行过程中的一些细节。 j a v as o c 中的类装载器设计 2 1 1 j a v a 运行时内存空间 j a v a 系统运行时内存空间在逻辑上可以被分为三部分:方法区,j a v a 栈和对象堆【i o j 。 方法区存储所有与j a v a 类相关的信息,包括方法,类静态域以及用于表示类内部或 类之间的关系的数据结构。其中最重要的是所有可能被执行的j a v a 方法都在方法区中。 j a v a 执行引擎从这里读取执行代码。因此,j v m 必须有效的组织这些方法,在尽可能保 持小巧紧凑的同时,使得执行代码能够迅速的被定位和读取。这正是类装载器子系统的 职能。 与方法区主要存储字节码指令相对应,j a v a 栈和对象堆中只存储数据。 j a v a 栈相当于通用r j s c 处理器中的寄存器文件角色,是j a v a 字节码指令的直接操 作对象。只有这个栈里面的数据是可以直接被用于运算的,对象堆和方法区中的数据, 如对象堆中存储的对象的动态域和方法区中存储的类的静态域,必须被读取类指令读入 j a v a 栈中,才能被其余字节码使用,执行结果也必须由存储类指令写回对象堆或方法区。 j a v a 栈中以栈帧1 为单位来保存j a v a 程序的运行状态【l l 】。栈帧被用来保存方法的参 数,局部变量,中间运算结果及返回值等数据。方法的调用将使j v m 在j a v a 栈中压入 新的栈帧并使之成为当前帧,而方法的返回则使j v m 将当前帧出栈,返回到前一个栈 帧。 栈帧作为j a v a 方法的工作区间,包括三部分数据:局部变量区,操作数栈和帧数据 区【1 0 】。其中局部变量区存储方法参数和局部变量,它和操作数栈都是j a v a 字节码指令 的作用对象,其大小在编译时可以确定,保存在类文件中。类装载过程中这些信息必须 被类装载器读取并写入方法区,以保证执行引擎可以正确创建栈帧。一般来说,j a v a 指 令的执行都会类似以下过程:通过读取类指令从局部变量区读出方法参数或者局部变量 并将其压入操作数栈,然后由运算或执行类指令将操作数栈顶元素弹出,执行操作或进 行运算后将结果压回操作数栈,最后由存储类指令将操作数栈顶的运算结果弹出,写回 局部变量区。而帧数据区用于保存栈帧自己的一些专属信息,比如方法调用者的地址和 其他一些返回时需要恢复的寄存器等,根据不同的j v m 实现而不同。 由此看出绝大多数j a v a 字节码指令的操作都是在j a v a 栈中完成,因此,如何设 计一个高效的堆栈是j a v a 处理器核设计的重点。j o p 处理器核的堆栈设计将在第3 章 详细讲述。 1 有些文献中也称为“方法帧”,“方法框架”等。 4 第2 章j v l 的体系结构 对象堆是存放对象的仓库。整个m 只存在一个对象堆空间,j a v a 程序运行时创建 的所有对象实例和数组都放在这个堆中。堆中的对象必须通过引用间接访问,一个对象 或者数组既可以被其他对象或数组引用,也可以被j a v a 栈所引用。一旦一些对象没有被 其他地方引用,这些对象将永远不可能被j a v a 程序访问,于是就成为“内存垃圾”,此 时必须由j a v a 体系中的垃圾回收机制来回收他们所占用的内存【1 2 】。 2 1 2 j a v a 指令集 根据字节码指令的功能,可将其分为9 大类【1 0 】: 栈和局部变量操作:这类指令把常量压入操作数栈,执行通用的栈操作,并在操作 数栈和局部变量之间往返传输值或者对象引用。 类型转换:这类指令将操作数栈顶元素进行基本类型间的转换。 整型算术逻辑运算:这类指令将操作数栈顶一个或两个元素弹出,进行整型算术逻 辑运算,然后将结果压回栈顶。整型运算是最基本的运算功能,j a v a 处理器必须通过硬 件来实现这些指令。 浮点运算:这类指令与整型算术逻辑运算类似,区别在于其进行浮点运算,j o p 处 理器中实现这类指令可根据应用场景灵活选择实现方法,参考3 4 节。 对象和数组访问:这类指令创建对象和数组,访问对象中的域和数组元素,并检测 和转换对象所属类型。 指令流控制:这类指令在同一个方法内部进行条件或者无条件的分支操作,j a v a 源 代码中i f ,i f e l s e ,h i l e ,d 0 w h i i e ,f o r 和s w i t c h 语句通过这类指令实现。 异常管理:这类指令用于实现j a v a 源代码中的姆一c a t c h f i n a l l y 语句。 方法调用和返回:当且仅当执行这类指令时,当前方法发生切换。j a v a 栈中的栈帧 发生变化,可能新增一个栈帧或者抛弃一个栈帧。 线程同步:这类指令给负责给对象加锁解锁,实现线程间的同步。这类指令需要 o b i e c t 类中一些特殊方法的协调支持。 另外,由于m 规范并没有用完所有2 5 6 条字节码,因此在不同的m 实现中, 可以由设计者自定义一些专有的指令来增加其m 的性能。传统的m 通过操作系统 来访问硬件设备,m 规范中没有用于访问硬件的字节码指令,因此j a v a 处理器设计 中,必须定义一些新的指令来完成底层硬件操作。详细的j a v a 字节码指令相关内容可以 5 j a v as o c 中的类装载器设计 参考j v m 规范【6 域者本文附录c “j o p 中的字节码指令”。 2 2 类装载器子系统及其在j o p 中的实现 j a v a 是一种完全面向对象的技术,其字节码指令是以类的形式组织的。一个j a v a 类 将被编译成一个字节码文件,因此也把编译后的j a v a 可执行文件称为类文件,扩展名为 “c l a s s ”。在j v m 中,类装载器子系统负责查找并装载j a v a 类。在运行某个j a v a 方法 中的代码之前,类装载器子系统必须把这个方法所属的类装载到运行时内存中,然后对 其进行连接和初始化。这些类可能属于用户应用程序,也可能属于j a v a 体系自身提供的 a p i 。m 规范中将类装载的过程分为三个阶段:装载,连接,初始化。 装载的过程就是把二进制形式的j a v a 类数据读入j a v a 虚拟机中,m 规范并没有 规定应该如何产生这些二进制数据。根据不同的应用环境允许j v m 的设计者自主确定 类数据的来源【1 0 】。一般情况下,这些类的二进制数据应该由j a v a 类文件提供。类装载 器根据j v m 规范分析这些数据,创建方法区内部的数据结构。然后在这些数据结构上 进行后续的连接,初始化等操作。 在j a v a 类文件中,任何域和方法的引用都是通过符号来进行,这些符号存储在类文 件中的常数池里。解析过程就是在类文件的常数池中寻找类,接口,域和方法的符号引 用,把这些符号引用替换成直接引用的过程,这是连接阶段的主要工作。这种动态连接 的过程使得j v m 独立于各式各样的存储方式【i3 1 。此外,在解析类之前,可以对类数据 进行安全性检查,在解析类之后,必须为类静态域分配内存,并设置默认初始值。 最后,类装载器子系统还必须调用每个类中名为“ d 1 的初始化方法,使得 各个类在被调用之前被正确的初始化。更详细的类装载器的实现要求以及在j a v as o c 中 系统的实现参考第4 章。 j o p 项目中,类装载过程是由一个特殊的工具在p c 平台上上实现。如图2 2 所示, 当需要一个j a v a 应用程序时,这个工具负责读取所有可能需要使用的j a v a 类,对它们 进行解析,最后生成一个方法区镜像一一j o p 文件。然后把这个镜像下载到基于j o p 的 嵌入式平台的内存中,由j o p 处理器执行。 这种方法有两个缺点: 1 本文凡类名,方法名,域名都用斜体标注。如( y a 船表示一个名为“c l 髂s ”的j a v a 类。 6 第2 章j v m 的体系结构 1 针对不同的j a v a 应用程序,必须在p c 平台上重新生成方法区镜像,重新下载, 这实际上是引用了“二次编译”的过程,破坏了j a v a 程序的跨平台特性。 2 在p c 平台上模拟的类装载过程,只能完成对类的解析,不能调用任何j a v a 方法, 因此,j a v a 类的初始化方法也不能被调用,j a v a 类只能被默认初始化。 图2 2 j o p 中的类装载过程 因此,本文提出了设计在j a v as o c 平台上运行的类装载器,这个类装载器本质上与 j o p 项目中的j a v a 应用程序一样,利用与图2 2 一样的过程生成,是一个特殊的方法区 镜像。这个方法区镜像可以直接在j o p 处理器中运行,其功能就是根据需求动态装载其 他的j a v a 应用程序类文件,对它们进行解析和初始化等操作,创建应用程序方法区。此 时j a v as o c 平台上的类装载过程如图2 3 。所示: 图2 3j a v a s o c 中的类装载过程 7 j a v as o c 中的类装载器设计 类装载器的方法区镜像可被存储在板上的f l a s h 中,启动时导入内存中运行,负责 其他应用程序方法区的创建。为了区分这两种方法区,可以把类装载器方法区称为“系 统方法区”,而由其创建的应用程序的方法区称为“用户方法区”。两个方法区在内存空 间的分布可以参考4 1 节。 我们的任务是:编写系统方法区程序,实现创建用户方法区的功能。 集成了类装载器的j a v as o c 平台的应用程序启动流程如下: 系统复位一导入核初始化数据一硬件检测一导入类装载器j o p 程序一装载 j a v a 应用程序类一调用m a i n 函数一返回类装载程序一内存清理一装载下一个 j a v a 应用程序类一 其中,从“复位”到“导入类装载器j o p 程序 的过程由j a v as o c 中的j o p 处理 器核自身以微码程序完成,然后启动类装载器j o p 程序进行类装载过程。 8 第3 章j a v as 0 c 中的j a v a 执行引擎一一j o p 第3 章 j a v as o c 中的j a v a 执行引擎一一j o p j a v a 执行引擎是j a v a 虚拟机的核心,每一条j a v a 字节码指令都是在其中得到执行, 正如前文所述,前提是这些j a v a 字节码指令必须是已经经过解析的。作为j a v as o c 的 执行引擎一一j o p 处理器的结构如图3 1 所示,为了实现复杂的字节码功能,j o p 定义 了自己专用的另一套对s c 指令集一一微码指令集,将复杂的字节码转换成由微码组成 的子程序来执行。 醐e c o d e 啪n 哺a x i d 目羁o n 图3 1 j o p 处理器的结构【5 】 图3 - l 中b ”e c o d e 单元负责获取字节码指令,m i c r o c o d e 单元利用其中的微码表和 映射表将字节码指令转换成微码,然后经过译码执行,作用于s t a u k 删中的数据。 3 1 利用寄存器和片上i 认m 实现j a v a 栈 j o p 中的堆栈机制如图3 2 所示。由于几乎所有的j a v a 字节码指令只对操作数栈栈 顶两个元素操作,因此j o p 把这两个元素存储在寄存器中,a 存储栈顶元素,b 存储 次栈顶元素,而j a v a 栈中其他元素存储在被称为s t a u c kr a m 的片上r a m 中,并以一指 针p 指向栈顶第3 个元素。换一句话说,j a v a 栈这个逻辑数据结构在物理上由两个寄存 器和一个位于片上s t a c kr a m 的物理栈组成,物理栈比逻辑j a v a 栈少两个元素。正因 9 j a v as o c 中的类装载器设计 为如此,所以启动时,物理栈为空,但逻辑j a v a 栈中实际上已经有两个元素一一寄存器 a 和b 。栈的后进先出特性保证了只要出栈操作的次数不超过入栈操作,这两个元素永 远被压在j a v a 栈的底部。而这点是可以被j a v a 编译器所保证的,因此这两个元素永远 不会被访问。寄存器a 和b 在启动时的初始值并不影响后续的操作。这样的设计虽然 使得s t a c kr a m 中有两个单元被浪费,但仅使用非常少数目的寄存器和对堆栈有限的并 发访问就实现了j v m 规范中的要求。 l a l u r 翰d l n a 。卜 a 蒯r 。锄c k 7 、 r a m 编臼鬟9 蒯r 。 l 辘懒 h b 、 嗽。广。 i 7 一7 i 图3 2 j o p 中的j a v a 栈实到5 】 在这样的结构中,针对栈帧的三类操作:算术逻辑运算,读局部变量,写局部变量, 执行过程如下【5 1 ,其中a 和b 表示栈顶和次栈顶寄存器,o p 代表任意的运算操作,s m 数组表示s t a c kr a m ,p 表示s t a c kr a m 中物理栈的栈顶指针,v 表示局部变量区的指 针,n 表示访问局部变量时使用的偏移量。 1 算术逻辑运算( 对s t a c k 删需要一次读访问) a 卜a o pb b 卜s m p 】 p 卜p 一1 2 读局部变量( 压栈操作)( 对s t a c kr a m 需要一次读访问和一次写访问) s m p + l 】卜b b 卜a a 卜s m v 十n 】 p 卜p + l 3 写局部变量( 出栈操作)( 对s t a c k 洲需要一次读访问和一次写访问) l o 第3 章j a v as o c 中的j a v a 执行引擎一一j o p s m v + n 】卜a a 卜b b 卜s m p 】 p 卜p l 从以上分析可以看出,对s t a c k 删同时进行的访问最多只有一次读和一次写,因 此可以用普通的双口删来实现【5 1 。同时,由于只采用两个寄存器,因此对硬件资源 需求也不太大。 除了实现j a v a 栈之外,片上的s t a c kr a m 还划分出两块3 2 个单元的区间【5 1 ,分别 存储微码运行时所需要使用的常量和变量,如3 4 节中提到的以m 类和第4 章中将提 到的用于中断和异常处理的。比勿类的地址。下文中分别将其称为微码变量区和微 码常量区。 s t a c kr a m 中微码常量区的内容是需要被初始化的。此外,图3 1 中m i r c o c o d e 单 元中的微码表和映射表也需要被初始化才能正常工作,将字节码指令转换成对应的微码 子程序。对这些需要初始化的存储空间有两种实现方式。 第一种方法是使用r o m 来实现,这种方式虽然较节省资源,需要把微码常量区从 s t a c kr a m 中分割出来,也就是说需要改动j o p 处理器核内部结构,并且在s o c 芯片 设计中,一旦r o m 中的内容被确定后,就再也不能改变了,严重限制了其性能提高的 空间。 第二种方法是使用黜蝴来实现这些表。在系统复位后,由硬件从外部导入初始化 数据来初始化这些表。这种实现方式对s t a c kr a m 就提出了新的要求,因为初始化时候 需要一个写端口来往其中写入数据,因此需要使用三口删来实现s t a c kr a m 。 3 2 方法切换在j a v a 栈中的实现 方法切换包括方法的调用和返回。据统计,方法调用是j a v a 程序运行过程中最经常 发生的操作u 4 j ,因此寻找一种高效的方法调用机制也是硬件实现m 设计中的重点。 对于每一个运行的方法,j v m 均在j a v a 栈上为其建立一个栈帧,这个栈帧随着方法 的调用而创建,在任何一个时刻,只有一个栈帧,即正在执行的方法的栈帧是活跃的, 该栈帧即为当前栈帧,它的方法为当前方法,当前方法的类为当前类。对于局部变量和 操作数栈上的操作总是引用当前栈帧中的相应区域。 j a v as o c 中的类装载器设计 当前方法调用另外一个方法或者当前方法运行结束时,当前栈帧要发生改变。如果 是方法调用,则需要创建一个新的栈帧并使之成为当前栈帧。如果是方法返回,则程序 需要把当前栈帧的结果传递回前一栈帧,抛弃当前栈帧,并使前一栈帧成为当前栈帧, 从而返回调用环境。 图3 3 描述了一个方法调用过程中j a v a 栈的变化【1 5 】,这个栈向下方增长。图的左方 为j a v a 栈上的一个当前栈帧,栈的底部是其3 个局部变量和帧数据区,v p 指向局部变 量区的起始位置,顶部则是操作数栈,s p 指向其栈顶元素。进行方法调用时,需要在 栈顶压入需要传递的实际传递参数,然后创建新方法的栈帧,旧栈帧的顶部成为新栈帧 的底部。如图3 3 右图,刚才压入的传递参数成为新栈帧的局部变量区的一部分,局部 变量区的另一部分则包含了在被调用方法中定义的局部变量。这种参数传递方法与 s c 处理器中的环状寄存器文件类似【l6 。,省去参数拷贝的过程,节省开销。 当被调用方法结束时,需要先将返回值保存到微码变量区中,然后整个由上述过程 创建的被调用方法的栈帧被抛弃,最后把之前保存的返回值压入旧栈帧的操作数栈栈 顶,最后从帧数据区中恢复调用环境的一些参数,旧栈帧成为当前栈帧,程序在这个栈 帧中继续运行。 1 2 v p 啼 s p v 矗r0 v a r1 v a r2 p f e 、,i o u 3s p p f e 铆o u 8p e p f e v i o u sv p p f e 诵o “se p p f e 诵o u s 豺p 0 # 玲r a n ds 妇c k a 斑j 嚣曝j 尹扫黼啼 s p 图3 3 方法调和和返回中的j a v a 榭5 】 叫神一一一一一一一一一一一一一哪刚一衲一一一一一一一一一一一 r|l|l|l叶厂|l m 伊 薰 垤 瓣 第3 章j a v as 0 c 中的j a v a 执行引擎一一j o p 如2 1 1 节所述,j a v a 栈中的帧数据区需要由m 设计者根据需求来确定,进行方 法调用时,j o p 将几个寄存器值保存在被调用方法的帧数据区中,包括调用者的栈顶指 针s p ,方法起始地址m p ,字节码指令偏移量p c ,局部变量区指针v p ,常数池指针 c p 。其中m p + p c 的值就是被调用方法返回后的需要继续执行的指令地址,常数池指针 c p 指向了调用者使用的常数池,s p 和v p 用于描述调用者栈帧的位置。被调用方法返 回时,先把这几个值从帧数据区中一一弹出并恢复,再把返回值压入栈顶。 3 3 j o p 中的方法区 如2 2 节所述,j o p 中的方法区实际上是一个由p c 机上运行的类装载工具生成的内 存镜像,这个镜像中存储了j a v a 应用程序所需要的类及其方法和域的信剧5 1 。j o p 处理 器根据这些信息来执行j a v a 应用程序。因此,了解这个内存镜像中的数据分布对我们设 计自己的类装载器具有显著的指导意义。 图3 - 4j o p 方法区基本结构 执行代码地址执行代码长度 常数池指针局部变量个数参数个数 3 l 1 05 0 图3 5 方法描述符结构 如图3 4 所示,j o p 的方法区分为两个大区域,一部分用于存储方法执行代码,一 部分用于存储类的信息: 1 3 j a v as o c 中的类装载器设计 其中类的域信息包括:静态域的值和动态域的个数。动态域的个数即对象的大小, 创建这个类的对象实例时需要的内存空间与这个值有关。其数值必须包含这个类从其父 类中继承下来的动态域。 由于本文提出的类装载器设计暂不以支持接口特性为目标,所以接口表指针和接口 表两部分可以在设计过程中暂时省略。 类的方法信息包括方法表和常数池。方法表中存储了方法描述符,用于描述这个类 自身的及其从父类继承下来的方法,方法描述符的结构包含两个3 2 位字,如图3 5 。j o p 处理器对方法的调用必须通过方法描述符,获得该方法的执行代码的起始地址和长度, 参数个数,局部变量个数,常数池地址等信息,在j a v a 栈上创建栈帧,读取方法代码。 需要注意这里表示执行代码长度的字段只有1 0 位,这意味这一个方法被编译后的长度 不能超过1 0 2 4 个字,否则j o p 处理器核会出错。 3 4 j a v a 字节码指令的微码实现 j o p 根据j a v a 字节码指令不同的复杂程度,提供了不同的实现的方法【5 】【硼,本文将 其归类如下: 硬件电路:j o p 提供与j a v a 字节码指令功能相同的微码指令。这种方法适用于非常 简单的,只在当前栈帧上完成的运算类指令,如n o p ,p o p ,a d d ,s u b ,l o a d ,s t o r e 等。 这种方法速度最快,但是由于硬件资源的限制,只能用于实现简单的指令。 微码子程序:由若干微码组成微码子程序段来实现j a v a 字节码指令。j o p 通过这种 方法实现了大部分j a v a 字节码指令,如p u s h ,l d c ,i n v o k e ,r e t u m 等指令。当图3 1 中 m i c r o c o d e 单元遇到一条j a v a 字节码指令,其内部的映射表提供对应的微码子程序起始 地址,j o p 从该地址开始执行微码。这段微码子程序的最后一条指令将给出一个信号, 通知b y t e c o d e 单元获取下一条字节码指令。从用户的角度来看,除了所需时间更长,微 码子程序的实现方法和硬件电路是等价的,当微码子程序段只包含一条微码指令时,就 等价于硬件电路的实现方式。然而从设计者的角度来看,区分这两种实现方法使得设计 者可以在具体实现某一条指令的时候,可以根据指令特点选择不同的实现方法一一增加 硬件结构和对应的微码指令或者利用现有微码编写新的微码子程序。 j a v a 方法:把一条字节码指令看作方法调用指令,调用j a v a 方法来实现。这种方法 用于实现一些非常复杂,如果用微码实现需要代码量非常大的指令,如浮点运算、除法 1 4 第3 章j a v as o c 中的j a v a 执行引擎一一j o p 运算以及对象处理等指令。由于所有的微码子程序段都存储在片上r a m 中,其大小限 制了微码子程序段的数量和规模。对于一些过于复杂的指令,j o p 将其转换成同一段微 码子程序,这段程序将根据字节码指令中的操作码调用不同的j a v a 方法,由j a v a 方法 来实现。这种方法需要在j a v a 程序中加入一些特殊的j a v a 方法。j o p 中,这些方法被 组织成一个特殊类刀,m ,在系统的启动阶段,将这个类在内存中的地址保存在s t a c k r a m 的微码变量区中。显然,这个类应该成为类装载器的一部分,如此,在集成了类 装载器的j a v as o c 平台上开发的应用程序就不再需要关心这个类,三种指令实现方式对 于应用程序开发人员来说是没有区别的。 j o p 项目提供一个简单的汇编工具将使用微码助记符编写的微码程序文件转换成微 码表,映射表,然后作为r o m 固化到硬件当中。在本文的j a v as o c 中,利用片上r a m 来实现这些表,在系统上电后导入从外部导入数据,使得这个j a v as o c 平台可以针对不 同的需求,灵活改变j a v a 指令的实现方式。 除了针对j a v a 字节码指令设计微码映射之外,j o p 另外还新定义了1 4 段微码子程 序【5 1 ,并把他们映射到尚未成j v m 规范使用的字节码( o x d l o x d e ) 。这些指令可以 突破普通j a v a 指令执行时的规则和限制,直接进行底层操作。如表3 1 : 表3 一lj o p 新定义字节码 指令助记符操作码说明 j o p s y s r d 0 x d l 读i o 端口( j a v as o c 不使用) j o p s y s w r 0 划) 2 写i o 端口( j a v a s o c 不使用) j o p s y s r d m e m 0 x d 3 读内存( j a v as o c 中也用于读i o 端口) j o p s y s w r m e m o x d 4 写内存( j a v as o c 中也用于读i o 端口) j o p s y s - r d i n t 0 x d 5 读堆栈 j o p s y s w r i n t o x d 6 写堆栈 j o p s y s g e t s p o x d 7 获取s p 指针( 描述栈顶位置) j o p s y s s e t s p 0 ,d ) 8 设置s p 指针 j o p s y s 乌e t v p 0 x d 9 获取v p 指针( 描述局部变量区位置) j o p s y s s e t v p o x d a 设置v p 指针 j o p s y s _ i n t 2 e x t 0 x d b 保存堆栈到内存 j o p s y s _ e x t 2 i m 0 山c 从内存恢复堆栈 j o p s y s n o p o 列) d 等待一个周期 j o p s y s _ i n v o k e 0 ) ( d e 调用j a v a 方法 同时,j o p 通过向应用程序开发人员提供疗w 类来提供使用这些指令的方法,针 对上表中的每条指令,j o p 都在行1 ,p 类中定义了对应的方法。程序开发者在开发应用 1 5 j a v as o c 中的类装载器设计 程序时可以使用这些方法。类装载过程中对这些方法的连接实质上就是把对这些方法的 调用指令转换为对应的新定义的字节码指令。这个工作同样也必须在本文提出的类装载 器中完成。另外,i o p s y si n v o k e 指令为我们提供了一个灵活调用j a v a 方法的途径,我 们将通过这条指令在类装载阶段实现类的初始化功能。这些问题都将在第4 章详细分 析。 表3 1 中用于访问i o 端口的两条指令在本文的设计平台j a v as o c 系统中不再使用, 这是因为在j a v as o c 设计时采用了i o 端口与内存单元统一编址的做法,这样访问i o 端口和内存单元都使用相同的指令:j o p s y s - r d m e m 和j o p s y sw 期e m 。 此外,虽然j o p 利用微码实现了绝大多数字节码的功能,但是其并不完善,有以下 两个缺点: 1 基本类型转换指令支持不足。 2 新建
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 口腔技术士考试题及答案
- 工商银行2025玉林市数据分析师笔试题及答案
- 农业银行2025通辽市秋招结构化面试经典题及参考答案
- 交通银行2025鄂尔多斯市秋招笔试价值观测评题专练及答案
- 2025年3D打印技术的工业革命
- 农业银行2025半结构化面试15问及话术广西地区
- 2025基因编辑技术的疾病治疗突破
- 建设银行2025台州市结构化面试15问及话术
- 工商银行2025遂宁市秋招无领导小组面试案例题库
- 2025软件工程新发展方向
- 发热护理课件
- 机械设备维护保养详细操作手册
- 村卫生室消防知识培训课件
- 库房管理基础知识培训课件
- 2025年国家安全教育知识竞赛试题及答案
- 智能城市建设中的能源消耗预测与节能措施可行性研究报告
- 2025年上半年威海桃威铁路有限公司校招笔试题带答案
- T-CCASC 0043-2024 氯碱工业数字化车间建设指南 电解
- 2024年西安医学院第一附属医院招聘真题
- 学校智慧黑板采购方案 投标文件(技术方案)
- 《无人机基础概论》无人机专业全套教学课件
评论
0/150
提交评论