摘要:在分析Android系统与龙芯平台架构的基础上,针对软硬件适配、虚拟机优化、编译器移植等关键技术进行了深入研究。在充分保持龙芯处理器}生能的基础上,对Android系统源码进行了优化修改,实现了在龙芯平台完整运行Android Gingerbread系统,同时对移植系统中的Dalvik虚拟机的性能优化进行了测试验证。为其他版本Android系统在面向龙芯平台的移植方面提供了重要参考,具有很大应用价值。
1 引言
龙芯处理器作为一款基于MIPS指令集、我国自主研发具有完全自主知识产权的中央处理器,具有低功耗、低成本等特点,在嵌入式、工业控制等领域有着非常广阔的应用前景。Android是Google于
2007年11月5日发布的基于Linux平台的开源操作系统,是为移动终端打造的真正开放和完整的移动操作系统。作为一个开源的系统,Android不存在以往阻碍移动产业创新的专有权障碍,因此,向龙芯平台上移植Android操作系统将会成为龙芯处理器在嵌入式系统领域的一个研究方向,对信息产业国产化发展具有重要的工程应用价值和意义。
2 Android系统架构
Android平台的系统架构主要包括Linux内核、硬件抽象层(包括系统运行库与Android运行环境)、应用程序框架、应用程序组成。图1列出了操作系统的主要组成部分。
Android运行于Linux内核之上,但不同于其他发行版本的Linux系统。因为一般发行版Linux系统所包含的功能,Android大都没有提供支持,例如caim、xll、Alsa、FFmpeg、GTK、Pango及Glibc等在Android系统中都被移除掉了。Android又以bionic取代G1ibc、以Skia取代Cairo、再以opencore取代FFmpeg等等。
Android的Linux内核实现了包括安全、存储器管理、程序管理、网络堆栈、驱动程序模型等模块n,.
Android系统架构采用了分层的设计方法,在Linux内核之上包括硬件抽象层、应用程序框架和应用层,每一层为上层提供统一服务,以屏蔽各层之间的差异,保证本层及以下层发生了变化不会影响到上层口,.各层所包含的内容及具体职责如下:
(1)硬件抽象层是为了将应用层与内核分开,降低对Linux内核的依赖。其中,Google开发一个支持Java语法的虚拟机:Dalvik,其特点是基于寄存器结构,而Sun Java虚拟机是基于堆栈结构,因此Dalvik虚拟机可以针对特定平台做化处理,这也是针对嵌入式系统所做的设计。
(2)应用程序框架提供了调用系统内部程序的管理程序。
(3)应用层由Java实现,包括了一系列应用程序,包括Email客户端,浏览器,日历,地图等,程序可通过JNI调用硬件抽象层来实现对硬件的操作。
3龙芯平台
龙芯2F处理器是一款64位MIPS III指令集的通用RISC处理器。龙芯2F的指令流水线每个时钟周期取四条指令进行译码,并且动态地发射到五个全流水的功能部件中。虽然指令在保证依赖关系的前提下进行乱序执行,但是指令的提交还是按照程序原来的顺序,以保证中断和访存顺序执行p,.
四发射的超标量结构使得指令流水线中指令和数据相关问题十分突出,龙芯2F采用乱序执行技术和激进的存储系统设计来提高流水线的效率一,
龙梦逸珑8089B笔记本采用龙芯2F处理器,运行Linux发行版操作系统,具有完全的国产自主化产权。本文是在龙梦逸珑笔记本上移植Android2.3代号Gingerbread.表1为龙梦逸珑笔记本配置隋况。
MIPS公司目前已经移植Android到部分MIPS平台和QEMU上面,并且提供源码。这些源码对移植工作有非常好的参考意义。
4系统移植4.1建立交叉编译环境
编译工作是在UbuntulO.04(32位)下进行,使用jdkl.6.
MIPS提供的代码中自带了编译的工具链,但其中gcc自带的libgcc.a是针对MIPS32R2架构CPU编译的, gcc配置编译选项为。march=mips3或者一march=loongson2f时,会发生链接错误,因为龙芯与MIPS32R2是互不兼容的架构。Android的工具链是针对bioniclibc定制的,MIPS放出了Android的源码,但其中交叉编译工具链是被封装过的,无法进行修改,因此无法针对龙芯平台重建这个工具链。
工具链制作脚本crosstool-ng可以较为简化地制作龙芯可用的通用标准工具链。用制作好的libgcc.a与libgcc .替换掉工具链里面的相应库文_eha Android件,组合出-个可用的龙芯Android交叉编泽工具链。
4.2 Linux内核移植
Android的内核位于android.git.kernel.org上,目前较稳定版本是2.6.35.7.Linux内核版本已经包含了龙芯相关的支持代码,进而自动地被Google收纳进了Android内核中。这意味着Android内核默认支持龙芯,只需适当配置即可。但特别需要说明的是,虽然龙芯支持64位内核版本,并且在32位下多只能访问512M内存,但是由于Google给Android增加的驱动都从未在64位模式下调试过,为了避免不必要的兼容性问题,内核编译选择32位版本。龙芯的CPU只支持16K的页表大小,跟通常系统4K不符,因此编译内核选项应设置页表大小为16K.在General Setup里面,勾选Enable the AnonymousShared Memory Subsystem,否则Android在启动时会使zygote进程无法启动导致启动失败。
4.3 Android文件系统移植
文件系统源码是针对MIPS32R2架构进行设计,其中含有MIPS IV和MIPS V中的32位指令,对于只支持到MIPS III的龙芯,使用原始的文件系统会遇到大量的非法指令。因此,移植Android蛰J龙芯平台,需要对文件系统源代码进行修改以适配MIPS III指令集。
Android文件系统代码目录主要包括三个部分:
系统库与Dalvik虚拟机(硬件抽象层),应用程序框架、应用程序。文件系统目录结构如下所示:
Makefile(全局的编译脚本);bionic(基础库代码);bootable(引导与恢复程序);build(编译和配置脚本);Dalvik(JAVA虚拟机);development(程序开发所需要的模拟器和工具);external(系统外部库);frameworks(应用程序框架);hardware(与硬件平台相关的库);packages(应用程序);prebuilt(Android编译工具链);system(Android系统库)。其中应用程序使用java语言进行设计,不需要进行修改,对Android文件系统的移植主要就是对系统库与Dalvik虚拟机、应用程序框架的移植。
(1)因Dalvik是基于寄存器的虚拟机,可以针对平台进行优化,实现方式包括优化的基于汇编码方式以及通用的基于C语言方式。为了不损失性能,移植选择基于平台优化的汇编码方式实现方式。Dalvik虚拟机的解释器实现代码中出现了多处MIPS IV和MIPS V的汇编指令。主要包括:movn、movz、mul、pref,需要将它们替换为龙芯平台(MIPS lid兼容指令。
movn:表示如果第三个寄存器的内容为负,那么复制一个寄存器的内容到另外一个寄存器。替换为beqz判零条件转移指令与move移动指令。
movz:表示如果第三个寄存器的内容为0,那么复制一个寄存器的内容到另外一个寄存器。替换为bnez非-%-条件转移指令与move移动指令。
mul:表示第1个寄存器获得另外两个寄存器相乘的结果。替换为mult乘法指令与mflo移动指令。
pref:数据预存缓存指令。去掉数据预存缓存指令。
(2)修改页表大小为16K,与内核中设置的一致。
Android代码默认为4K,共有两处。一处为bionic(基础库代码)中定义,修改公式为:页表大小=2崩GE_SHlFT.一处为Dalvik虚拟机代码中定义,SYSTEM PAGESIZE修改为16 384(16K)。
(3)应用程序框架中的libAGL里面的汇编代码用到了大量龙芯平台不支持的乘加指令。修改其判断指令,使只在非龙芯CPU编译时才使用汇编,强制在对龙芯平台编译时使用C代码来实现。
(4)修改架构与位宽为32位MIPSIII.龙芯作为MIPS III架构处理器,兼容64位与32位,由于编译环境是全32位的。按照这个逻辑,若位宽设置为64位,则在运行时会出现位对齐错误。
(5)新建编译脚本loongson2F.mk,用以配置GCC编译的选项,包括指定架构为MIPS III,设置编译使用硬浮点,小端编译等。
(6)Android Gingerbread系统默认要求需在64位环境下进行交叉编译,由于编译环境是全32位,并且Linux内核编译为32位版本,因此修改Android源码编译环境要求为32位。
至此,对于Android文件系统的修改已经完成,使用前文制作的龙芯Android交叉编译工具链进行编译,生成Android Gingerbread龙芯可用的文件系统。Android Gingerbread在龙梦逸珑上运行的效果如图2所示。
5虚拟机性能验证测试
针对Android系统在龙芯平台的移植,主要是在Dalvik虚拟机方面根据龙芯平台做了优化。为了验证移植Android到龙芯平台的实际应用效果,实验对Dalvik虚拟机进行测试分析,说明移植的性能。
测试选择四种较典型的测试用例omnibus.opcodes(测试优化性能),many.interfaces(测试CPU负载),classloader(测试Java类加载器性能),verification.error(异常捕获处理)。分别测试C语言版本解释器和汇编语言版本解释器的Dalvik在龙芯2F上执行测试程序所需要的时间,并对比测量结果。测试环境为:龙梦逸珑笔记本(处理器:龙芯2F;主频:800 MHz);系统:Android2.3.3;内核版本:2.6.35.7.测试用例来自Android文件系统中提供的Dalvik虚拟机测试程序。
测试数据如图3-图6所示。表2为测试用例运行时间统计。
从结果可以得出,使用针对龙芯平台优化的汇编语言版本Dalvik虚拟机在性能方面要优于使用C语言版本的虚拟机。但系统整体的运行效果相比于目前市场中主流的产品芯片还存在着比较大的差距。例如相比主频为1 GHz的ARM Cortex.A8处理器,龙芯2F主频只能稳定运行于500 MHz左右,并且由于采用J钇elle.RCT JavaJJ喇圣菠术,ARM Cortex.A8对实时(J-IT)和动态调适编译(DAC)提供化lel,而龙芯平台Dalvik虚拟机调用c/C++方法的模块是依靠FFI库实现的。所以龙芯平台Dalvik虚拟机还有着较大的性能提升空间,这也是后续阶段面临解决的问题。
6结束语
本文的主要工作旨在基于龙芯2F平台,根据处理器的架构特点,在充分利用龙芯平台架构的基础上,对Android源码进行了优化修改,实现嵌入式操作系统Android Gingerbread的移植。本文的创新点就是在于填补了龙芯处理器平台对嵌入式操作系统Android支持的空白,并对其他版本Android操作系统在面向龙芯平台的移植方面提供了参考与应用。
虽然目前Android Gingerbread在龙芯平台上运行的效果在速度方面还未达到应用产品的水平,但相信随着龙芯后续高性能处理器的推出,Android在龙芯上的产业化指日可待。
研究得到中国科学院近代物理研究所超算中心的大力支持,在此表示感谢。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。