基于数字信号处理器(DSP)的多功能自适应通信系统在软件无线电领域正变得日益普遍,如何使DSP系统在运行期间自适应的改变通信协议是实现这种系统的关键。当前,DSP开发人员采用了重配置、层叠(overlay)等技术来实现通信协议自适应功能,但作为运行时改变或扩展功能的最有效方式,基于DSP的动态链接技术尚未有文献提及。
动态链接技术是相对于静态链接而言,它是指编译器在编译程序时并不将程序所需的库文件代码复制到程序的可执行文件,而只是在程序中保留库文件的调用标记。在程序运行时,由链接器将库文件代码加载到系统内存,并与程序链接为一个整体。在大多数DSP系统中,采用动态链接技术可以节省系统对片上存储器大小的要求,此外,由于动态链接库函数对外提供的是函数的接口,而不是函数的入口地址,因此动态链接函数可同时提供多个版本,使系统的升级变得更为方便。
通过研究和分析TI DSP目标代码的生成过程和目标代码的结构,提出了针对该系列DSP代码动态链接的方法。将本文提出的方法应用到某通信系统中表明,该方法具有占用片上内存小、系统配置时间短、系统有较强的可扩展性等优点,在此后的DSP开发过程中会得到广泛的应用。
1 DSP目标代码生成流程
TI DSP系列开发工具包为开发人员提供了一套完整的软件开发工具链,包括C++/C++编译器,汇编器,链接器等。利用这套开发工具包,DSP开发人员可以完成程序的编写、编译、链接,直到目标代码的生成。其中,C/C++编译器将C语言转换为汇编语言,汇编器汇编语言翻译为机器语言,以COFF目标文件的形式输出给链接器。链接器将汇编器生成的COFF文件与库文件链接成一个完整的程序,以可执行的COFF文件输出到磁盘,生成DSP可执行程序。
2 DSP动态链接器的设计
文中设计的DSP系统软件架构如图1所示。DSP应用程序被划分为一个或多个可加载模块,动态链接器作为DSP软件系统架构中的一个重要的软件模块,其作用主要是在DSP系统改变功能时,按需将汇编器生成的目标文件按需加载到系统中,与系统已有程序结合成为一个整体,并将卸载系统中不需要的模块。
2.1 模块的定义
图1中所示的可加载模块文件主要包括DSP应用程序的机器代码,此外包括模块的名称、大小、版本,模块所包含的函数声明,模块所依赖的函数接口,模块的入口函数信息,模块被引用信息等。这些信息是在汇编器生成DSP应用程序的机器代码后,由模块生成程序将附加的信息添加到COFF文件中,生成最终的可加载模块文件。本文设计的可加载模块的文件格式如图2所示。
2.2 模块的加载和卸载
2.2.1 COFF文件格式
DSP动态链接器设计的关键是解析汇编器生成的目标文件,将目标文件中包含的代码根据模块的加载地址进行重定位后,完成与系统已有程序的链接。汇编器生成的目标文件是以COFF文件格式保存在磁盘上,其通常包括代码段、数据段、用户自定义段、符号表和重定位信息等数据,格式如图3所示。
如图3所示,COFF文件主要包括一个文件头部和多个段信息,以及段重定位信息和符号表等。COFF文件缺省的包含3个段:。 text段、.data段和.bss段。汇编器将汇编程序的代码部分放到.text段中,将全局变量放在.data或.bss段中,同时在符号表中写入该文件包含的符号(函数或变量)名称和对外引用的符号名称等信息。此外,每段的重定位信息表中都包含重定位信息项,根据重定位信息项,可以确定可重定位指令在段中的偏移量,表1给出了重定位信息项的结构。
重定位信息项的0—3字节表示可重定位指令以0作为起始地址,在当前段中的偏移量。4—5字节是符号索引表,它代表了该重定位指令索引的符号在COFF文件中符号表中的索引号。8—9字节表示重定位类型,它指出了如何将定位后的地址信息添加到该可重定位指令上。表2是重定位信息项的一个例子,这里假设该重定位信息项属于.text段。
该重定位信息项说明在.text代码段偏移20个字节处存在一条重定位语句,该语句所指向的符号在符号表中的位置是第20项(从0开始计),该语句的重定位类型是PC跳转指令重定位。
2.2.2 DSP机器代码的识别
汇编器生成的是DSP机器代码,因此动态链接器需要分析重定位指令格式,以便将指令引用地址添加到该指令中。根据TMS320 DSP指令手册,TMS320 DSP指令格式包括如图4所示。
文中通过分析指令格式的低位比特位,可以判断出指令属于上述指令中的哪一类。以指令0x0200007E为例,将指令表示为二进制:(0000 0010 0000 0000 0000 0000 0111 1110)b,指令的2~3位为11,在图4中查找2~3位为11的指令,可以发现该指令是一条STW存储指令,指令的ucst15比特域表示了其需要重定位的地址。
2.2.3 模块动态链接的实现
动态链接器的功能主要包括模块的动态链接和动态卸载,模块动态链接的主要流程如图5所示。动态链接器在收到加载模块请求时,首先检查模块文件的完整性,并根据加载模块的依赖信息在系统符号表中查找对应的函数和变量。当模块通过完整性和依赖性检查后,动态链接器首先根据模块大小声明,在系统的存储空间中分配空间,将模块文件加载到系统存储空间。接着动态链接器根据COFF文件信息,搜索COFF文件代码段中的重定位语句,并根据指令格式确定指令中地址域信息,最后将综合模块被加载的地址和指令索引的符号的地址,计算地址信息,并将此信息填入可重定位指令的地址域,完成指令的重定位。在代码段重定位完成后,动态链接器将模块名称、模块对外提供的函数名称、模块入口地址等信息注册到系统符号表中,并调用模块加载函数,完成模块对系统资源的申请。最后,如果该模块所提供的函数或者变量替换了系统已有的函数或者变量,动态链接器还需要将所有引用该函数或变量的其他模块进行重定位,以反映系统状态的更新。
2.2.4 模块动态卸载的实现
模块动态卸载是加载过程的逆过程,动态链接器在收到卸载模块请求时,首先在系统中搜索是否有模块引用了将要被卸载的模块,若存在则警告用户,并等待用户确实是否强制卸载。若是,动态链接器将卸载模块对外提供的函数和变量从系统符号表中删除,并收回卸载模块占用的系统空间。完整的模块动态卸载流程如图6所示。
3 结论
文中设计的DSP动态链接器为传统的DSP系统带来新的应用功能,已在某多功能通信系统中获得了成功的应用。动态链接技术作为DSP系统的重配置技术之一,其应用要比传统的DSP全系统重构技术或叠加技术更为灵活和高效。同时,本文提出的动态链接技术相对于文献,文献提出的函数查找表的实现方式更加富有效率。尽管目前动态链接技术在DSP领域的应用很少,但随着DSP应用向多功能发展,相信动态链接技术在DSP领域的应用会越来越广泛。
责任编辑:gt
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)