基于CK610的Dalvik虚拟机移植与优化

基于CK610的Dalvik虚拟机移植与优化


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。在位 

_

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 

e 

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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信