嵌入式系统带有内存利用的分析局部程序的实现方法

文档序号:6556598阅读:191来源:国知局
专利名称:嵌入式系统带有内存利用的分析局部程序的实现方法
技术领域
本发明涉及嵌入式系统程序优化技术领域,特别是涉及一种嵌入式系统带有内存利用的分析局部程序的实现方法。
背景技术
嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。早在20世纪60年代后期,通信领域就出现了“存储程序控制”系统,这就是早期的嵌入式系统。近年来,随着计算机技术的不断发展,嵌入式系统的技术也日新月异,形态各异的嵌入式产品将成为后PC时代网络接入设备的一大主流。这大大扩展了嵌入式系统的应用服务领域。相应地,嵌入式软件涉及的面也愈发扩大。它不仅包括嵌入式操作系统等系统软件,还包括一系列支撑软件,如数据库、调试软件、网络通讯协议、用户界面系统等,当然也包括各种应用软件。然而,嵌入式设备受体积和电源供电能力等因素影响,内存容量很小。如果沿用PC上“挥霍无度”的变成方式,嵌入式系统一定会因为内存耗尽而寿终正寝。科技的发展似乎总难以满足人类的需求和欲望。因此,硬件受限的软件开发是嵌入式发展所面临的一个重大难题。
在嵌入式系统开发的过程中,需要代码短小精悍,符合特殊的存储和内存运行环境,因此对某些已有的代码功能模块,进行逆向软件工程研究,分析程序,得到程序框架,进一步指导嵌入式系统软件开发,具有极大的研究价值。在软件领域中,迄今为止还没有逆向工程的标准定义。因此相对而言,逆向软件工程还是一个比较模糊的概念。但是它的基本理论和工程要求比较明确,在实际的工程研究中也发挥了很大的作用。一般将逆向工程定义为包含两个步骤的过程第一步分析目标系统,标示系统对象及其关系;第二步创建不同形式或更高抽象层次的系统表示。软件界提出的软件的逆向工程这一说法,它是指在用软件工程设计时的任意两个过程的逆向实现。目前,讨论得较多的逆向工程问题是反汇编,反编译问题和源程序分析理解的问题。
近年来许多组织面临着遗产系统的理解和演化问题。理解和演化遗产系统的问题在软件研究领域越来越重要。逆向工程通过提供一个对目标系统的设计和总体结构的较好的理解来辅导遗产系统的演化,是解决遗产系统问题的关键技术。
逆向软件工程问题是软件工程领域目前正在深入探讨的热点问题,逆向工程技术发展至今,商业领域和学术研究领域都已经研制开发出许多工具。在过去的研究中,大部分工具对静态逆向的支持更成熟一些。比如一些典型的逆向工程工具Rigi、ISVis、Rational Rose等,以及国内的逆向工程工具青鸟程序理解系统JBPAS。
尽管经过多年的研究,逆向工程研究领域一定成果,但在理论方面、应用方面仍然很不成熟,还有若干问题有待解决。缺乏统一的逆向工程的概念和标准术语导致了研究人员在交流上的困难,也步利于逆向工程分析技术的发展和应用。静态分析技术和动态分析技术之间的关系还需要更深入的研究。分布式对象技术、构件技术和构架技术的发展给逆向工程分析技术带来了新挑战。
在计算机技术发展初期,DOS环境下“640k天堑”,这个问题就已经出现,并且备受关注。当时如何合理利用内存的重要性,必然令生活于“虚内存”环境下的当今世代瞠目结舌。但是由于种种原因,PC操作系统的技术有了突破性的发展,虚内存操作系统(如Windows、OS/2、Linux)走进群众,内存问题似乎已经不在那么重要。我们不再被代码大小所限,也不再被数据量所限。所有内存不足的问题只要“加一条256M内存”就获得解决。从极度严苛到极度自由,PC程序员在内存用量上得到了完全的解放,开始不把内存用量放在眼里,想在心上。这原本是好的发展,快乐的走向,但是当嵌入式系统逐渐大行其道,内存问题再次浮上台面,而且较之DOS的“640K天堑”远远更为严苛。
时下流行的嵌入式系统,例如工序控制系统、医疗系统和智能卡(smartcards)。崭新时髦的汽车里早已安装了数百个微处理器,有朝一日我们的体内也会来上几个微处理器,如此可见,嵌入式系统这一举足轻重的领域。嵌入式设备的内存有限,强固耐用的要求高,还常常必须满足苛刻的实时处理底限。如果它们与生命交关或与任务成败交关,它们还得满足严格的质量控制和审核。如果系统的内存容量远低于50K bytes,(这里所提及的50K bytes并不是此类处理方法的边界范围,事实上,随着技术的发展,嵌入式系统中的内存容量也在不断的增加,但是不管如何增加,和pc机比起来,内存容量还是远远不足的。)则这样的系统必须进行严格的内存优化措施。通常必须大刀阔斧地权衡取舍各项功能,使之与可用内存相匹配。特别需要指出的是,面向对象编程思维虽然仍可以使用,但是由于“heap内存分配”不再可行,导致其价值大大降低。所以实现“内存容量小于50K bytes”的系统时,必须采取其他处理模式。
在内存受限条件下,对内存合理分配的一些具体措施和方法。主要是对内存耗尽这一重点问题的处理限定用量我们可以将一个固定大小的内存模型直接开发给用户或客户端组件。系统分配出一些固定的内存给用户,但是系统自身其实拥有更多的内存,用户或组件所需要的内存一旦超过系统所给的,就激发错误。这种做法实现比较简单,但是大大降低了系统的可用性,因为它让用户或客户端组件全权负责内存耗尽问题的处理。
激发错误消息我们可以为客户端激发一个“内存耗尽”的错误消息。这种做法还是把责任交给客户,但比起只提供限量的内存,通常能给它们更多的选择。
降低质量这个做法比较实际,在对程序精度或者质量要求不高的实现下比较有用。我们可以降低待存储数据的质量,比如截短字符串、降低声音和图像的采样率,用以减少内存需求。降低质量可以保持系统的吞吐量,但是如果会因此而遗漏用户的重要数据,那就不宜使用了。
删除旧对象可以删除旧的或不重要的对象,将内存释放给新的或者更重要的对象使用。举例,假设电话交换机只要再建立一个新连接就会耗尽内存,这个时候可以选择删除一个连接,中止响铃最久的那个连接(因为那条线被接听的可能性最低),使交换机重新获得内存。同样道理,让消息日志保持不溢出的方法是只保留定量消息,如果溢量消息进入,就先删除旧消息。
延迟新申请可以延迟分配请求,直到有充足的内存可用。最简单也是最常用的方法是,在当前任务执行完毕之前,系统不再接受更多输入。这类做法我们平时经常会碰到,比如MS Windows应用程序一旦将鼠标形状改为“请等待”图标,便是告诉用户目前无法进行进一步的操作,必须等待当前的操作完成。
忽略问题可以完全忽略问题,允许程序机能失常。一旦探测到问题,立即停止任何处理。这虽然可以避免由于内存的错误而造成程序运行的失控,但是从长远观点看,对系统稳定性或可靠性都没有什么贡献。因此该办法也只能是“不得已而为之”的。
逆向软件工程的一般做法就是从程序的代码着手,分析代码的模型结构,提出代码模型,在此模型上进行分析和优化,从而对改写和优化代码提出建议,并且通过优化后的模型,指导编写更加有效的程序代码。

发明内容
本发明的目的在于提供一种嵌入式系统带有内存利用的分析局部程序的实现方法。
本发明解决其技术问题采用的技术方案如下本发明提供了一种嵌入式系统带有内存利用的分析局部程序的实现方法,该方法包括以下步骤(1)确定程序的关键单元(2)分析关键单元的结构将关键单元解析为主程序、外部数据区以及两者之间的数据流;(3)主程序细化对主程序进行细化,分离出主程序中的每个子程序,并分析子程序与外部数据区之间的数据流;(4)所有结构细化至最低阶按步骤(3)的做法,将非最低阶的子程序细化,直到将所有的结构都细化到最低阶为止;(5)对程序进行优化。
作为本发明的一种改进,所述步骤(1)确定程序的关键单元的方法是分析程序整体结构,根据程序规模和程序具体情况定义一个量化规则,将程序中调用频繁的部分提出来作为关键单元。
作为本发明的一种改进,所述步骤(1)确定程序的关键单元的方法是单独提取出在程序运行后与数据存储有着紧密关联的结构体作为关键单元。
作为本发明的一种改进,所述步骤(1)确定程序的关键单元的方法是将程序运行过程中有进行分配大量内存动作的函数或者单元作为关键单元。
作为本发明的一种改进,所述步骤(1)确定程序的关键单元的方法是将程序运行过程中对内存消耗较大的动作作为关键单元。
本发明与背景技术相比,具有的有益的效果是(1)高效性。本方法充分程序结构的特点,结合了嵌入式系统的特点,对局部程序进行分析,并给出优化方法,提高了在嵌入式系统中,内存利用的效率。
(2)实用性。本发明对嵌入式软件的程序体进行分析,覆盖了分析的局部程序的全过程,从实际运行的特点出发,经过使用,具有很好的实用性。


图1是本发明过程的示意图;图2是关键单元结构的示意图;图3是关键单元子程序结构的示意图;图4是具体分析结构的示意图。
具体实施例方式
下面结合附图对本发明作进一步的说明。
一种嵌入式系统带有内存利用的分析局部程序的实现方法,附图1是本发明实施过程的整体示意图,其具体实施方法如下1)确定关键单元程序的关键单元,就是在程序运行中负责度较高的,利用率较频繁的,对内存的分配和数据处理的量比较大的。这个单元可以是一个函数,一个结构,甚至是一个循环。从程序的一个整体结构,根据下面几个原则找出关键单元·分析程序整体结构,对程序中调用比较频繁的那几个部分提出来,作为关键单元进行处理,在这里对频繁的理解可以因程序规模和具体情况而定,在不同的程序中可以定义一个不同的量化规则,·对一些结构体,特别是在程序运行后和数据存储有着紧密关联的那些结构,必须单独提取出来进行处理,·在过程中有进行分配大量内存动作的函数或者单元,也是我们要处理的关键单元,·一些对内存消耗较大的动作,比如连续的嵌套循环语句,递归语句等,也是属于关键单元;不过这些原则并没有具体的划分出关键单元的界线,具体问题具体分析,需要根据程序的具体所处的环境来不同对待。就如第一条所说的,这里对关键单元的定义没有一个具体量化的标准,这个工作可以具体到每个程序结构的分析中去做,在分析的过程中定义一个量化的标准,从而得到程序的关键单元。
例如,对函数调用的分析,在代码整体结构分析的时候,初始阶段,对每个被调用的函数设置一个计数参数(counter,初值为0),在分析过程中,根据该函数的调用情况,在整个过程中没被调用一次,counter的值就自增一个,在分析结束后,对每个函数都可以得到一个counter,最后根据程序的实际情况限定一个边界值n,当函数的counter值大于n,则该函数属于关键单元部分,如果小于,则可以不作考虑。对于其他几种情况,也可用类似的方法实现提出。
2)分析关键单元结构在图2中,无论对哪个单元,都可以给出如下一个结构,一个主程序和一个外部数据区以及它们之间的数据流。
3)主程序细化在图3中,对主程序进行细化,分离出主程序中的每个子程序,并分析它们与外部数据区之间的数据流。
抽象以程序最一般的特点开始,逐步深入,而具体深入程度则可以因实际研究所需的情况而定,只要能够达到可以研究程序结构,对程序进行优化的前提下,任何一步都可以作为程序的最终分析结构。
4)所有结构细化至最低阶按3)的做法,将非最低阶的子程序细化,直到将所有的结构都细化到最低阶为止;5)对程序进行优化函数的整体结构上的优化方法,这只对程序运行时占用的内存消耗有一定的优化,将每个子程序或者每个子结构的对内存利用和消耗情况进行预估,从而可以对每个最小单元的数据结构进行分析,在结构上给出优化方法。
在图3中,已经细化到最低阶,即Proc A,B,C都没有子函数了,则开始对A,B,C的结构进行分析,分析其对内存的分配和利用是否合理,其分析结果在图4中。
权利要求
1.一种嵌入式系统带有内存利用的分析局部程序的实现方法,其特征在于,该方法包括以下步骤(1)确定程序的关键单元(2)分析关键单元的结构将关键单元解析为主程序、外部数据区以及两者之间的数据流;(3)主程序细化对主程序进行细化,分离出主程序中的每个子程序,并分析子程序与外部数据区之间的数据流;(4)所有结构细化至最低阶按步骤(3)的做法,将非最低阶的子程序细化,直到将所有的结构都细化到最低阶为止;(5)对程序进行优化。
2.根据权利要求1所述的嵌入式系统带有内存利用的分析局部程序的实现方法,其特征在于,所述步骤(1)确定程序的关键单元的方法是分析程序整体结构,根据程序规模和程序具体情况定义一个量化规则,将程序中调用频繁的部分提出来作为关键单元。
3.根据权利要求1所述的嵌入式系统带有内存利用的分析局部程序的实现方法,其特征在于,所述步骤(1)确定程序的关键单元的方法是单独提取出在程序运行后与数据存储有着紧密关联的结构体作为关键单元。
4.根据权利要求1所述的嵌入式系统带有内存利用的分析局部程序的实现方法,其特征在于,所述步骤(1)确定程序的关键单元的方法是将程序运行过程中有进行分配大量内存动作的函数或者单元作为关键单元。
5.根据权利要求1所述的嵌入式系统带有内存利用的分析局部程序的实现方法,其特征在于,所述步骤(1)确定程序的关键单元的方法是将程序运行过程中对内存消耗较大的动作作为关键单元。
全文摘要
本发明涉及嵌入式系统程序优化技术领域,旨在提供一种嵌入式系统带有内存利用的分析局部程序的实现方法。该方法包括确定程序的关键单元、分析关键单元的结构、主程序细化、所有结构细化至最低阶和对程序进行优化。本发明的方法具有高效性和实用性。充分程序结构的特点结合了嵌入式系统的特点,对局部程序进行分析,并给出优化方法,提高了在嵌入式系统中,内存利用的效率。对嵌入式软件的程序体进行分析,覆盖了分析的局部程序的全过程,从实际运行的特点出发,经过使用,具有很好的实用性。
文档编号G06F9/44GK1904826SQ200610052228
公开日2007年1月31日 申请日期2006年6月30日 优先权日2006年6月30日
发明者陈天洲, 马吉军, 张楠, 谢斌 申请人:浙江大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1