Java虚拟机中Java栈以及相关指令的实现王立冬.docx

上传人:b****9 文档编号:26220433 上传时间:2023-06-17 格式:DOCX 页数:29 大小:22.48KB
下载 相关 举报
Java虚拟机中Java栈以及相关指令的实现王立冬.docx_第1页
第1页 / 共29页
Java虚拟机中Java栈以及相关指令的实现王立冬.docx_第2页
第2页 / 共29页
Java虚拟机中Java栈以及相关指令的实现王立冬.docx_第3页
第3页 / 共29页
Java虚拟机中Java栈以及相关指令的实现王立冬.docx_第4页
第4页 / 共29页
Java虚拟机中Java栈以及相关指令的实现王立冬.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

Java虚拟机中Java栈以及相关指令的实现王立冬.docx

《Java虚拟机中Java栈以及相关指令的实现王立冬.docx》由会员分享,可在线阅读,更多相关《Java虚拟机中Java栈以及相关指令的实现王立冬.docx(29页珍藏版)》请在冰豆网上搜索。

Java虚拟机中Java栈以及相关指令的实现王立冬.docx

Java虚拟机中Java栈以及相关指令的实现王立冬

Java虚拟机中Java栈以及相关指令的实现

王立冬张凯

(北京理工大学计算机科学与工程系,北京)

’()(栈

’()(

虚拟机在解释执行字节码指令时,必须将方法调用参

数、中间运行结果、局部变量、返回方法的值等信息存储在一个

数据结构中。

这个数据结构称为框架。

每个框架必须包含局部变量、操作数栈、动态链接三部分

内容

*&+

其中局部变量是一个包含方法中声明的所有局部变量

的数组。

操作数栈包含上一级方法传递给该方法的参数、中间

运行结果、返回方法的值。

大部分

’()(

虚拟机指令从操作数栈

取值,对它们进行操作,并把结果返回到同一个操作数栈。

如:

(--

指令把两个

./

值加到一起,当虚拟机执行该指令时从

操作数栈顶弹出两个整型值并将它们相加,然后把结果压入操

作数栈

*!

+

动态链接是一个指向当前方法所在类的常数池的指

针。

因为一个方法在调用另外一个方法或者是引用其他类中的

一个变量时,都是通过符号引用实现的。

所以每当遇到这种符

号引用时,

’()(

虚拟机必须通过常数池找到被引用的变量或者

方法的符号代表,并通过解析这些符号获得这些方法或变量在

内存中的真正地址。

每当一个

’()(

方法被调用时,虚拟机就创建一个新框架。

当方法执行完毕时,它

’()(

栈所对应的框架被撤销。

框架的组

织是通过栈来实现的,这个栈就是

’()(

栈。

每创建一个框架,

虚拟机就把它压入

’()(

栈中。

与此相反,每当一个方法执行完

毕,虚拟机就把它所对应的框架从

’()(

栈中弹出并从内存中

撤销。

处于栈顶的框架对应于当前正在被执行的方法,该方法

被称作当前方法,该框架被称作当前框架,该方法所在的类被

称作当前类。

&

表示

’()(

栈的结构。

&’()(栈的结构

!

’()(栈的实现

’()(

栈的实现就是为

’()(

栈设计一种比较合理的数据结

构。

方法执行时所需要的所有信息必须包含在这个数据结构

中。

如前所述,这些信息包括局部变量、操作数栈、动态链接以

及由它们组成的框架等。

下面是用

0

语言为它们设计的数据

结构。

!

$&操作数栈

操作数栈中存放的元素可能是各种类型的。

这些类型包

括:

./

(整型)、

123(/

(浮点型)、

-34526

(双精度浮点型)、

761676.86

(引用类型)、

76/47.(--7699

(返回地址类型)。

其中

761676.86

是对

动态创建的类实例、数组或者实现接口的类实例或数组的引

用,

76/47.(--7699

’()(

虚拟机指令的操作码的指针。

下面是

操作数栈中单个元素的表示:

!

"#"虚拟机中!

"#"栈以及相关指令的实现

王立冬张凯

(北京理工大学计算机科学与工程系,北京

&""":

&)

;<=(,2

>(.?

@2,-3.?

A&BC$83=

摘要

’()(

栈是

’()(

虚拟机中运行时数据区的主要组成部分。

大部分虚拟机指令的操作都与

’()(

栈中的框架相关

联。

该文描述了

’()(

栈在

’()(

虚拟机运行中所起的作用,自行设计了一种

’()(

栈的数据结构,提出了一些具有代表性

的字节码指令的实现方法。

同时总结了

’()(

栈对虚拟机运行效率的影响。

关键词

’()(’()(

虚拟机

’()(

文章编号

&""!

<:

CC&<

!

""#

"%<"&"%<"C

文献标识码

D

中图分类号

EFC"!

$!

$%&’(%()*!

"#"+*",-")./(’"*(.$)0*12,*34)541

!

"#"631*2"’7",83)(

9"):

;3.4):

<8"):

="3

G6H/$3103=H4/67I8,6.86(.-;.?

.667,.?

,J6,K,.?

L.9/,/4/631E68M.323?

N,J6,K,.?

&""":

&)

>?

0*1",*

’()(9/(8O,9/M6=(,.83=H3.6./3174./,=6-(/((76(,.K()(),7/4(2=(8M,.6$P39/5N/683-6,.9/748/,3.9Q

3H67(/,3.,9762(/6-/3/M617(=631K()(9/(8O$EM,9(7/,826-6987,569/M614.8/,3.31K()(9/(8O>M6.K()(),7/4(2

=(8M,.674.9(.--69,?

.9(O,.-31-(/(9/748/476137K()(9/(8O$EM6(7/,826H3969,=H26=6./(/,3.913793=6/NH,8(2

.9/748/,3.9$D//M69(=6/,=6

/M6(7/,82694==(7,R69K()(9/(8OQ9,.1246.863.74..,.?

611,8,6.8N31K()(),7/4(2

=(8M,.6$

=(@A41.0

’()(

’()(S,7/4(2P(8M,.6

’()(I/(8O!

""#$%

计算机工程与应用

&’()*)+,&-./&01()-23*04&2/56

73&&28

9’(),0:

2&2:

2&2

;1()-23*04&2/5

第一项是一个整形的变量,它用来表示该元素的类型。

第二项是一个

9’(),0:

2&2

型的变量,它的值代表该元素

的值。

9’(),0:

2&2

是一个定义了各种数据类型的联合。

其定义

如下:

&’()*)+.37<36

73&=>90?

2@.)

@<38A1>B0?

2@.);

+@<2&CA1D90?

2@.)

*<.E@):

1FGAH0?

2@.);

-)+)-)3/)IHCHIH>JH0?

2@.)

-)&.-32**-),,IH9FI>D:

:

IH440?

2@.)

;9’(),0:

2&2;

K2L2

虚拟机中,

E’&)

/M2-

M<-&

都是转化为

73&

型来操

作的。

所以在该联合中,未对这

N

种类型加以定义。

在本实现中,操作数栈是一个

1()-23*04&2/5

型的数组,该

数组包含在框架中。

!

$!

局部变量

与操作数栈相同,局部变量中存放的元素也有可能是各种

类型的。

局部变量的单个元素的定义类似于操作数栈,如下:

&’()*)+,&-./&0A

2-72E@)6

73&&28;

9’(),0:

2&2:

2&2;

;A

2-72E@);

第一项是一个整型的变量,用来表示该元素是何种类型。

第二项是一个

9’(),0:

2&2

类型的变量,它的值代表该元

素的值。

9’(),0:

2&2

的定义如前所述。

在实现中,局部变量是一个

A

2-72E@)

型的数组,该数

组包含在框架中。

!

$N框架

框架是一个包含操作数栈、局部变量、动态链接的数据结

构,其定义如下:

&’()*)+,&-./&0C-2O)6

.3,783)*,M<-&,(;

1()-23*04&2/5P<(0,&2/5;

A

2-72E@)PL2-;

/<3,&23&0(<<@073+

73&E’&)/<*)0/<.3&;

.3,783)*/M2-PE’&)0/<*);

&-./&0C-2O)P3)Q&;

;C-2O);

第一项

是一个短整型的变量,它是操作数栈的栈顶指

针。

在框架创始之处,它的值是

RS

每次压入操作数,其值加

S

弹出操作数,其值减

S

每次访问栈顶元素,只要将

作为操

作数栈数组的下标访问即可。

例如:

<(0,&2/5T,(U

就表示栈顶的

元素。

第二项是一个

1()-23*04&2/5

型的数组。

当框架生成时,为

其分配内存。

操作数栈的大小是可以通过类文件中的相关信息

获知的。

第三项是一个

A

2-72E@)

型的数组。

当框架生成时,为

其分配内存。

局部变量数组的大小是可以通过类文件中的相关

信息获知的。

第四项是一个指向该方法所在的类的常数池的指针。

该指

针就是框架中的动态链接。

第五项是一个指向字节流的指针。

该字节流包含了该方法

所对应的字节码。

第六项是一个指向下一个框架的指针。

!

$#栈顶指针

K2L2

栈中,还包含一个指向第一个框架的指针,定义如下:

C-2O)P&<(0C-2O)

!

$%K2L2

栈上的操作

定义在

K2L2

栈上的操作主要有两种,一种是压入(

(.,M

框架,一种是弹出(

(<(

)框

架。

定义如下:

(.,M(C-2O)P(.,M)*0+-2O));

(<(();

定义在框架中的操作主要有:

压入(

(.,M

)操作数,弹出

(<(

)操作数,得到指定索引处的局部变量以及将指定的值存

入局部变量的指定索引处中。

这些操作定义如下:

(.,M(1()-23*04&2/5L2@.));

1()-23*04&2/5(<(();

&<-)0L2-72E@)(A

2-72E@)L2@.),73&73*)Q);

A

2-72E@)8)&0L2-72E@)

73&73*)Q

);

N

相关字节码指令的实现

K2L2

虚拟机中,大部分指令都是面向操作数栈进行的。

这些指令通过从操作数栈或局部变量中取得值,然后对这些值

进行操作,最后将结果再压入到操作数栈中。

K2L2

虚拟机规范

中定义了

!

""

多条指令,该文对具有代表性的部分指令进行

描述。

N$S装载和存储指令

装载和存储指令在

K2L2

虚拟机的局部变量和操作数栈之

间的传递值

TNU

7@<2*

@@<2*

+@<2*

*@<2*

分别表示把一个整型、长

整型、浮点型和双精度浮点型的局部变量装载到操作数栈。

7@<2*

指令是一个带有操作数的指令,紧跟在它后面的一

个字节就是它的操作数。

该操作数是一个无符号的索引,虚拟

机将该索引处的局部变量取出并验证该操作数是否为整型,然

后将其压入到操作数栈顶。

实现如下:

7@<2*(73&73*)Q)

6

A

2-72E@)&)O(;

1()-23*04&2/5<(;

7+(&<(0C-2O)RVL2-T73*)QU$&28WW90=>9)

6

&)O(W8)&0L2-72E@)(73*)Q);

<($&28W90=>9;

<($:

2&2$=>90?

2@.)W&)O($:

2&2$=>90?

2@.);

(.,M(<();

;

)@,)

6

(-73&+(X1()-23*4&2/59’()H--<-$Y3X);

)Q7&(");

;

;

S"Z该程序第一步先检查指定索引处的局部变量是否为一个

整型值。

&’()&

表示整型。

如果该局部变量不是一个整型值,程

序异常退出。

否则,从局部变量数组中得到该值并将其压入操

作数栈中。

**+,-

.*+,-

-*+,-

的操作与

/*+,-

基本相同。

唯一的区别是

检查从局部变量得到的值的类型是否与该指令相吻合。

指令

/01+23

*01+23

.01+23

-01+23

分别表示把一个整型、长整

型、浮点型、双精度浮点型的值从操作数栈存储到局部变量。

面以

/01+23

为例说明此类指令的实现。

/01+23

是一个带有操作数的指令,紧跟在其后面的一个字

节是它的操作数。

该操作数是一个无符号索引,虚拟机将栈顶

的整型值弹出,然后将其存放到局部变量的该索引处。

实现

如下:

/01+23(/4-35)

6

7832,4-’91,:

;13<8;

=+:

*’>,2/,?

*313<8@

/.

1+8’A2,<3BC+8’01,:

;D08E$1,FGG&’()&

6

13<8G8+8();

13<8@$1,FG13<8$1,F;

13<8@$H,1,$()&’>,*I3G13<8$H,1,$()&’>,*I3;

01+23’J,2/,?

*3

13<8@

/4-35

);

K

3*03

6

82/41.(L7832,4-91,:

;&M83N22+2$O4L);

35/1

"

);

K

K

P$!

运算指令

运算指令通常是对操作数栈上的两个值进行指定的运算,

然后把结果压入到操作数栈。

这些运算包括:

加、减、乘、除、余

数、取负、移位、按位或、按位与、按位异或、局部变量递增。

下面

以‘加’和‘按位与’为例对此类指令的操作加以描述。

/,--

*,--

.,--

-,--

分别表示将操作数栈顶的两个整型、

长整型、浮点型、双精度浮点型的值相加,然后将结果压入操作

数栈。

/,--

指令不带有操作数,其实现如下:

/,--()

6

7832,4-’91,:

;13<8@,13<8!

13<8@G8+8();

13<8!

G8+8();

/.(13<8@$1,FGG&’()&QQ13<8!

$1,FGG&’()&)

6

13<8@$H,1,$()&’>,*I3G13<8@$H,1,$()&’>,*I3R13<8!

$H,S

1,$()&’>,*I3;

8I0T(13<8@);

K

3*03

6

82/41.(L7832,4-91,:

;&M83N22+2$O4L);

35/1(");

K

K

该程序先从操作数栈中弹出两个值,然后检查它们是否为

整型。

如果是就将它们相加的结构压入操作数栈中。

否则,程序

异常退出。

*,--

.,--

-,--

/,--

的操作基本相同。

唯一的差

别是从操作数栈弹出的数的类型不一样。

/,4-

*,4-

分别表示将操作数栈顶的两个整型、长整型的

数进行按位与,然后将结果压入操作数栈中。

两个指令均不带

有操作数。

/,4-

的实现如下:

/,4-()

6

7832,4-’91,:

;13<8@

13<8!

13<8@G8+8

();

13<8!

G8+8

();

/.(13<8@$1,FGG&’()&QQ13<8!

$1,FGG&’()&)

6

13<8@$H,1,$()&’>,*I3G13<8@$H,1,$()&’>,*I3Q13<8!

$H,S

1,$()&’>,*I3

8I0T

13<8@

);

K

3*03

6

82/41.(L7832,4-91,:

;&M83N22+2$O4L);

35/1(");

K

K

*,4-

/,4-

的实现基本相同,唯一的差异是类型不同。

P$P类型转换指令

/!

*

/!

.

/!

-

分别表示将操作数栈顶的整形数转换为长整

型、浮点型、双精度浮点型。

/!

*

后面不跟操作数。

它的实现如下:

/!

*()

6

7832,4-’91,:

;13<8;

13<8G8+8();

/.(13<8$1,FGG&’()&)

6

13<8$H,1,$=7)U’>,*I3G(*+4F)13<8$H,1,$()&’>,*I3;

8I0T(13<8);

K

3*03

6

82/41.(L7832,4-91,:

;&M83N22+2$O4L);

35/1(");

K

K

该程序的第一步先检查栈顶的数是否为一个整型数,如果

是,就将其转换为长整型然后把这个长整型数压入操作数栈

中。

否则,程序异常退出。

/!

.

/!

-

的实现与

/!

*

基本相同。

差别是转换的类型不同。

#结束语

V,J,

栈是

V,J,

虚拟机中运行时数据区的主要组成部分。

V,J,

虚拟机面向堆栈的体系结构就体现在

V,J,

栈上

D#E

因为,

V,J,

程序执行的过程实际上是一个又一个的方法被执行的过

(下转

@W%

页)计算机工程与应用

!

""#$%

(上接

&"’

页)

程。

每当一个方法被调用,就有一个框架生成并进入

()*)

栈,

而当一个方法执行完后,该方法所对应的框架则会被撤销。

见虚拟机运行的整个过程实际上就是

()*)

栈弹出与压入的过

程。

另外,框架中操作数栈和局部变量数组在

()*)

虚拟机中也

是非常重要的。

()*)

虚拟机规范定义的指令中,大部分都要与

操作数栈或局部变量发生关联,要么从操作数栈或局部变量数

组中得到操作数,要么将运算结果或运算的中间结果存入操作

数栈或局部变量数组中。

()*)

虚拟机对

()*)

栈的频繁操作决定了

()*)

栈的设计好

坏会直接影响到虚拟机的运行效率。

在公共设计,私有实现的

基础上,任何人都可以根据不同的需要设计自己的虚拟机。

文提出了

()*)

栈的一种实现,并在此基础上对一些具有代表

性的指令加以实现。

(收稿日期:

!

""+

+

月)

参考文献

&$,-./-01234.,56)078944-0著$玄伟剑译$()*)虚拟机规范:

;<$北京:

北京大学出版社,

&==>:

+>?

#&

!

$@A0;-B63CDCE9.C,F0B$,29()*)G-6EA)4;)B2-09@H9B-I-B)E-30:

@<$@9J

B301K1-E-30,2EEH:

LLM)*)$CA0$B3.L13BCLN337CL&===J"=J"&L!

""!

J&"J"!

+$O-44G90096C$ODE9B319N)C-BC:

(<$()*)P3641,&==Q;=

#$O-44G90096C$,2949)0,.9)0,*-6EA)4.)B2-09:

(<$()*)P3641,&==Q;Q

据的采集和数据拆分。

通过置网卡于混杂模式,即可以采集本

机通讯的数据,又可以采集其它主机间的通讯数据,从中获得

数据包的源

FR

地址、目的

FR

地址、源端口、目的端口及协议类

型等特征信息。

+$#

数据包过滤子系统

包过滤系统过滤的数据包包括网络层的

FR

数据包、传输

层的

SR

TUR

数据包以及应用层的

5,R

9409E

V,,R

应用协议数据包

+

部分内容。

包过滤技术依靠以下

+

个基本依据来实现“允许或不允

许”某些包通过防火墙。

包的目的地址及目的端口;

包的源地址及源端口;

包的传送协议。

数据包过滤流程如图

!

所示。

!

数据包过滤流程

包过滤装置对数据包实施有选择地通过,通过检查数据流

中的每个数据包后,根据数据包的源地址、目的地址、所用的

SR

TUR

端口号、

SR

链路状态等因素或它们的组合来确

定是否允许数据包通过。

由于篇幅所限,数据采集、分析及过滤的编程代码不全部

提供,这里只提供过滤的部分代码。

@949BES)C9.-E9.W$@ANFE9.C(!

)X对照安全过滤规则

S)C9Y,SR

数据包监视

YX

本地端口对照

$$$$$$

S)C9Y

禁止本

G/Z[

外的机器使用

G/Z[

内的共享资源

Y

FI19CH36E\.43BH36EZ01

[3E-C-H

C36-H

))

290

.EBH\,6A9

FI.-E9.W$@ANFE9.C(>)\Y拦截Y,290

.4)0\,6A9

)BE-30\Y拦截Y

])60^.9CC)_9\Y本G/Z[外的机器非法使用本地共享资源Y

;C_O3‘])60^.9CC)_9

FI43_I36.$P-0C3B7&$@E)E9\",290X

与监视的终端进行网络

连接

43_I36.$P-0C3B7&$a9.3E9V3CE\19C-H

43_I36.$P-0C3B7&$/3B)4R36E\!

""!

43_I36.$P-0C3B7&$a9.3E9R36E\!

"""bG)4(_9E-HCE6(19C-H))

43_I36.$P-0C3B7&$S3009BEX实现网络报警

K01FI

K4C9

.4)0\5)4C9

K01FI

K4C9X;C_O3‘Y非法使用资源Y

.EBH\5)4C9

K01FI

S)C9Y禁止所有人连接Y

$$$$$$

#结束语

《基于企业网的信息安全防护系统》建立了一套完整的企

业信息网安全防护方案,制定了全面的安全规则,并利用

G‘U

技术,实现了直接从网卡读取数据包,经过智能分析抽取特征

信息,根据安全规则进行过滤,实现网络实时监测和网络报警。

该系统是一个介于网络防火墙和

RS

防火墙之间的软件

产品,无需附加任何硬件和软件资源,即可实现网络防护功能,

对企业网信息安全的管理有深远的意义。

现正在校园网上试运

行和维护,目前运行状态良好,预计

!

""+

年投入正常运行。

(收稿日期:

!

""+

+

月)

参考文献

&$陈龙$网络信息安全的防范技术:

(<$中国安防产品信息,!

""";#

!

$Pa-B2)69@E9*90C$,SRLFR详解(卷&)协议:

;<$北京;机械工业出版社

+$杨韬,张鑫$个人信息安全的防护—计算机安全产品应用方案之一$

2EEH:

LL]]]$C].$B3.$B0L6ML!

""&J!

L!

+$2E.

&Q%

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

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1