APP下载

VxWorks实时操作系统模块加载分析与加载速度优化

2016-03-12中国科学院软件研究所李彦峰李丽颖山东农村信用社联合社韩广志金陵科技学院

电子世界 2016年6期
关键词:数组哈希应用程序

中国科学院软件研究所 李彦峰 李丽颖山东农村信用社联合社 韩广志金陵科技学院 闵 建



VxWorks实时操作系统模块加载分析与加载速度优化

中国科学院软件研究所 李彦峰 李丽颖
山东农村信用社联合社 韩广志
金陵科技学院 闵 建

【摘要】通过分析VxWorks系统符号表的生成过程发现,整个系统的符号表生成是自动进行的,这就导致系统会生成一些额外的符号信息。这些符号信息不仅会使得系统变得臃肿,而且会增加系统符号哈希表的冲突概率,从而降低模块加载时符号解析的速度。本文主要介绍利用减小VxWorks实时操作系统符号表提高模块加载速度。由于利用tornado环境编译VxWorks系统的时候会自动生成系统的全部符号信息,会导致系统变得臃肿。同时也会使得downloadable型应用程序在加载的时候符号解析过程时间复杂度提高。

【关键词】符号表;downloadable;模块加载;符号解析

0 引言

随着应用程序对实时操作系统的需求越来越复杂,传统的将所有的应用程序编译到大内核的方式已不能满足系统的需求。为了实现实时系统的灵活型,实时系统需要具备从外部加载模块的功能;而加载过程涉及到模块外部引入符号的解析。这就要求系统符号提供为模块解析符号的功能,而系统符号表正是为实现这个功能而存在的。系统符号表用于建立符号名称、类型和值之间的关系。其中,符号名称为NULL结尾的任意字符串;类型为标志各种符号的正数;值是一个字符指针,用于保存符号在内存中的地址。在模块加载的时候,如果模块中出现外部引入的符号,则可以通过模块中外部引入的模块名称来查找与该符号对应的实现地址。而系统符号表则提供符号名称和符号地址的解析的桥梁,VxWorks正是通过符号表为downloadable型应用程序提供API调用的实现以及系统全局变量使用。

1 符号表的生成以及管理

1.1 符号表的作用

VxWorks系统的全局模块加载函数loadModule函数实现加载VxWorks系统下可执行的二进制文件。在loadModule函数的调用流程中symFindByName函数用于downloadable型应用程序的符号解析。每个downloadable型应用程序中包含符号数据结构,在此数据结构中包含外部引入符号以及这些符号在程序中被使用的地址,symFindByName函数根据外部引入符号的符号名称查找该符号在内存中的地址。符号表的每个符号项包含符号名称、类型和值,符号项的值就是符号在内存中的地址。因此,符号项的符号名称经过散列函数生成解析符号的关键字,解析成功之后,loadModule函数会根据downloadable型应用程序自身包含的符号信息,将对应的符号值填充到程序中对应的地方。如果,解析不成功则会报错,不过程序不会终止运行。

symFindByName函数的实现在符号表函数库symLib.c文件中,在这个文件中,定义sysSymTbl管理符号的哈希表。sysSymTbl符号哈希表实现对系统符号表的存储管理,所以symFindByName的搜索过程依赖sysSymTbl系统符号哈希表中的哈希查找。symFindByName函数查找时,以符号项的符号名称经过哈希散列函数操作生成关键字搜索整个sysSymTbl哈希表。如果在哈希表中出现冲突,就会对冲突的哈希表项进行链式搜索,直到找到符号项或者到达链表的表尾。如果到达表尾还没有找到符号项则会报错,但是不会退出。

1.2 系统符号哈希表的建立

VxWorks系统先由bootRom完成,该部分完成VxWorks系统的加载。在bootRom将系统加载到内存之后,整个系统的控制权转交给VxWorks系统。VxWorks主要完成系统的初始化,这些操作都是在Root任务中实现的。Root任务调用函数usrRoot进行系统的初始化,初始化过程通过调用symLib. c文件中的相应函数对系统符号哈希表sysSymTbl的建立过程。建立过程中,符号名称经过哈希散列函数生成关键字。此关键字作为索引找到系统符号哈希表sysSymTbl中,并将符号项插入到索引到的系统符号哈希表项之后。如果在哈希表的建立过程中发生冲突,则以拉链法将所有的冲突符号项链接到索引到的关键字的系统符号哈希表项后面。

在系统符号哈希表sysSymTbl建表过程中,添加到的sysSymTbl中的符号项的生成依赖于编译器的支持。如果在编译VxWorks系统的时候添加了符号表的支持,那么在编译的时候会利用makeSymTbl.exe工具生成symTbl.c文件。该文件当中包含四个部分:第一个是包含的头文件,第二个是利用编译器提供的IMPORT语句,第三个是一个符号数组standTbl,第四个是第三个符号数组的数目standTblSize。其中,第二部分的IMPORT指令用于得到相应的符号的地址,这些地址由编译器在编译时确定,并填充到第三部分的符号数组standTbl中的符号项的value成员变量中。系统符号哈希表正是通过standTbl中的符号项的符号名称和value成员变量实现符号地址和符号名称的对应关系。如果系统符号哈希表中没有添加相应的符号项,那么对该符号的解析过程就会失败。但是,由于符号项在编译的时候会放到生成的系统文件中的.data段中,所以过多符号项的存在会导致编译出来的VxWorks系统文件变得臃肿。同时过多的符号项会增加系统符号哈希表sysSymTbl冲突发生的概率。而当系统符号哈希表查找冲突时,就会以链表的形式进行遍历。整个系统的哈希表大小为2的8次幂,也就是256个哈希表项。这样,当出现大量的哈希表项时,就很容易引起冲突而进行顺序查找。

1.3 符号数组standTbl的生成

在tornado集成开发环境下编译VxWorks时,新建bootable型工程会自动生成对应makefile文件,该文件会引用rule.VxWorks文件中的生成规则生成符号表文件symTbl.c文件。在系统初始化时,系统会调用相关的函数将这个文件中的standTbl数组填充到系统的全局符号哈希表sysSymTbl中。然而,由于自动生成的符号数组standTbl中的符号项包含多余的符号信息,这样就会增加系统符号哈希表的冲突概率。而downloadable型应用程序在加载时需要解析自身从外部引入的符号,如果冲突就会导致搜索符号项的速度降低,从而间接导致downloadable型应用程序加载速度过慢。

2 符号表的优化

经过上面的分析,减小符号表需要分三步进行实施。第一,需要了解downloadable型应用程序需要哪些外部的符号;第二,利用一些手工操作将symTbl.c文件中的不必需的符号项给删除掉;第三,需要阻止在编译VxWorks的时候自动生成symTbl.c的过程。以下是具体的实施过程:

首先利用tornado环境自动生成symTbl.c文件,该文件作为筛选的符号超集。自动生成的符号数组standTbl包括所有系统实现的符号的信息,把符号超集中删除downloadable型应用程序不必需的符号即可以实现减少系统符号哈希表的大小。然后利用生成的VxWorks系统目标平台下的nm程序的-u命令,导出downloadable型应用程序的未定义符号。操作步骤为:nm –u application(application为downloadable型应用程序的名称),由于nm命令只是将结果输出到控制台上面,可以利用系统提供的重定位功能将其输出重定位到特定文件中(约定文件名为a.txt)。这一步主要实现生成一个包含downloadable型应用程序必需的符号名称的文件。由于nm –u仅仅输出符号的符号名称,所以还需要一个修改过程。当symTbl.c文件中的符号数组standTbl中的符号项的符号名称出现在a.txt文件中时,则保留在原symTbl. c文件中,否则删除standTbl中的符号项,并且删除symTb.c第二部分中与该符号项对应的生成符号地址的语句,同时symTbl.c文件的第四部分符号数项计数自减1。经过该操作后,symTbl.c文件仅包含downloadable类型应用程序所必需的符号项。

经过上面的修改之后,symTbl.c文件仅包含加载downloadable型应用程序所必需的符号信息。为了阻止tornado编译环境生成系统时将修改后的symTbl.c覆盖掉,还需要找到自动生成symTbl.c文件的那条规则,并将其删除。找到targethmake ules.VxWorks文件中控制生成symTbl.c文件的规则:

symTbl.o:partialImage.o

- @ $(RM) $@

$(CP) partialImage.o tmp.o

$(LDOUT_SYMS) tmp.o

$(MKSYMTBL) tmp.o > symTbl.c

- @ $(RM) tmp.o

$(COMPILE_SYMTBL) symTbl.c -o $@

将上面的生成规则改成:

symTbl.o:

$(COMPILE_SYMTBL) symTbl.c -o $@

由于上诉规则并没有禁止将symTbl.c文件编译生成symTbl.o文件;所以在链接成VxWorks系统时,不会影响将symTbl.o链接到VxWorks系统文件中。重新编译生成VxWorks系统,此时VxWorks系统当中的符号仅仅包含downloadable型应用程序所必需的符号信息。系统的符号信息保存在standTbl数组中,而数组不仅需要占用系统文件的内存,在系统加载到内存时也需要一部分系统内存来保存该数组。因此,减小系统的符号可以减小编译生成的VxWorks的大小,还可以减少VxWork系统占用的内存空间。同时,standTbl数组变小,会减小挂载到系统符号哈希表的符号项,从而间接达到提高downloadable型应用程序加载的目的。

3 总结

VxWorks系统的符号表中仅包含downloadable型应用程序所必须的符号,可以达到间接裁剪内核的目的,同时使得VxWorks系统符号哈希表的256个表项较符号数组standTbl的项多,从而大大降低哈希表查找过程冲突发生的可能性。同时,在模块加载时,加载过程的符号解析部分最好将会在O(1)时间复杂度完成,最差也不会比原来包含全部的符号表差。本文主要通过更加灵活的符号表裁剪手段,灵活控制系统符号表的大小,从而达到裁剪系统和加快downloadable型应用程序加载速度的目的。

参考文献

[1]方箭,鲁俊,朱颖,李芃芃.全球数字红利频谱释放现状及展望[J].电讯技术,2015(12).

[2]王文俭.2015CISPR年会主要技术内容CISPR/H[J].安全与电磁兼容,2015(06).

[3]方箭,李景春,黄标,冯岩.5G频谱研究现状及展望[J].电信科学,2015(12).

李彦峰(1982-),山东德州人,硕士研究生,中级职称,研究方向:软件工程嵌入式系统。

作者简介:

猜你喜欢

数组哈希应用程序
JAVA稀疏矩阵算法
哈希值处理 功能全面更易用
文件哈希值处理一条龙
JAVA玩转数学之二维数组排序
删除Win10中自带的应用程序
谷歌禁止加密货币应用程序
Excel数组公式在林业多条件求和中的应用
基于OpenCV与均值哈希算法的人脸相似识别系统
巧用哈希数值传递文件
寻找勾股数组的历程