2024年4月28日发(作者:cancer)
第37卷 第16期
、,0l-37
计算机工程
2011年8月
August 2011
No.16
Computer Engineering
中啊分类号:TP39
基于CK610的Dalvik
虚拟机移植与优化
叶云,李春强,胡军山
(浙江大学超大规模集成电路设计研究所,杭州310027)
羹妥:研究Android系统专属的Dalvik虚拟机,分析Dalv 虚拟机的解释器、本地方法桥以及C库在CK610平台上的移植与优化。基于
Dalvik虚拟机解释器的字节码分发机制,提出一种改进型Threaded分发机制,并实现硬件平台定制型MInterp解释器,实验证明该
Mlnterp解释器能使Dalvik虚拟机的运行速度提升1倍以上。
关蝴:Dalvik虚拟机;解释器;分发机制;移植与优化
Transplantation and Optimization of Dalvik Virtual Machine
Based on CK610
YE Yun,LI Chun-qiang,HU Jun・shah
( ̄stimte ofVLSI Design,Zhejiang University,Hangzhou 310027,China)
IAbstraal This paper sudies tthe exclusive Java virtual machine of An山.0id——_Dalvik.expounds he itnterpreter,the Java native interface call
bridge,and C library for transplantation and optimization based on CK610 architecture.Based on the distribution mechanism of he Datlv ̄’S
interpreter,it putsforwardanimpmvedThreadeddistributionmechanism,and achievesan architecture customizedMInterpinterpreter ofCK610,
whichprovestoenhancethevirtualmachinetO run rate 1 times above.
[Key wordsl Dalv ̄virtual machine;interpreter;isdtribution mechanism;transplntaation and optimizaiton
DOh 10.3969/j.issn.1000—3428.2011.16.098
1概述
Android是谷歌公司针对嵌入式领域推出的操作系统,
机,操作数直接嵌入指令码中,减少了字节码总条数,即减
少了取指一分发次数,且能有效减少内存操作。在文献f2】中,
寄存器虚拟机比堆栈虚拟机减少47 ̄/o- ̄节码数,内存访问减
少37.42%,执行时间减少32.3% J。Dalvik中虚拟寄存器以
数组的形式存在,以当前方法栈帧(FP)为基址,字为单位随
它依靠高性能与开放性成为最受瞩目的系统平台之一。
Android最早只支持ARM(Advanced RISC Machine)处理器,
1.5版本开始逐渐加入对X86系列处理器的支持,MIPS公司于
2009年6月宣布支持Android平台。
CK610是杭州中天微系统推出的32位高性能嵌入式
CPU,是国内成功商业化的嵌入式CPU之一。为了适应网络
互联,有必要在CK610上支持Android,其中,一个关键问
地址增长,如图1所示。这种结构给LD/ST架构处理器带来
便利——以虚拟寄存器号为索引,用LD/ST指令能简洁高效
地读,写虚拟寄存器。一次Java方法调用一个对应栈帧的压
入,参数传递通过调用者的输出区域(见图1中的Outs区),
Outs和被调用方法的虚拟寄存器区域(VRegs)部分重合。因
此,Dalvik中参数传递只需写内存(0uts)一次即可完成。
厂
I
l
题是Android系统的Java虚拟机Dalvik的移植实现和运行效
率提升。
本文简要介绍了Dalvik的特性,阐述了针对CK610进
行移植的关键技术。在剖析了解释器分发机制的基础上,提
出一种高效解释器的汇编实现,并用标准Benchmark对优化
前后的Dalvik进行性能测试。
VReg2
VRegl
VRego
2 Dalvik虚拟机的特点与解释器分发机制
Dalvik由以下功能模块组成:存储管理模块,数据结构
StackSaveArca
管理模块,装载和验证模块,反射机制模块,执行引擎模块,
调试通信模块以及本地方法模块等。其中,执行引擎模块与
本地方法模块决定字节码执行与本地方法调用效率。
2.1 Dalvik jlI拟机特点
Dalvik以低性能平台(对PC而言)为出发点——低CPU
主频、有限的存储资源、电池供电等。与同样应用于嵌入式
的J2ME平台比较,Dalvik有以下特点uj:基于寄存器的字
f
ADDR
Outs
VRegs
圈1 Dalvik棱■结构
(2)独有的dex执行文件格式。不同于其他Java虚拟机,
Dalvik运行的是dex文件。一个dex文件由若干个class文
件 通过DX工具(Dalvik自带)转换生成,转换时冗余的信息
基金项目:国家“863”计划基金资助项目(2009AA011706)
节码集;独有的dex执行文件格式;定制的c库等。下面对
其进行简要解析:
(1)基于寄存器的虚拟机。基于堆栈的虚拟机,操作数通
过堆栈传递,需要存,取堆栈的字节码。而基于寄存器的虚拟
作者倚介:叶 ̄;(1985--),男,硕士,主研方向:嵌入式系统;
李春强、胡军山,硕士
收藕日期:2011—02-28 E-malr:sunsetyyun@126・corn
计算机工程 2011年8月20日
被丢弃,共享的常量池只保留一份,减少了内存开销。
(3)定制的C库。Bionic是以BSD(Berkeley software
Distribution)许可形式开源,针对嵌入式进行经过定制与优化
的标准c系统函数库,大小只有200 KB,而且运行效率更高。
针对不同的体系结构,对Bionic关键区域进行优化,可以进
步提高效率。
一
行效率,笔者用汇编实现了CK610定制型解释器——MInterp
(上述2类解释器统称为Stdlnterp),且针对体系结构特性进
行优化。
3.1本地方法轿昀实现
Java方法通过栈帧传递参数,但本地方法是C/C++函数,
遵守ABI(Application Binary Interface)从固定的寄存器或堆
栈取参数,所以,本地方法桥(JNI Call Bridge,简称Bridge)
的功能是将Java方法传递的参数转换为C/C++函数的参数机
制。Dalvik规定本地方法的前2个参数为JNIEnv(指向集合
所有本地方法接IZl的结构)与clazz(实例方法为this)。图3展
示了CK610 Bridge的处理流程,其中,r2 ̄r7用于参数传递。
2.2解释器分发机翻
解释器是虚拟机执行字节码的引擎,它的运行速度直接
影响Dalvik效率。与编译执行相比,解释执行有实现简单、
可移植性好、 程序不需编译即可运行等优点。解释流程可以
简单地描述为 J:取指一分发一执行体一取指一……,执行
体是实现字节码功能的代码段,它的效率由代码编写的效率
决定,’而影响不同结构的解释器效率的最重要因素是字节码
分发机制。Dalvik提供了2种不同分发机制的解释器:Switch
机制和Threaded机制,后者效率比前者高。Switch机制实现
很简单:在大循环开始处取指,接着Switch语句分发,执行
体结束再跳回循环开始处,如此反复。而Threaded机制在执
行体结束时用指令码OPCODE(简称OP)计算偏移,从字节码
基址表中读取下一条执行体基址,再跳转执行,如图2所示。
本地方祛
圈3本地方法桥昀处理藏程
为了提高Bridge的处理速度,Dalvik用一个32 bit的位
图(Hints)承载参数信息,预留计算位图与解析位图的接口,
但对Hints的设计以及计算与解析的具体实现没做规定。
CK610 Bridge的Hints布局如下:
圈2 Threaded分发杌■
SRRRLLLL HHHHHHHH HHHHHHHH HHHHHHHH
Threaded机制的c伪代码具体如下:
在CK610 ABI中,函数堆栈起始地址与2-word实体(如
double型参数)地址必须2-word对齐,否则需插入pad。在位
L
_
OP_MOVE: //MOVE执行体
图中,H对应本地方法参数的前24个word(不包括JNIEnv
MOVE_routine
与clazz),为1表示对应word填pad。若参数太多(如大于
ADJUST
_
PC(1); //虚拟PC加1
24个word),Hints表示不下,则s置1,只能用方法签名解
inst=FETCH(O); //取下一条字节码
析参数,速度较慢。L是所有参数以2-word为单位的大小
goto handlerTable[inst]; ,,字节码分发
(0-15),用于快速地预留本地堆栈空间。R是返回值类型,
Threaded机制取指一分发部分的CK610汇编代码如下:
即pReturn的类型。
addi rl0.2
3.2 Bionic移植与优化
ldh r14,(rl0,0) ,,取指
Bionic中需要移植的库有libc与libm。libc移植了对
xUb3 rl r14||取OP
Linux的系统调用接口,以及完成对Memory与String各种操
lrw r7,handlerTable 邕轰
作的汇编加速。libm完成对浮点为主的数学接口的体系结构
ixw r7,rl
优化。
ld r7,(r7,O)
3.3爱件定 基解释器曲实瑰与优化
jmp r7 //跳转到下一条字节码
用CK610汇编实现解释器的3个部分:Mlnterp的入13
Threaded机制比Swish机制少了范围检查操作,但2种
与出口函数;根据谷歌提供的Dalvik字节码手册 编写
方式都要查表,查表需访问内存2次(1rw与ld指令),而且编
256个执行体;异常处理、打印等接口。Mlnterp的优势体现
译器编译的代码在每条字节码结束时,都会跳转到公共代码
在分发机制与执行体优化。
段进行字节码分发,导致每次分发额外多一条跳转指令
(1)改进的字节码分发机制
(CK610为br,需要2个周期填充流水线)。因此,现有机制
并不理想,还有较大的优化空间。
Mlnterp分发机制如图4所示,Mlnterp将所有字节码执
行体本身(非基址)组织成表,每个表项的长度固定(如64 Byte),
3 Dalvik虚拟机在CK6lO平台上的移植与优化
若放不下一个执行体,那么将多余的代码堆积到表尾之后(称
移植Dalvik到CK610平台上,必须要做的工作有本地
为Sister代码段),且通过跳转语句衔接。在分发指令时,由
方法桥实现与Bionic c库的移植围。另外,为提高Dalvik运
OP乘以表项大小得出偏移,再加上字节码表基址(IBASE) ̄
第37卷第16期 叶云,李春强,胡军山:基于CK610的Dalvik虚拟机移植与优化
可计算出执行体基址。
BASE
dvmAsmlnstructionStart
NOP
MOVE >64Byte
\
DDR
』 jOMN
mp NExT
EPO XVMTEO 1IV6B EAr oS1uE6ti+:n Oe Px64
0
x
f
e
。
x
ff
dvmAsmlnstructionEnd
dvmAsmSisterStart
Sister4" ̄码段
dvmA州R; erVnd
图4 Mlnterp分发机制
Mlnterp采用的是改进型Threaded分发机制:每条字节
码结束时,取下一条字节码OP且直接跳转到其执行体,省
去了Threaded方式的查表步骤。Mlnterp取指一分发部分汇编
代码比Threaded方式少2条内存访问指令,具体代码如下:
addi r8,2
ldh rl1,(r8,0) //取指
xtrb3 r1,rl1 //取OP
lsli rl,6
add rl,rl2 //计算字节码基址
jmp r1 //跳转到下一条字节码
因为表内偏移通过OP左移实现,所以字节码表项大小
必须是2的幂次。统计所有字节码执行体指令数(CK610为
1 6位指令集):较简单且常用的字节码(如MOVE、AGET等)
在16条-32条指令之间,而复杂且常用的字节码(如
INVOKE、RETURN)指令数大于64条。综合运行效率与代码
空间的考虑,选择32条指令(64 Byte)作为表项大小。对于执
行体大于32条指令的字节码,尽量将一个分支放到Sister段,
避免额外的跳转。
字节码执行体64 Byte对齐带来另一个好处:代码段
cache line(CK610为16 Byte)对齐,提高cache利用率,进一
步提高解释器运行效率。
(2)执行体的优化
为了尽可能减少代码数量和指令之间的依赖关系,
Mlnterp实行手动分配寄存器:将6个寄存器用于固定用途,
它们是执行体中最常用的变量或常量,如r12保存字节码表
基址IBASE,在字节码分发时,IBASE不用重新获取,表1
显示了分配情况。
表1 Mlnterp中用于固定用途寄存器的分配情况
统计多类常用字节码的汇编指令数,Stdlnterp与Mlnterp
(Threaded分发机制)对比如表2所示(表项的格式为:指令总
数/内存访问指令数)。在统计时,执行体均按“最小路径”计
算,比如假设所有类都已加载,执行期间未出现异常等。对
比可知,Mlnterp有效地减少了指令数,更重要的是很大程度
减少了内存访问次数。
表2 Stdlnterp与Mlnterp的常用字节码汇编指令数
4 Dalvik虚拟机的性能分析
ECM(Embedded Caffeine Mark3.0)是常用的针对嵌入式
平台的性能测试标准,体现Java程序运行快慢,分数越高性
能越好。图5是采用ECM对CK610 Dalvik解释器优化前后
的测试结果,纵坐标表示每兆赫兹下的ECM分数。可见,
Mlnterp性能是Stdlnterp的2倍左右。另外,浮点性能始终
是弱项,这由软件浮点的局限性所致,针对CK610带硬件浮
点协处理器的CPU(CK610EMF),实现另一套与浮点相关的
字节码,ECM的Float分数约提升3倍。硬件信息(实验采用
现场可编程门阵列(Field Programmable Gata Array,FPGA)板,
处理器频率较低):处理器为40 MHz CK610EM,16 KB
DCache,16 KB Icache;内存大小为64 MB。
器
彘
基
图5采用ECM对Dalvik解释器优化前后的测试结果
5结束语
本文描述Dalvik在CK610上的移植和优化工作,并通过
实验对Dalvik优化前后的运行效率做了比较。谷歌于2010年
6月发布了Android2.2版本,它最新的JlT(Just In Time)技术
将系统性能提升了2倍~5倍。下一步工作包括对最新Dalvik
JIT的移植以及Android系统级的支持。
参考文献
[1】Security Engineering Research Group.Analysis of Dalvik Virtual
Machine and Class Path Library[EB/OL].(2009・07—12).http://
imsciences.edu.pk/serg/wp—content/uploads/2009/07/Analysis—of-D
alvik—VM.pdf.
【2]Shi Yunhe,Gregg D,Beatty A,et a1.Virtual Machine Showdown:
Stack Versus Registers[C]//Proc.of Conference on Virtual
Execution Environments.Chicago,USA:[S.n.],2005.
[3】苏超云,柴志雷,涂时亮.实时Java平台的类预处理器研究【J1.
计算机工程,2010,36(7):246—248.
【4]Erd M A,Gregg D.The Structure and Performance of Efifcient
Interpreters[J].Journal of Instruction—level Parallelism,2003,5:
l一25.
[5]McFadden A.Dalvik Po ̄ing Guide[EB/OL].(2010—08—06).http://
android.git.kerne1.org.
[6】Google,Inc..Bytecode for the Dalvik VM[EB/OL].(2010—08—06).
http://www.netmite.com/android/mydroid/dalvik/docs/dalvik—bytec
ode.htm1.
编辑陆燕菲
发布者:admin,转转请注明出处:http://www.yc00.com/num/1714251475a2410609.html
评论列表(0条)