一种嵌入式实时操作系统动态加载方法与流程

文档序号:11406870阅读:4481来源:国知局
一种嵌入式实时操作系统动态加载方法与流程

本发明涉及嵌入式操作系统中动态加载技术的实现方法,特别涉及一种嵌入式实时操作系统动态加载方法。



背景技术:

随着嵌入式操作系统地不断深入发展,以及用户需求的多样化,迫切需要一种机制能在操作系统运行状态下配置系统,即动态添加模块。这项技术的突破解决了利用中断程序进行加载的劣势,大大降低了嵌入式操作系统模块调试难度,提升系统综合性能。对保证系统的可靠性,延长系统生命周期,降低系统开发成本都具有十分重要的意义。

动态加载的实现对于嵌入式操作系统非常重要。一方面,现有采用的静态加载的方式存在一定的弊端,需要在运行前将所需的功能模块链接到系统,然后重新编译运行。在运行过程中如若发现需要新增的功能模块,就需要停止正在运行的程序,重新执行链接等全部步骤,大大浪费了空间资源,同时也降低了工作效率。另一方面,针对强实时嵌入式操作系统多任务共享内存地址空间的特性,,一般的动态加载技术并不能满足其动态加载的需求。因此,需要提供一种新型的模块动态加载方式,来实现这一功能。



技术实现要素:

本发明的目的在于提供一种嵌入式实时操作系统动态加载方法,用于解决上述现有技术的问题。

本发明一种嵌入式实时操作系统动态加载方法,其中,包括:操作系统通过输入命令行指令,生成操作系统的符号查找表,并作为目标模块动态加载基准符号查找表;当目标模块被载入时,目标模块会将包含的所有外部接口和全局变量列出,构成该目标模块的全局符号查找表,操作系统对全局符号查找表进行解析,确定操作系统能够识别的外部接口和全局变量,并与能够识别的外部接口与全局变量建立链接关系,并添加入操作系统的符号查找表;对目标模块中包含的所有外部接口和全局变量的地址进行重新定位,当运行到外部接口和全局变量后,通过操作系统的符号查找表,重新定位到操作系统的符号查找表的相应地址处。

根据的嵌入式实时操作系统动态加载方法的一实施例,其中,操作系统根据elf文件头所需参数,通过输入命令行指令,生成操作系统的符号查找表。

根据的嵌入式实时操作系统动态加载方法的一实施例,其中,还包括:重定位完成后,操作系统调用查找符号函数接口,实现对外部接口的解析,跳转到已解析的符号查找表中的相应地址处。

根据的嵌入式实时操作系统动态加载方法的一实施例,其中,加载目标模块前,调用打开动态库接口,向操作系统发出需要加载目标模块的指令。

根据的嵌入式实时操作系统动态加载方法,其中,未被操作系统解析的外部接口和全部变量,被系统检测到后,以错误码形式告知。

根据的嵌入式实时操作系统动态加载方法的一实施例,其中,重定位完成后,当运行到目标模块中的外部接口和全局变量时,首先在内存中找到目标模块建立的符号查找表中对应该外部接口或全局变量的地址,并调用操作系统中查找符号接口,在新构成的系统全局符号查找表中找到相关联的外部接口或全局变量的相应地址,实现跳转。

本发明嵌入式实时操作系统动态加载方法,针对强实时嵌入式操作系统多任务共享内存地址空间的情况,即针对单进程多线程的嵌入式实时操作系统特性,实现对所需模块的在程序运行过程中的动态加载方法。支持基于一个内核镜像的多模块并行开发和调试,以模块的方式加载组件,使系统更容易对模块进行认证,添加外部模块的支持时无需重新编译操作系统内核。有效地规避了嵌入式操作系统静态加载效率低的弊端,提高了嵌入式操作系统的运行效率。

附图说明

图1所示为本发明嵌入式实时操作系统动态加载方法的流程图;

图2所示为生成新的操作系统符号查找表的示意图。

具体实施方式

为使本发明的目的、内容、和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。

图1所示为本发明嵌入式实时操作系统动态加载方法的流程图,本发明嵌入式实时操作系统动态加载方法主要包括:生成系统符号查找表、目标模块加载、重定位链接和跳转运行四个部分。

本发明嵌入式实时操作系统动态加载方法具体包括:

生成系统符号查找表,包括:

操作系统根据elf文件头所需参数,通过输入命令行指令,生成操作系统的符号查找表,并作为目标模块动态加载基准符号查找表,便于在后续步骤中添加目标模块解析后的外部接口和全局变量。

进行目标模块加载,包括:

当目标模块被载入时,目标模块会将包含的所有外部接口和全局变量列出,构成该目标模块的全局符号查找表,全局符号查找表包括外部接口和全局变量,并通过申请内存空间的方式存储到操作系统所分配的一段内存中。然后操作系统会对该目标模块的全局符号查找表进行解析,确定哪些外部接口和全局变量是操作系统能够识别的,并与能够识别的外部接口与全局变量建立链接关系,在基准符号查找表中添加能够识别的外部接口地址指针与全局变量地址指针。即增加到操作系统的符号查找表中,构成新的操作系统符号查找表。

重定位链接包括:

在装载地址确定之后,对目标模块中包含的所有外部接口和全局变量的地址进行重新定位,当运行到外部接口后,通过新的操作系统符号查找表,重新定位到目标模块的全局符号查找表的相应地址处。即在运行过程中加载诸如插件、驱动等功能模块时,调用模块中外部接口时,操作系统会直接从新生成的全局符号查找表中找到函数的相应地址。

跳转运行包括:

重定位完成后,操作系统会调用动态链接器提供的查找符号(objsym)函数接口,实现对外部接口的解析,即跳转到已解析的符号查找表中的相应地址处,最终实现对模块的动态加载。

如图1所示,本发明嵌入式实时操作系统动态加载方法的另一实施例包括:

1、生成系统符号查找表

在加载新模块之前,首先要生成操作系统的符号查找表,将其作为实现动态加载的基本要素。依托操作系统的内核源码,利用命令行指令生成目标可执行文件以及系统符号表。并获取系统符号表的内存地址,便于后期地址查找、跳转运行等操作的进行。

2、目标模块的加载

图2所示为生成新的操作系统符号查找表的示意图,如图2所示,首先需要调用打开动态库(objopen)接口,向操作系统发出需要加载目标模块的指令。所要加载的目标模块通常是elf文件格式,在elf的文件头中包含了该文件的大小、数据等相关信息,通过对elf头文件进行解析,可获取目标文件中所包含的全部外部接口和全局变量。解析完成后,需要在系统中申请一段新的内存,存储从目标模块中解析出来的全部外部接口和全局变量,并构成目标模块的全局符号查找表。同时,与操作系统符号查找表相关联,将已解析的外部接口与全局变量添加到系统的符号查找表中,生成新的操作系统符号查找表,如图2所示。

目标模块的全局符号查找表中存放着目标模块所包含外部接口的实际地址。用户如需调用目标模块所包含外部接口,需要通过新构成的操作系统查找表找到目标模块外部接口的相应地址处。(目标模块的全局符号查找表存入内存中仍要使用。因为目标模块的全局符号查找表中存放着目标模块所包含外部接口在内存中存放的实际地址,最终的调用都要通过目标模块的全局符号查找表执行。)

3、重定位链接

实现对目标模块的加载,即需要系统运行时实现对目标模块外部接口的识别、链接。在这个过程中,已被解析的外部接口会直接被重定位到操作系统的符号查找表中,等待系统调用;未被解析的外部接口会被系统检测到,以错误码形式被告知。

4、跳转运行

当运行到模块中的外部接口和全局变量时,首先调用操作系统中查找符号(objsym)接口,在新构成的系统全局符号查找表中找到相关联的外部接口或全局变量的相应地址,最后在内存中找到目标模块建立的符号查找表中对应该外部接口或全局变量的地址,实现跳转,从而完成对目标模块的动态加载的全过程。

为了便于后续对目标模块的重复加载,即在需要时或对模块修改后进行再次加载,需要在本次加载运行完成后调用关闭动态库(objclose),实现对模块目标的关闭、卸载,使操作系统中相应的计数置0,以保证下次加载成功。

进一步的,在操作系统中对目标模块需要实现几个相关接口的功能,其中包括:打开动态库(objopen)、查找符号(objsym)、错误处理(objerror)和关闭动态库(objclose)。具体功能描述如下:

打开动态库(objopen)函数,打开一个动态链接库,并将其加载到进程的地址空间,完成初始化过程。以指定模式打开指定的动态链接库文件,并返回句柄给objsym()的调用进程,使用objclose()来卸载打开的库。

查找符号(objsym)函数,是运行时装载的核心部分,根据动态链接库操作句柄与符号,返回符号对应的地址,从而找到所需要的符号。

错误处理(objerror)函数,在每次调用objopen()、objsym()、objclose()以后,都可以调用objerror()来判断上一次调用是否成功。objerror()的返回值类型是char*,如果返回null,则表示上一次调用成功;如果不是,则返回相应的错误消息。

关闭动态库(objclose)函数,用于关闭指定句柄的动态链接库,作用跟dlopen()相反。只有当此动态链接库的使用计数为0时,才会真正被系统卸载。

本发明嵌入式实时操作系统动态加载方法,解决了在没有多进程管理机制的情况下,通过操作系统提供的api接口完成打开动态库(objopen)、查找符号(objsym)、错误处理(objerror)和关闭动态库(objclose)的操作,实现将已解析的外部接口和全局变量添加到原操作系统的符号查找表中,并对外部接口进行重定位,最终在运行过程中跳转到解析后的地址处,完成对新模块的动态加载。

本发明嵌入式实时操作系统动态加载方法,,摒弃了嵌入式操作系统静态加载工作重复度高,效率慢的缺点,仅通过操作系统提供的api接口完成打开动态库(objopen)、查找符号(objsym)、错误处理(objerror)和关闭动态库(objclose)的操作,实现对新加载模块的动态加载,大大提高了嵌入式操作系统的运行性能。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1