CN103116514A - 基于系统扩展调用图的操作系统自动优化方法和系统 - Google Patents
基于系统扩展调用图的操作系统自动优化方法和系统 Download PDFInfo
- Publication number
- CN103116514A CN103116514A CN2013100845605A CN201310084560A CN103116514A CN 103116514 A CN103116514 A CN 103116514A CN 2013100845605 A CN2013100845605 A CN 2013100845605A CN 201310084560 A CN201310084560 A CN 201310084560A CN 103116514 A CN103116514 A CN 103116514A
- Authority
- CN
- China
- Prior art keywords
- calling graph
- operating system
- extension calling
- file destination
- system extension
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
本发明提出一种基于系统扩展调用图的操作系统自动优化方法,包括:对操作系统的源代码进行编译,生成可重定向的目标文件;根据目标文件构造系统扩展调用图,系统扩展调用图为有向图,用于记录目标文件中函数和数据对象之间的引用关系;根据系统扩展调用图生成操作系统的有效子图;根据有效子图对目标文件进行重写,得到优化后的目标文件;对优化后的目标文件进行链接,得到优化后的操作系统。本发明自动化消除系统无用代码,减小系统体积,提升了系统性能,方便高效,优化效果明显。本发明还公开了一种基于系统扩展调用图的操作系统自动优化系统。
Description
技术领域
本发明涉及移动通信领域,特别涉及一种基于系统扩展调用图的操作系统自动优化方法和系统。
背景技术
互联网和移动设备相互影响、彼此促进的发展掀起了强大的移动浪潮。以智能手机、上网本为代表的移动终端在激烈的竞争中迅速发展。根据中国互联信息网络中心(CNNIC)第29次互联网调查报告称,截止2011年12月底,中国共有5.13亿互联网用户,其中手机上网用户3.56亿,占网民总体的近69.4%。
同时,以安卓(Android)系统为代表的移动终端开源操作系统的使用比例和影响力在不断扩大。GARTNER公司的报告显示,在2011年的第四季度,Android是全球使用最广泛的智能手机操作系统,在全球智能手机中的市场占有率约50%。
Android系统开始就采用开源、开放的开发模式,受到业界和学术界的广泛关注。自发布以来,Android的版本基本保持半年一个台阶地速度发展。其平台的开放性吸引了大量的第三方开发者进行应用程序开发,Android Market上的应用程序数量从2009年12月的1.6万迅速增长到2012年上半年的50万。
随着近年移动设备和相关软件的迅速发展,移动设备上的操作系统和应用程序的复杂性、程序体积大幅提高,这也对移动操作系统的优化提出了新的需求。而现有移动终端中有相当数量的组件原用于桌面和服务器系统,仅作少量修改移植后就用于移动操作系统上。
例如,Android系统分为四层,从上到下依次为:
(一)、应用程序。使用Java语言编写,可通过Java本地接口(JNI)调用本地代码。
·(二)、应用程序框架。使用Java、C、C++语言编写,向应用程序提供活动管理器、窗口管理器等服务。
(三)。系统库和Android运行时环境。使用C/C++以及少量汇编语言编写,为应用程序和应用程序框架提供必要的与系统交互的接口。
(四)、Linux内核。操作系统内核,为为Android进行修改的Linux内核。
整个Android系统,以Android-x86,20120215版本为例,包含2270万行代码,包括C、C++、Java以及其他语言。除了Linux内核以外,系统中共有950万行本地代码,主要为C、C++及少量汇编语言组成。Android系统基于Linux内核,但并没有使用其他Linux系统常用的GNU libc(为服务器、桌面Linux系统常用)或uClibc(为基于Linux的嵌入式系统常用),而是使用了专有的C库,称为Bionic。Bionic库的部分代码衍生自BSD,部分专门为Android编写,并针对Android系统作了优化和精简,删除了Android不需要的功能。优化后的Bionic库的代码体积显著减小,在x86平台上仅有GNU libc的26%,uClibc的62%。
从Bionic的例子可以看出,通用的代码在被用于特定的系统时会有比较大的优化空间。据此可以推测到,Android上的其他组件也会有优化的空间,尤其是那些原本为服务器和桌面系统编写的组件。事实上,Android系统自身使用了一百余个外来的开源软件代码,既包括最底层的Linux内核,也包括上层的WebKit浏览器引擎等。这些组件并非专门针对移动操作系统所编写,移植到移动操作系统以后往往还存在优化空间,但如果对它们一一进行手工优化将会耗费大量人力和物力资源。由于工作量的关系,Android没有也不可能为系统中的每一个组件都人工细致的优化。因此,亟需一种自动的系统优化方案。
发明内容
本发明旨在至少解决现有技术中存在的技术问题之一。为此,本发明的一个目的在于提出一种基于系统扩展调用图的操作系统自动优化方法。本方法自动化消除系统无用代码,减小系统体积,提升了系统性能,方便高效,优化效果明显。
本发明的第二个目的在于提出一种基于系统扩展调用图的操作系统自动优化系统。
为达到上述目的,本发明第一方面的实施例提出了一种基于系统扩展调用图的操作系统自动优化方法,包括以下步骤:对操作系统的源代码进行编译,生成可重定向的目标文件;根据所述目标文件构造系统扩展调用图,所述系统扩展调用图为有向图,用于记录所述目标文件中函数和数据对象之间的引用关系;根据所述系统扩展调用图生成所述操作系统的有效子图;根据所述有效子图对所述目标文件进行重写,得到优化后的目标文件;对所述优化后的所述目标文件进行链接,得到优化后的操作系统。
根据本发明的基于全系统扩展调用图的自动优化方法使用自动化的方法对操作系统进行优化,从编译后的目标文件中读取信息,构建系统扩展调用图,进一步得到扩展调用图中的有效子图,根据有效子图对目标文件重写后,链接生成优化的可执行文件和动态库文件。本方法消除无用代码,有效减小系统的体积,提升系统性能,不需人工干预,节省人力成本,提高效率。本方法应用范围广、自动化程度高、使用方便、可维护性好,优化效果明显。
在本发明的一个实施例中,所述对操作系统的源代码进行编译进一步包括:对所述源代码中每个函数和每个数据对象编译生成单独的段。
在本发明的一个实施例中,使用编译器中的编译选项生成所述单独的段。
在本发明的一个实施例中,所述系统扩展调用图包括结点集、边集和入口结点集合,其中,所述结点集为实体集合,所述实体包括代码中的函数和数据对象;边集包括前驱对后继存在使用关系的有向边的集合;入口结点集合包括进程的入口结点和程序中动态绑定的入口结点。
在本发明的一个实施例中,所述有效子图的结点集包括所述系统扩展调用图的所述入口点集以及所有所述入口点在所述系统扩展调用图中的子孙结点。
在本发明的一个实施例中,用二进制重写的方法对所述目标文件进行修改,将所述有效子图中不存的结点的对应信息删除。
在本发明的一个实施例中,所述操作系统为移动终端操作系统。
在本发明的一个实施例中,构造所述操作系统的所述系统扩展调用图进一步包括:使用库或工具读取每个所述目标文件,得到所述目标文件的信息集合;将所述目标文件的信息集合合并为全局有向图,得到所述系统扩展调用图的所述结点集合和所述边集合;将符合条件的所述函数和数据对象依次加入初始为空的所述入口点集合。
本发明第二方面的实施例提出了一种基于系统扩展调用图的操作系统自动优化系统,包括编译模块、系统扩展调用图生成模块、有效子图生成模块、重写模块和链接模块,其中,
所述编译模块用于对操作系统的源代码进行编译,生成可重定向的目标文件;所述系统扩展调用图生成模块用于根据所述目标文件构造所述系统扩展调用图,其中,所述系统扩展调用图为有向图,用于记录所述目标文件中函数和数据对象之间的引用关系;所述有效子图生成模块用于根据所述系统扩展调用图生成所述操作系统的有效子图;所述重写模块用于根据所述有效子图对所述目标文件进行重写,得到优化后的所述目标文件;所述链接模块用于对所述优化后的目标文件进行链接,得到优化后的所述操作系统。
根据本发明的基于全系统扩展调用图的自动优化系统使用自动化的系统对操作系统进行优化,从编译后的目标文件中读取信息,构建系统扩展调用图,进一步得到扩展调用图中的有效子图,根据有效子图对目标文件重写后,链接生成优化的可执行文件和动态库文件。本系统消除无用代码,有效减小系统的体积,提升系统性能,不需人工干预,节省人力成本,提高效率。同时,本系统应用范围广、自动化程度高、使用方便、可维护性好,优化效果明显。
在本发明的一个实施例中,所述编译模块对操作系统的源代码进行编译进一步包括:所述编译模块对所述源代码中每个所述函数和每个所述数据对象编译生成所述单独的段。
在本发明的一个实施例中,所述编译模块使用编译器中的编译选项生成所述单独的段。
在本发明的一个实施例中,所述系统扩展调用图包括结点集合、边集合和入口结点集合,其中,所述结点集合为实体集合,所述实体包括代码中的所述函数和所述数据对象;所述边集合包括前驱对后继存在使用关系的有向边的集合;所述入口结点集合包括进程的所述入口结点和程序中动态绑定的所述入口结点。
在本发明的一个实施例中,所述有效子图的结点集包括所述系统扩展调用图的所述入口点集以及所有所述入口点在所述系统扩展调用图中的子孙结点。
在本发明的一个实施例中,所述重写模块用二进制重写的方法对所述目标文件进行修改,将所述有效子图中不存的所述结点的对应信息删除。
在本发明的一个实施例中,所述操作系统为移动终端操作系统。
在本发明的一个实施例中,所述系统扩展调用图生成模块构造所述系统扩展调用图进一步包括:所述系统扩展调用图生成模块使用库或工具读取每个所述目标文件,得到所述目标文件的信息集合;所述系统扩展调用图生成模块将所述目标文件的信息集合合并为全局有向图,得到所述系统扩展调用图的所述结点集合和所述边集合;所述系统扩展调用图生成模块将符合条件的所述函数和数据对象依次加入初始为空的所述入口点集合。
本发明的附加方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明的上述和/或附加的方面和优点从结合下面附图对实施例的描述中将变得明显和容易理解,其中:
图1是根据本发明实施例的基于系统扩展调用图的操作系统自动优化方法的流程图;和
图2是根据本发明实施例的基于系统扩展调用图的操作系统自动优化系统的结构示意图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。
下面参考图1描述根据本发明实施例的基于系统扩展调用图的操作系统自动优化方法,包括以下步骤:
步骤S110:对操作系统的源代码进行编译,生成可重定向的目标文件。
进一步地,对操作系统的源代码进行编译包括:对源代码中每个函数和每个数据对象编译生成单独的段。
其中,使用编译器中的编译选项生成单独的段。
步骤S120:根据目标文件构造操作系统的系统扩展调用图,系统扩展调用图为有向图,用于记录目标文件中函数和数据对象之间的引用关系。
其中,系统扩展调用图包括结点集合、边集合和入口结点集合,其中,结点集合为实体集合,实体包括代码中的函数和数据对象;边集合为前驱对后继存在使用关系的有向边的集合;入口结点集合包括进程的入口结点和程序中动态绑定的入口结点。
构造操作系统的系统扩展调用图进一步包括:
使用库或工具读取每个目标文件,得到目标文件的信息集合;
将目标文件的信息集合合并为全局有向图,得到扩展调用图的结点集合和边集合;
将符合条件的实体依次加入初始为空的入口点集合。
步骤S130:根据系统扩展调用图生成系统的有效子图。
其中,有效子图的结点集合包括系统扩展调用图的入口点集合中的结点以及所有入口点在系统扩展调用图中的子孙结点。
步骤S140:根据有效子图对目标文件进行重写,得到优化后的目标文件。
进一步地,用二进制重写的方法对目标文件进行修改,将有效子图中不存的结点的对应信息删除。
步骤S150:对优化后的目标文件进行链接,得到优化后的系统。
下面以移动终端的操作系统优化为例对本方法进行解释说明。可以理解的是,下述优化仅出于示例目的,本发明的实施例不限于此。
步骤210:对移动终端操作系统的源代码进行编译,生成可重定向的目标文件,一般以.o为文件后缀名。使用编译选项使编译器对每个函数和数据对象都生成单独的段(section),例如,在编译前修改相关Makefile,向CFLAGS添加“-ffunction-sections”和“-fdata-sections”参数,使编译器将每个函数和数据对象编译到单独的段(section)中,以便后面的分析和优化。其中,也将函数和对象统称为实体,其中数据对象包括程序中显式定义的全局和静态变量以及编译器生成的虚函数表等数据。
步骤220:从目标文件提取信息,并记录函数、变量等相互之间的引用关系,根据已有信息构建操作系统的系统扩展调用图。其中,系统扩展调用图为有向图,例如表示为G=(V,E,R)的形式,其中,
(一)、V为结点集合:其中,每个结点与目标文件中一个实体对应,由于在步骤210中将每个实体编译到单独的段中,因此每个结点可以对应到目标文件中的一个段。
(二)、E为边集合:系统扩展调用图中的边均为有向边,可以以结点对的形式(u,v)表示,(u,v)∈E。有向边代表前驱结点u对后继结点v存在使用关系,即在u的重定向数据中有相对v的重定向记录时,在扩展调用图中有从u到v的边。。
(三)、R为入口点集合:E是V的子集。入口结点为进程的入口点,或者作为程序运行中动态绑定的入口点。代表程序的启动代码,或可能在程序运行中通过动态绑定访问,或属于特殊的段。
具体构建系统扩展调用图的方法如下:
步骤221:使用elfutils或类似的库、工具依次读取每个目标文件。对于每个目标文件,获取以下信息集合:
SS:该集合包括目标文件中所有含有实体的段的名称;
GS:该集合包括目标文件中定义的所有全局符号的信息。信息以关联表的形式存储,以便从全局符号的名称迅速查找它所在的段的名称。
AF:该集合包括头和尾都属于该目标文件的有向边的集合;
AU:该集合包括头属于该目标文件,尾为外部符号(即属于暂未解析的文件)的有向边的信息。其中每个元素表示为(u,sym),其中u属于SS,是该目标文件中的一个实体,sym为外部符号的名字,表示被u引用、但不在同一个目标文件中定义的实体。
步骤222:将步骤S221中所获得的信息合并为全局的有向图。这一步将得到扩展调用图的V和E:
V为所有目标文件的SS的并集。为了区分不同目标文件的段,在V中每个结点的名称以二元组<目标文件名,段名>的形式表示。
E表示包括E1、E2两部分,E=E1∪E2。其中E1为所有目标文件的AF的并集,代表头和尾都属于同一个目标文件的有向边的集合,E2为头和尾属于不同目标文件的有向边的集合。对所有目标文件的AF取并集得到E1。
具体地,求E2的方法为:
步骤222_2:遍历每个目标文件的AU集合,对其中的每一个元素(u,sym),查找所有目标文件的GS集,获得所有名称为sym的全局符号的实体集S[sym],并将所有二元组(u,v)加入集合E2,其中v∈S[sym]。
步骤222_3:将E1与E2取并集得到E。
步骤223:得到入口点集合R。
具体方法为:
步骤223_2:依次将下列结点加入集合R:
(一)、程序启动代码对应的实体。例如,在Android上为_start符号所对应的代码。
(二)、可能通过动态绑定使用的实体,包括:
(1)、C/C++程序可能使用动态绑定访问的实体:扫描所有目标文件的只读数据段(rodata),找到其中所有字符串。对于系统中的所有全局实体,如果其名字与其中一个字符串相同,则认为该实体可能通过动态绑定使用,将其加入入口点集。
(2)、JNI入口函数:Java代码通过JNI调用本地代码时,Java虚拟机动态打开相应的动态库文件,并以动态绑定的方式使用其中的函数。根据JNI的标准,JNI_OnLoad、JNI_OnUnload以及其他Java_*函数需标记为入口点。其中,动态注册的JNI入口在系统扩展调用图中已经被注册函数使用,因此无需特别标记。
(3)、系统中其他可能通过动态绑定使用的实体。
(三)、位于特殊段中的实体。其中,特殊段包括所有名称不以.text、.data、.rodata、.bss打头的段。
步骤230:根据系统扩展调用图得到有效子图。有效子图的结点集合包含系统扩展调用图的入口点集合,并且包括所有入口点在系统扩展调用图中的子孙结点。
有效子图Gs=(Vs,Es,R)是系统扩展调用图G=(V,E,R)的子图。其中,G与Gs的入口结点集R相同,Vs是V是子集,Es是E的子集。Vs和Es的用公式表示为:
其中,Desc(u)表示u在扩展调用图G中的所有子孙结点(包括u自身)的集合。具体实现时,可使用如下步骤计算Vs:
步骤232:从Q中任取一个结点u,将u从Q中删除,加入Visited,再将u在V中的所有直接后继结点加入Vs,将u的所有不属于Visited的直接后继结点加入Q。
步骤233:重复步骤232,直到Q为空。
得到Vs后,求Es的步骤包括:令Es为空集;遍历E中所有有向边(u,v),如果u和v都属于Vs,则将其加入Es。
根据Vs、Es和R得到有效子图Gs=(Vs,Es,R)。
步骤240:重写目标文件。用二进制重写的方法修改目标文件,从目标文件中删除不存在于有效子图中的结点相关的信息。
具体地,依次访问每个目标文件,作如下修改:
步骤241:检查每个不属于Vs的实体,如果可见性为默认(default),则改为隐藏(hidden)。
步骤242:对每个不属于Vs的实体,清除其重定向的数据。
步骤243:步骤242可能导致符号表中一部分外部引用不能被任何其它段使用,因此遍历符号表,将上述导致问题的符号删除。
其中,对目标文件的修改也可使用elfutils等库或工具。
步骤250:链接优化后的目标文件,得到优化后的系统。使用编译选项使无用代码不被链接入可执行文件和动态库文件。
在基于Make的构建环境中,修改Makefile添加链接选项“--gc-sections”可以在链接时对段进行垃圾收集。然后运行make命令。由于对目标文件进行重写后,目标文件的时间戳仍然比源文件新,因此目标文件不会重新生成,但此时可执行文件和动态库文件的时间戳已经比修改后的目标文件旧,因此将以重写后的目标文件作为输入进行链接,得到优化后的系统。
下面以开源操作系统安卓Android-x86honeycomb(3.2.3)版本作为实例对本发明的实施方式作进一步地详细描述,可以理解的是,下述描述仅处于示例目的,本发明的实施例不限于此。
从源代码服务器www.android-x86.org下载2012年2月15日的honeycomb软件作为源代码。在进行优化前,首先确定未经修改过的系统可以正常编译和运行,编译的配置使用eeepc-eng,测试环境可以使用VirtualBox等虚拟机软件,或使用x86CPU的笔记本电脑或平板电脑。
步骤S310:添加适当的编译、链接选项。具体操作为:编辑build/core/combo/TARGET_linux-x86.mk文件,添加选项“-ffunction-sections-fdata-sections”到TARGET_GLOBAL_CFLAGS,添加选项“-Wl,--gc-sections”到TARGET_GLOBAL_LDFLAGS,添加选项“--strip-unneeded”到TARGET_STRIP_COMMAND。
步骤S320:运行make命令,自动编译所有源代码,生成可重定向的目标文件。
步骤S330:根据目标文件构造操作系统的系统扩展调用图,根据系统扩展调用图生成系统的有效子图,根据有效子图对目标文件进行重写,得到优化后的目标文件。
步骤S340:再次运行make命令,自动重新链接生成优化后的可执行文件和动态库文件,并生成相应的Android镜像文件。
比较优化前和优化后的操作系统的代码体积,最终镜像中的所有ELF格式文件(Linux内核除外)的大小比优化前减少26%。
在测试环境中运行优化前和优化后的操作系统,对比得出如下结果:
使用Android Monkey评估系统的正确性:当使用相同的伪随机数种子时,最终输出的日志文件除了时间戳以外完全一致。使用AnTuTu Benchmark评估系统的性能,优化后的操作系统在整体性能上约有1%的提升。
根据本发明的基于全系统扩展调用图的自动优化方法通过程序分析技术,使用自动化的方法对操作系统进行分析和优化,在确保优化后的系统正确性不受影响的前提下,消除无用代码,有效减小系统的体积,提升系统性能。尤其对目前广泛采用的移动终端操作系统中的软件优化问题提出了可行的解决方案。
本发明具有如下优点:
(一)、应用范围广:凡是在系统上运行的本地代码可以限定在一个集合范围内的系统都可以使用本发明的方法进行优化。尤其是许多移动设备上的操作系统都具有此特点。由于本方法在目标文件的层面上进行操作,因此优化方法不依赖于具体的程序设计语言。例如,在Android的示例中,本地代码由C、C++和汇编语言进行编译,但本方法不限榆次,也可适用于使用其他程序设计语言的系统。
(二)、自动化程度高。根据本发明编写的工具无需或者只需很小修改就可以应用于不同的系统。而对被优化的系统,只需对其构建环境和过程进行很小的改动就可应用本方法,并且大多数操作都可自动完成,无需人工操作,节省人力,同时提高效率,方便快捷。
(三)、使用安全、方便,可维护性好。使用本方法对系统进行优化时,所有修改都在目标代码上进行,无需对源代码进行任何修改,从而保证不会因为优化而影响系统源代码的可维护性。
(四)、优化效果明显:真实系统代码中有许多无用代码,本方法在整个系统的范围内进行无用代码消除的优化,可以达到更明显的效果。在减小系统体积的同时,系统中保留代码的局部性提升有助于性能的提高。对于移动终端等设备,还可以减少硬件制造成本。
下面参考图2描述根据本发明实施例的基于系统扩展调用图的操作系统自动优化系统100,包括编译模块110、系统扩展调用图生成模块120、有效子图生成模块130、重写模块140和链接模块150。
其中,编译模块110用于对操作系统的源代码进行编译,生成可重定向的目标文件;系统扩展调用图生成模块120用于根据目标文件构造系统扩展调用图,其中,系统扩展调用图为有向图,用于记录目标文件中函数和数据对象之间的引用关系;有效子图生成模块130用于根据系统扩展调用图生成操作系统的有效子图;重写模块140用于根据有效子图对目标文件进行重写,得到优化后的目标文件;链接模块150用于对优化后的目标文件进行链接,得到优化后的操作系统。
其中,系统扩展调用图包括结点集合、边集合和入口结点集合,其中,结点集合为实体集合,实体包括代码中的函数和数据对象;边集合包括前驱对后继存在使用关系的有向边的集合;入口结点集合包括进程的入口结点和程序中动态绑定的入口结点。
有效子图的结点集包括系统扩展调用图的入口点集以及所有入口点在系统扩展调用图中的子孙结点。
在本发明的一个实施例中,编译模块110对操作系统的源代码进行编译进一步包括:编译模块110对源代码中每个函数和每个数据对象编译生成单独的段。编译模块110使用编译器中的编译选项生成单独的段。
下面以移动终端的操作系统优化为例对本系统进行解释说明。可以理解的是,下述优化仅出于示例目的,本发明的实施例不限于此。
编译模块110对移动终端操作系统的源代码进行编译,生成可重定向的目标文件,一般以.o为文件后缀名。编译模块110使用编译选项使编译器对每个函数和数据对象都生成单独的段(section),例如,编译模块110在编译前修改相关Makefile,向CFLAGS添加“-ffunction-sections”和“-fdata-sections”参数,使编译器将每个函数和数据对象编译到单独的段(section)中,以便后面的分析和优化。其中,也将函数和对象统称为实体,数据对象包括程序中显式定义的全局和静态变量以及编译器生成的虚函数表等数据。
系统扩展调用图生成模块120从目标文件提取信息,并记录函数、变量等相互之间的引用关系,根据已有信息构建操作系统的系统扩展调用图。其中,系统扩展调用图为有向图,例如表示为G=(V,E,R)的形式,其中,
(一)、V为结点集合:其中,每个结点与目标文件中一个实体对应,由于编译模块110将每个实体编译到单独的段中,因此每个结点可以对应到目标文件中的一个段。
(二)、E为边集合:系统扩展调用图中的边均为有向边,可以以结点对的形式(u,v)表示,(u,v)∈E。有向边代表前驱结点u对后继结点v存在使用关系,即在u的重定向数据中有相对v的重定向记录时,在扩展调用图中有从u到v的边。。
(三)、R为入口点集合:E是V的子集。入口结点为进程的入口点,或者作为程序运行中动态绑定的入口点。代表程序的启动代码,或可能在程序运行中通过动态绑定访问,或属于特殊的段。
系统扩展调用图生成模块120具体构建系统扩展调用图的方法如下:
步骤410:使用elfutils或类似的库、工具依次读取每个目标文件。对于每个目标文件,获取以下信息集合:
SS:该集合包括目标文件中所有含有实体的段的名称;
GS:该集合包括目标文件中定义的所有全局符号的信息。信息以关联表的形式存储,以便从全局符号的名称迅速查找它所在的段的名称。
AF:该集合包括头和尾都属于该目标文件的有向边的集合;
AU:该集合包括头属于该目标文件,尾为外部符号(即属于暂未解析的文件)的有向边的信息。其中每个元素表示为(u,sym),其中u属于SS,是该目标文件中的一个实体,sym为外部符号的名字,表示被u引用、但不在同一个目标文件中定义的实体。
步骤420:将步骤410中所获得的信息合并为全局的有向图。这一步将得到扩展调用图的V和E:
V为所有目标文件的SS的并集。为了区分不同目标文件的段,在V中每个结点的名称以二元组<目标文件名,段名>的形式表示。
E表示包括E1、E2两部分,E=E1∪E2。其中E1为所有目标文件的AF的并集,代表头和尾都属于同一个目标文件的有向边的集合,E2为头和尾属于不同目标文件的有向边的集合。对所有目标文件的AF取并集得到E1。
具体地,求E2的方法为:
步骤421:令。
步骤422::遍历每个目标文件的AU集合,对其中的每一个元素(u,sym),查找所有目标文件的GS集,获得所有名称为sym的全局符号的实体集S[sym],并将所有二元组(u,v)加入集合E2,其中v∈S[sym]。
步骤423:将E1与E2取并集得到E。
步骤430:得到入口点集合R。
具体方法为:
步骤432:依次将下列结点加入集合R:
(一)、程序启动代码对应的实体。例如,在Android上为_start符号所对应的代码。
(二)、可能通过动态绑定使用的实体,包括:
(1)、C/C++程序可能使用动态绑定访问的实体:扫描所有目标文件的只读数据段(rodata),找到其中所有字符串。对于系统中的所有全局实体,如果其名字与其中一个字符串相同,则认为该实体可能通过动态绑定使用,将其加入入口点集。
(2)、JNI入口函数:Java代码通过JNI调用本地代码时,Java虚拟机动态打开相应的动态库文件,并以动态绑定的方式使用其中的函数。根据JNI的标准,JNI_OnLoad、JNI_OnUnload以及其他Java_*函数需标记为入口点。其中,动态注册的JNI入口在系统扩展调用图中已经被注册函数使用,因此无需特别标记。
(3)、系统中其他可能通过动态绑定使用的实体。
(三)、位于特殊段中的实体。其中,特殊段包括所有名称不以.text、.data、.rodata、.bss打头的段。
有效子图生成模块130根据系统扩展调用图得到有效子图。有效子图的结点集合包含系统扩展调用图的入口点集合,并且包括所有入口点在系统扩展调用图中的子孙结点。
有效子图Gs=(Vs,Es,R)是系统扩展调用图G=(V,E,R)的子图。其中,G与Gs的入口结点集R相同,Vs是V是子集,Es是E的子集。Vs和Es的用公式表示为:
其中,Desc(u)表示u在扩展调用图G中的所有子孙结点(包括u自身)的集合。具体实现时,有效子图生成模块130可使用如下步骤计算Vs:
步骤520:从Q中任取一个结点u,将u从Q中删除,加入Visited,再将u在V中的所有直接后继结点加入Vs,将u的所有不属于Visited的直接后继结点加入Q。
步骤530:重复步骤520,直到Q为空。
得到Vs后,求Es的步骤包括:令Es为空集;遍历E中所有有向边(u,v),如果u和v都属于Vs,则将其加入Es。
根据Vs、Es和R得到有效子图Gs=(Vs,Es,R)。
重写模块140重写目标文件。重写模块140可以用二进制重写的方法修改目标文件,从目标文件中删除不存在于有效子图中的结点相关的信息。
具体地,重写模块140依次访问每个目标文件,作如下修改:
步骤610:检查每个不属于Vs的实体,如果可见性为默认(default),则改为隐藏(hidden)。
步骤620:对每个不属于Vs的实体,清除其重定向的数据。
步骤630:步骤620可能导致符号表中一部分外部引用不能被任何其它段使用,因此遍历符号表,将上述导致问题的符号删除。
其中,对目标文件的修改也可使用elfutils等库或工具。
链接模块150链接优化后的目标文件,得到优化后的系统。链接模块150使用编译选项使无用代码不被链接入可执行文件和动态库文件。
在基于Make的构建环境中,链接模块150修改Makefile添加链接选项“--gc-sections”可以在链接时对段进行垃圾收集。然后链接模块150运行make命令。由于对目标文件进行重写后,目标文件的时间戳仍然比源文件新,因此目标文件不会重新生成,但此时可执行文件和动态库文件的时间戳已经比修改后的目标文件旧,因此将以重写后的目标文件作为输入进行链接,得到优化后的系统。
下面以开源操作系统安卓Android-x86honeycomb(3.2.3)版本作为实例对本发明的实施例作进一步地详细描述,可以理解的是,下述描述仅处于示例目的,本发明的实施例不限于此。
从源代码服务器www.android-x86.org下载2012年2月15日的honeycomb软件作为源代码。在进行优化前,首先确定未经修改过的系统可以正常编译和运行,编译的配置使用eeepc-eng,测试环境可以使用VirtualBox等虚拟机软件,或使用x86CPU的笔记本电脑或平板电脑。
编译模块110添加适当的编译、链接选项。具体操作为:编译模块110编辑build/core/combo/TARGET_linux-x86.mk文件,添加选项“-ffunction-sections-fdata-sections”到TARGET_GLOBAL_CFLAGS,添加选项“-Wl,--gc-sections”到TARGET_GLOBAL_LDFLAGS,添加选项“--strip-unneeded”到TARGET_STRIP_COMMAND。编译模块110运行make命令,自动编译所有源代码,生成可重定向的目标文件。
系统扩展调用图生成模块120根据目标文件构造操作系统的系统扩展调用图,系统扩展调用图为有向图模块根据系统扩展调用图生成系统的有效子图,重写模块140根据有效子图对目标文件进行重写,得到优化后的目标文件。
链接模块150再次运行make命令,自动重新链接生成优化后的可执行文件和动态库文件,并生成相应的Android镜像文件。
比较优化前和优化后的操作系统的代码体积,最终镜像中的所有ELF格式文件(Linux内核除外)的大小比优化前减少26%。
在测试环境中运行优化前和优化后的操作系统,对比得出如下结果:
使用Android Monkey评估系统的正确性:当使用相同的伪随机数种子时,最终输出的日志文件除了时间戳以外完全一致。使用AnTuTu Benchmark评估系统的性能,优化后的操作系统在整体性能上约有1%的提升。
根据本发明的基于全系统扩展调用图的自动优化系统通过程序分析技术,使用自动化的方法对操作系统进行分析和优化,在确保优化后的系统正确性不受影响的前提下,消除无用代码,有效减小系统的体积,提升系统性能。尤其对目前广泛采用的移动终端操作系统中的软件优化问题提出了可行的解决方案。
本发明具有如下优点:
(一)、应用范围广:凡是在系统上运行的本地代码可以限定在一个集合范围内的系统都可以使用本发明的系统进行优化。尤其是许多移动设备上的操作系统都具有此特点。由于本系统在目标文件的层面上进行操作,因此优化系统不依赖于具体的程序设计语言。例如,在Android的示例中,本地代码由C、C++和汇编语言进行编译,但本系统不限榆次,也可适用于使用其他程序设计语言的系统。
(二)、自动化程度高。根据本发明编写的工具无需或者只需很小修改就可以应用于不同的系统。而对被优化的系统,只需对其构建环境和过程进行很小的改动就可应用本系统,并且大多数操作都可自动完成,无需人工操作,节省人力,同时提高效率,方便快捷。
(三)、使用安全、方便,可维护性好。使用本系统对系统进行优化时,所有修改都在目标代码上进行,无需对源代码进行任何修改,从而保证不会因为优化而影响系统源代码的可维护性。
(四)、优化效果明显:真实系统代码中有许多无用代码,本系统在整个系统的范围内进行无用代码消除的优化,可以达到更明显的效果。在减小系统体积的同时,系统中保留代码的局部性提升有助于性能的提高。对于移动终端等设备,还可以减少硬件制造成本。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同限定。
Claims (16)
1.一种基于系统扩展调用图的操作系统自动优化方法,其特征在于,包括以下步骤:
对操作系统的源代码进行编译,生成可重定向的目标文件;
根据所述目标文件构造系统扩展调用图,所述系统扩展调用图为有向图,用于记录所述目标文件中函数和数据对象之间的引用关系;
根据所述系统扩展调用图生成所述操作系统的有效子图;
根据所述有效子图对所述目标文件进行重写,得到优化后的所述目标文件;以及
对所述优化后的目标文件进行链接,得到优化后的所述操作系统。
2.如权利要求1所述的基于系统扩展调用图的操作系统自动优化方法,其特征在于,所述对操作系统的源代码进行编译进一步包括:
对所述源代码中每个所述函数和每个所述数据对象编译生成所述单独的段。
3.如权利要求2所述的基于系统扩展调用图的操作系统自动优化方法,其特征在于,使用编译器中的编译选项生成所述单独的段。
4.如权利要求1所述的基于系统扩展调用图的操作系统自动优化方法,其特征在于,所述系统扩展调用图包括结点集、边集和入口结点集合,其中,所述结点集为实体集合,所述实体包括代码中的函数和数据对象;所述边集包括前驱对后继存在使用关系的有向边的集合;所述入口结点集合包括进程的所述入口结点和程序中动态绑定的所述入口结点。
5.如权利要求1所述的基于系统扩展调用图的操作系统自动优化方法,其特征在于,所述有效子图的结点集包括所述系统扩展调用图的所述入口点集以及所有所述入口点在所述系统扩展调用图中的子孙结点。
6.如权利要求1所述的基于系统扩展调用图的操作系统自动优化方法,其特征在于,用二进制重写的方法对所述目标文件进行修改,将所述有效子图中不存的所述结点的对应信息删除。
7.如权利要求1所述的基于系统扩展调用图的操作系统自动优化方法,其特征在于,所述操作系统为移动终端操作系统。
8.如权利要求1所述的基于系统扩展调用图的操作系统自动优化方法,其特征在于,构造所述操作系统的所述系统扩展调用图进一步包括:
使用库或工具读取每个所述目标文件,得到所述目标文件的信息集合;
将所述目标文件的信息集合合并为全局有向图,得到所述系统扩展调用图的所述结点集合和所述边集合;
将符合条件的所述函数和数据对象依次加入初始为空的所述入口点集合。
9.一种基于系统扩展调用图的操作系统自动优化系统,其特征在于,包括编译模块、系统扩展调用图生成模块、有效子图生成模块、重写模块和链接模块,其中,
所述编译模块,用于对操作系统的源代码进行编译,生成可重定向的目标文件;
所述系统扩展调用图生成模块,用于根据所述目标文件构造所述系统扩展调用图,其中,所述系统扩展调用图为有向图,用于记录所述目标文件中函数和数据对象之间的引用关系;
所述有效子图生成模块,用于根据所述系统扩展调用图生成所述操作系统的有效子图;
所述重写模块。用于根据所述有效子图对所述目标文件进行重写,得到优化后的所述目标文件;以及
所述链接模块,用于对所述优化后的目标文件进行链接,得到优化后的所述操作系统。
10.如权利要求9所述的基于系统扩展调用图的操作系统自动优化系统,其特征在于,所述编译模块对操作系统的源代码进行编译进一步包括:
所述编译模块对所述源代码中每个所述函数和每个所述数据对象编译生成所述单独的段。
11.如权利要求10所述的基于系统扩展调用图的操作系统自动优化系统,其特征在于,所述编译模块使用编译器中的编译选项生成所述单独的段。
12.如权利要求9所述的基于系统扩展调用图的操作系统自动优化系统,其特征在于,所述系统扩展调用图包括结点集合、边集合和入口结点集合,其中,所述结点集合为实体集合,所述实体包括代码中的所述函数和所述数据对象;所述边集合包括前驱对后继存在使用关系的有向边的集合;所述入口结点集合包括进程的所述入口结点和程序中动态绑定的所述入口结点。
13.如权利要求9所述的基于系统扩展调用图的操作系统自动优化系统,其特征在于,所述有效子图的结点集包括所述系统扩展调用图的所述入口点集以及所有所述入口点在所述系统扩展调用图中的子孙结点。
14.如权利要求9所述的基于系统扩展调用图的操作系统自动优化系统,其特征在于,所述重写模块用二进制重写的方法对所述目标文件进行修改,将所述有效子图中不存的所述结点的对应信息删除。
15.如权利要求9所述的基于系统扩展调用图的操作系统自动优化方法,其特征在于,所述操作系统为移动终端操作系统。
16.如权利要求9所述的基于系统扩展调用图的操作系统自动优化方法,其特征在于,所述系统扩展调用图生成模块构造所述系统扩展调用图进一步包括:
所述系统扩展调用图生成模块使用库或工具读取每个所述目标文件,得到所述目标文件的信息集合;
所述系统扩展调用图生成模块将所述目标文件的信息集合合并为全局有向图,得到所述系统扩展调用图的所述结点集合和所述边集合;
所述系统扩展调用图生成模块将符合条件的所述函数和数据对象依次加入初始为空的所述入口点集合。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2013100845605A CN103116514A (zh) | 2013-03-15 | 2013-03-15 | 基于系统扩展调用图的操作系统自动优化方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2013100845605A CN103116514A (zh) | 2013-03-15 | 2013-03-15 | 基于系统扩展调用图的操作系统自动优化方法和系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN103116514A true CN103116514A (zh) | 2013-05-22 |
Family
ID=48414899
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2013100845605A Pending CN103116514A (zh) | 2013-03-15 | 2013-03-15 | 基于系统扩展调用图的操作系统自动优化方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103116514A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104035773A (zh) * | 2014-06-11 | 2014-09-10 | 清华大学 | 基于扩展调用图的软件系统结点重要度评价方法 |
CN111338635A (zh) * | 2020-02-20 | 2020-06-26 | 腾讯科技(深圳)有限公司 | 计算图的图编译方法、装置、设备及存储介质 |
CN113721928A (zh) * | 2021-11-02 | 2021-11-30 | 成都无糖信息技术有限公司 | 一种基于二进制分析的动态库裁剪方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050262491A1 (en) * | 2003-11-26 | 2005-11-24 | Junjie Gu | Updating profile frequency for procedure inlining |
US20110321021A1 (en) * | 2010-06-25 | 2011-12-29 | International Business Machines Corporation | Arranging Binary Code Based on Call Graph Partitioning |
CN103034486A (zh) * | 2012-11-28 | 2013-04-10 | 清华大学 | 移动终端操作系统基于全系统扩展调用图的自动优化方法 |
-
2013
- 2013-03-15 CN CN2013100845605A patent/CN103116514A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050262491A1 (en) * | 2003-11-26 | 2005-11-24 | Junjie Gu | Updating profile frequency for procedure inlining |
US20110321021A1 (en) * | 2010-06-25 | 2011-12-29 | International Business Machines Corporation | Arranging Binary Code Based on Call Graph Partitioning |
CN103034486A (zh) * | 2012-11-28 | 2013-04-10 | 清华大学 | 移动终端操作系统基于全系统扩展调用图的自动优化方法 |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104035773A (zh) * | 2014-06-11 | 2014-09-10 | 清华大学 | 基于扩展调用图的软件系统结点重要度评价方法 |
CN104035773B (zh) * | 2014-06-11 | 2017-04-12 | 清华大学 | 基于扩展调用图的软件系统结点重要度评价方法 |
CN111338635A (zh) * | 2020-02-20 | 2020-06-26 | 腾讯科技(深圳)有限公司 | 计算图的图编译方法、装置、设备及存储介质 |
CN111338635B (zh) * | 2020-02-20 | 2023-09-12 | 腾讯科技(深圳)有限公司 | 计算图的图编译方法、装置、设备及存储介质 |
CN113721928A (zh) * | 2021-11-02 | 2021-11-30 | 成都无糖信息技术有限公司 | 一种基于二进制分析的动态库裁剪方法 |
CN113721928B (zh) * | 2021-11-02 | 2022-01-18 | 成都无糖信息技术有限公司 | 一种基于二进制分析的动态库裁剪方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102819492B (zh) | 一种基于Android的关键字驱动自动化测试框架 | |
CN103034486B (zh) | 移动终端操作系统基于全系统扩展调用图的自动优化方法 | |
US9182980B2 (en) | Expansion and reduction of source code for code refactoring | |
US11372630B2 (en) | Efficient immutable syntax representation with incremental change | |
CN108139891B (zh) | 用于生成建议以纠正未定义标记错误的方法和系统 | |
CN105893014A (zh) | 用于前端的项目开发方法及系统 | |
CN101334728A (zh) | 一种基于xml文档描述的界面生成方法和平台 | |
WO2011084875A2 (en) | Creating inferred symbols from code usage | |
CN111090433A (zh) | 一种数据处理的方法、装置和存储介质 | |
US20130152061A1 (en) | Full fidelity parse tree for programming language processing | |
CN118202330A (zh) | 在代码更新时检查源代码有效性 | |
CN109388403A (zh) | 依赖注入方法、装置、设备和存储介质 | |
CN110109671B (zh) | 一种webpack标签尺寸样式转换方法及装置 | |
US10809985B2 (en) | Instrumenting program code | |
CN113312046A (zh) | 子应用页面处理方法、装置和计算机设备 | |
CN107526679A (zh) | 自动化测试框架、基于其上的自动化测试方法、存储介质和计算机设备 | |
Reimann et al. | Role-based generic model refactoring | |
CN102521008A (zh) | 程序编译装置和程序编译方法 | |
Khatchadourian et al. | [Engineering Paper] A Tool for Optimizing Java 8 Stream Software via Automated Refactoring | |
CN115794254A (zh) | 基于云计算的组件研发管理平台和方法 | |
CN103116514A (zh) | 基于系统扩展调用图的操作系统自动优化方法和系统 | |
US20180260197A1 (en) | Extensible instrumentation | |
Cooper | Integrating dataflow evaluation into a practical higher-order call-by-value language | |
CN111984300B (zh) | 代码复制方法及装置、电子设备和计算机可读存储介质 | |
CN111158665B (zh) | 代码生成方法及装置、电子设备和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20130522 |