陈 平,曾兴斌,何加铭,贾德祥
(宁波大学通信技术研究所,浙江宁波315211)
移动终端动态加载机制研究
陈 平,曾兴斌,何加铭,贾德祥
(宁波大学通信技术研究所,浙江宁波315211)
随着移动终端系统深入发展,应用程序扩展能力已成为一个基本需求,中低端移动终端系统迫切需要一种机制能使系统在运行状态时动态添加模块。该文提出一种内存分配策略及基于虚拟函数表结构动态加载机制,给出了应用程序加载实现方法。实验结果表明:基于该机制所开发的加载器具有体积小,运行速度快,性能稳定等特点。
移动终端;内存分配;虚拟函数表;动态加载
嵌入式系统发展至今天,有关嵌入式系统研究在国际和国内都有很大发展,比如对Linux操作系统裁剪并应用于嵌入式系统;随着嵌入式软件的深入发展,人们提出且实现一种能在运行状态下配置系统机制,即系统可在运行时动态装载和卸载功能模块[1、2]。即便如此,由于嵌入式系统的内存资源有限及中低端移动终端的硬件配置较低,无法预装类似J2ME等对终端内存及配置较高的软件平台,应用程序扩展能力远远低于智能终端,因此,所有的第三方应用必须通过与系统集成才能使用,这大大制约了应用软件的开发和使用。首次适配内存分配策略可有效地管理系统内存,通过提高分配和回收的速度提高系统运行效率,保证内存分配和释放的公平性,此外,利用虚拟函数表机制有效解决加载机制中关键问题。该动态加载机制有效提高加载器运行加载能力,很好解决中低端移动终端应用加载技术问题。
动态加载是系统进行动态扩展和在线升级的一种实现方法,目前关于动态加载机制研究已经起步,也出现了各种各样的动态加载实现方式,主要由两类:一是利用Java技术,在嵌入式操作系统上实现一个Java虚拟机,通过该虚拟机来加载各类Java应用程序[3]。二是重定位装入目标程序,这种方式的实现与操作系统的结构和硬件环境紧密关联,不同操作系统的加载机制一般是不一样的。但该类加载的核心问题都是系统API的调用[4]。
本文所讨论的动态加载机制是基于第二种实现方式的,由于该种实现方式与软硬件环境息息相关,不同的操作系统会有不同的加载机制[5]。本文所设计的动态加载机制是针对嵌入式领域的,利用虚拟函数表的机制实现很好地解决了系统API的调用这个核心问题。该动态加载机制基于C开发,所占容量小,功能丰富,是其他加载机制所无法比拟的。
为实现把目标模块以相应的文件格式加载到内存,加载器中的加载模块应具备分配并初始化内存空间,建立堆栈段等功能。在模块加载系统中,每个目标模块被加载至已初始化空间并在那里被链接,加载模块通过加载接口将目标模块加载至内存。该模块的设计需要考虑内存分配及系统函数调用问题。
鉴于嵌入式系统的实时性、可靠性、有效性对内存管理提出的要求,采用比较合理的内存分配策略,显著地提高内存资源的利用率。
该内存分配算法基本思想是:定义两个链表,一个为空闲链表,来管理内存中的空闲块,另一个为分配链表,用来管理已经分配的内存块,如图1所示。每当有分配请求时,系统会搜寻空闲链表直到找到一个符合内存请求的空闲块,同时相应更新两个链表;内存释放过程为:搜寻分配链表,找到需释放的内存块,将此内存块从分配链表中进行删除,与此同时空闲链表也会相应更新。
图1 内存分配策略
系统在分配一个内存块时,会先顺序搜索空闲链表,进而更新两个链表。而顺序搜索最坏情况下需要搜索整个链表,在一般情况下搜索节点数接近于链表总节点数一半。
定义T1为在最坏情况时分配一个内存块所需耗费的时间,T2为分配一个内存块平均耗费时间,N为空闲链表中空闲节点数目,L为已分配内存块链表长度。采用遍历节点数来表示时间。计算结果如下所示:
由式1、2可知,当分配一个内存块时,在最坏情况下需要遍历整个空闲链表节点,平均扫描节点也接近整个空闲链表节点数的一半。在释放一个内存块时,也需顺序搜寻分配链表来查找待释放的内存块。因为空闲链表是顺序的,必须白扫描整个空闲链表以确定待释放的内存块放置于空闲链表中的位置,所以释放分配块涉及到两个链表搜索。定义T3为最坏情况释放一个内存块所花费的时间,T4为释放一个内存块平均耗费的时间,则结果如下:
由以上可知,不管是在分配空间或是释放空间,最坏情况下的耗时和平均耗时都依赖于链表长度。
该算法实际上为一种排序算法,即将所有小内存块放在空闲表的起始部分。系统运行过程中,所需动态内存视目标程序大小而定,由于加载的程序大小一般限制在60KB以下,该内存大小相对于空闲内存块而言算是小内存块,处于空闲链表起始位置,搜寻起来比较方便,其受链表长度影响较小。事实证明加载模块采用该算法能极大提高内存分配有效性。
嵌入式系统中的应用程序开发是基于该系统或平台的,加载器的设计可以使应用开发与底层系统独立开来,但仍不可避免会用到系统API。当前的应用程序是开发者使用SDK(软件开发包)开发的,就像系统不知道应用程序的地址一样,应用程序也不知道系统的函数地址。SDK也可以提供系统API的每个地址,但随着系统的不断升级,会导致每个函数的链接地址是不固定的,这将导致SDK及应用程序也需同时升级,这种程序的运行方式是没有意义的。
SDK使用的是运行平台的接口声明,应用程序调用真正的运行平台接口,也就是在开发过程中使用的是平台的接口声明,在运行时应用程序使用真正的二进制接口,在二进制层面调用接口函数。所以必须将接口声明和接口实现在二进制层面进行分离。
考虑到以上问题,本文使用了虚拟函数表的机制。虚拟函数表,即虚表,虚表中存储的是指向平台函数的指针,在程序加载时给这个表函数指针赋初值,应用程序通过这个表来调用平台函数。
虚拟函数表工作机制为:根据目标平台函数定义虚拟函数表结构,对虚拟函数表指针赋值,完成初始化工作,定义指向虚拟函数表的指针,实现函数之间地址传递。自定义接口宏,与平台函数一一对应,接受虚拟函数表函数指针的值。位置无关应用程序通过接口宏使用平台函数,平台函数对应相应虚表中的表项。虚表中的每一项对应的是指向相应平台函数的指针,通过指针所指地址调用平台函数。
这种方式很好地实现了平台函数与自定义接口之间在二进制层面上的地址传递。这个虚拟函数表可以随着需求的增加而进行无限的扩大。
在应用开发时,使用接口函数地址表,全局变量地址表。在加载器运行时,初始化此表。当程序加载运行时作为参数动态传入应用程序。
本文的研究成果用C语言编程实现,在带有MT 6225芯片组,分辨率为240×320的手机(Bird D717)上进行验证。经多次测试,如表1所示,有效的动态加载机制使加载器在终端ROM上只占75KB,远远低于J2ME平台所占的600KB,运行时RAM所占的50KB相对于J2ME也要小许多,非常适合在移动终端系统上使用。应用程序编译生成的二进制的原生代码,程序加载到内存后,直接可以运行,较J2ME的先编译成字节码,再在虚拟机中解释执行的方式,在速度上有一定的优势。由于采用C语言开发,使得该加载器的加载速度只为0.5s,增强了应用运行的流畅性。此外,该动态加载器可以提供较为丰富的功能。
表1 两类加载器性能指标比较
本文主要研究了移动终端系统动态加载机制的原理和过程,所采用的动态加载机制是应用从零开始的动态加载机制,有效解决加载过程中内存分配及系统函数调用等关键问题,很好地完成模块加载至内存及从内存中卸载等操作。
基于该动态加载机制开发的软件平台,可使中低端移动终端也能像智能终端那样将新的应用程序直接安装于终端设备的存储卡上直接运行。基于文中提出的动态加载机制设计的动态加载器有着J2ME不可比拟的优势,具有良好的应用价值。
[1]Nagamatsu L.Runtime Software Reorganization by Traditional OS Features[J].International Symposium on Principles of Software Evolution,2000,38(17):311-315.
[2]张和君,张跃.Linux动态链接机制研究及应用[J].计算机工程,2006,32(11):64-66.
[3]杨伟,罗蕾.嵌入式系统中的模块动态加载技术[J].单片机与嵌入式系统应用,2005,23(11):8-10.
[4]程步奇,尹宝林.可动态扩展的嵌入式操作系统[J].小型微型计算机系统,2003,24(2):216-219.
[5]张墩华,刘建.Java动态类加载机制及其应用[J].计算机工程与设计,2004,25(3):432-435.
Research of Dynamic Loading Mechanism on Mobile Terminal CHEN Ping,ZHENG Xing-bin,HE Jia-ming,JIA De-xiang
(Instituteof Communication,Ningbo University,Ningbo Zhejiang315211,China)
With development ofmobile terminal systems,expansion capability of applications has already become basic demand,low-endmobile term inal system urgently need onemechanism which make system addmodules dynamically at runtime available.In this paper,amethod ofmemory allocation and a dynamic loadingmechanism based on structure of virtual function table is proposed,providingmethod of loadingof applications.It is proved that loader based on themechanism has features of small space occupied,fastspeed of running,stable performance.
mobile terminal system;memory allocation;virtual function table;dynamic loading
TP311.5
A
1001-9146(2010)05-0077-04
2010-07-20
国家重大专项核高基资助项目(ZX01039-001-002-004、ZX03001-016、ZX03004-005);科技部公共服务平台创新基金资助项目(C26243314159);浙江省科技计划资助项目(C31107);国际科技合作资助项目(DFA12120)
陈平(1985-),男,浙江绍兴人,在读研究生,通信终端核心应用软件技术.