实现程序动态加载的方法和生成映射文件的方法及设备的制作方法

文档序号:6469216阅读:144来源:国知局

专利名称::实现程序动态加载的方法和生成映射文件的方法及设备的制作方法
技术领域
:本发明涉及计算机领域,尤其涉及一种在嵌入式系统中实现程序动态加载的方法、一种生成基于嵌入式系统的映像文件的方法以及一种嵌入式设备。
背景技术
:在ARM(AdvancedRISCMachines,—类微处理器的通称)的集成开发环境中,一个程序的只读的代码段和常量被称作RO(Readonly)段;可读写的全局变量和静态变量被称作RW(ReadWrite)段;RW段中要被初始化为零的变量被称为ZI(Zerolnit)段。对于嵌入式系统而言,程序映像都是存储在Flash存储器等一些非易失性器件中的,而在运行时,程序中的RW-险必须重新加载到可读写的存储卡,如RAM(RandomAccessMemory,随才几存储器),或者系统文件中。在嵌入式系统中动态加载程序一般是指在嵌入式系统烧写到Flash后,系统可以通过读入存储卡或者文件系统来加载外部新生成的映像程序文件,即类似于在WINDOWS系统(微软公司开发的窗口图形界面的操作系统)下执行一个可执纟于文件。目前嵌入式领域中可以自身实现程序的动态加载的操作系统有Symbian,WINCE,Palm等,然而现有中的嵌入式操作系统不支持全局/静态变量,如高通的BREW(BinaryRuntimeEnvironmentforWireless,无线二进制运行环境)平台基于的REX(ROUTEEXTENSION,路由扩展)系统,虽然支持BIN(Plainbinary,二进制文件)格式的映像文件动态加载,但是其加载的BIN格式不支持全局/静态变量,即当加载涉及BIN格式用到的全局/静态变量时,程序会出现执行异常,导致加载失败。
发明内容本发明实施例在于提供一种在嵌入式系统中实现程序动态加载的方法,一种生成基于嵌入式系统的映像文件的方法以及一种嵌入式设备,支持全局/静态5变量,解决了当加载涉及映像文件用到的全局/静态变量时程序会出现执行异常,导致加载失败的问题。为了达到上述技术效果,本发明实施例提出了一种在嵌入式系统中实现程序动态加载的方法,包括如下步骤为基于嵌入式系统进行加载的映像文件分配内存,所述映像文件中设有指定所述映像文件进行加载时的入口地址的入口函数;将所述映像文件的内容读入所述分配的内存;所述映像文件的内容读入完成后,执行所述映像文件的指令代码,并根据所述入口函数指定的入口地址进行所述映像文件中的全局/静态变量的重新映射,完成程序的动态加载。相应地,本发明实施例还公开了一种生成基于嵌入式系统的映像文件的方法,包括步骤编译器编译映像文件时设置映像文件的入口函数,所述入口函数指定所述映^象文件进行加载时的入口地址。相应地,本发明实施例还公开了一种嵌入式设备,其包括分配模块,用于为基于嵌入式系统进行加载的映像文件分配内存,所述映像文件中设有指定所述映像文件进行加载时的入口地址的入口函数;读入模块,用于将所述映像文件的内容读入所述分配模块分配的内存;加载模块,执行所述映像文件的指令代码,并根据所述入口函数指定的入口地址进行映i象文件中的全局/静态变量的重新映射,完成程序的动态加载。实施本发明实施例,通过对映像文件中的全局/静态变量进行重新映射,实现了动态加载映像文件支持全局/静态变量,解决了当加载涉及映像文件用到的全局/静态变量时程序会出现执行异常,导致加载失败的问题,更加便于对生成的映像文件的测试,满足了用户的需求。图1是本发明实施例的在嵌入式系统中实现程序动态加载的方法流程图;图2是本发明实施例的在嵌入式系统中实现程序动态加载BIN格式的映像文件的方法流程图3是本发明实施例的动态加载中分配内存的状态图4是本发明实施例的在嵌入式系统中实现程序动态加载ELF格式的映像文件的方法流程图5是本发明实施例的嵌入式设备的结果示意图;图6是本发明实施例的分配模块的结构示意图;图7是本发明实施例的加载模块的结构示意图。具体实施例方式本发明实施例提供了一种在嵌入式系统中实现程序动态加载的方法,一种生成基于嵌入式系统的映像文件的方法以及一种嵌入式设备,支持全局/静态变量,解决了当加载涉及映像文件用到的全局/静态变量时程序会出现执行异常,导致加载失败的问题。下面结合附图详细说明本发明的优选实施例。请参阅图1,图1示出了本发明实施例的在嵌入式系统中实现程序动态加载的方法流程图,包括如下步骤步骤S101:为基于嵌入式系统进行加载的映4象文件分配内存;具体地,所述映像文件中设有指定所述映像文件进行加载时的入口地址的入口函数,为基于嵌入式系统进行加载的映像文件分配预留数据段的内存空间、指令代码段的内存空间以及函数地址表空间步骤S102:将所述映像文件的内容读入所述分配的内存;具体地,将所述映像文件的内容读入分配的指令代码段的内存空间。步骤S103:所述映像文件的内容读入完成后,执行所述映像文件的指令代码,并根据所述入口函数指定的入口地址进行所述映像文件中的全局/静态变量的重新映射,完成程序的动态加载。需要说明的是,在嵌入式系统中对映像文件进行动态加载前,需要由终端用户、厂商等生成进行加载的映像文件,具体地,在使用编译器编译映像文件时设置映像文件的入口函数,所述入口函数指定所述映像文件进行加载时的入口地址,然后由嵌入式设备对生成的映像文件按照上述实施例进行动态加载。通过上述实施例,对映像文件中的全局/静态变量进行重新映射,实现了动态加载映像文件支持全局/静态变量,解决了当加载涉及映像文件用到的全局/静态变量时程序会出现执行异常,导致加载失败的问题,更加便于对生成的映像文件的测试,满足了用户的需求。需要说明的是,本发明实施例中的嵌入式系统为基于ARM体系的嵌入式系统,系统中对映像文件进行动态加载前,需要生成基于ARM体系,并且与地址无关的BIN格式、ELF(ExecutableandLnkingFormat,可执行映4象和连接格式)格式或者基于此两种格式的衍生格式的映像文件,然后对生成的映像文件进行动态加栽。下面分别以BIN格式的映像文件的动态加载以及ELF格式的映像文件的动态加载为例,详细说明本发明实施例的一种在嵌入式系统中实现程序动态加载的方法。1、BIN格式的映^f象文件的动态加载终端用户、厂商等生成基于ARM体系并且与地址无关的BIN格式映像文件,与地址无关指模块内外部函数、全局/静态变量等的寻址与链接阶段由ADS集成开发环境的ARMLINKER选项中指定的ROBASE和RWBASE无关,ROBASE和RWBASE分别用于告知连接器RO段和RW端的连接基地址,具体地,在生成过程中可以利用ADS(ARMDeveloperSuite,ARM开发工具集)编译、链接的一些选项,如ropi、rwpi等,或者利用ELF转换器,设置BIN映像文件的入口地址的入口函数,如ModMain,使生成的BIN映像文件程序中的所有函数在进行动态加载时可以相对于一个特定的入口函数(如上述的ModMain)进行相对地址寻址,即BIN映像文件的起始地址为ModMain的地址,其他非本模块(即模块外部)的函数都可以在ModMain上的函数地址表来进行寻址。下面结合图2示出的本发明实施例的在嵌入式系统中实现程序动态加载BIN格式的映像文件的方法流程图,进一步说明本发明的一种在嵌入式系统中实现程序动态加载的方法,包括如下步骤步骤S201:为进行加载的BIN映像文件分配内存;具体地,为进行加载的所述BIN映像文件分配预留数据段的内存空间、指令代码段的内存空间以及函数地址表空间,如图3示出的本发明实施例的动态加载中分配内存的状态图,为BIN映像文件分配适量的RAM空间的内存,其大小为预留数据段的内存空间、指令代码段的内存空间以及函数地址表空间的总和,其中预留数据段大小可定义成一个比较大的值M,如32K,其起始地址可以为A;函数地址表为一个4Bytes大小的表指针加上4Bytes的间隔区,其起始地址可以为B,自B地址而上皆为BIN映像文件的预留数据段的内存空间;为BIN映像文件的二进制内容分配起始地址为C的读入地址,地址C以下存放8BIN映像文件的内容,在C-8地址处(即B地址处)放置系统函数表指针。步骤S202:将所述BIN映像文件的内容读入所述分配的内存;具体地,将BIN映像文件的内容读入分配的指令代码段的内存空间,即将BIN映像文件的内容从地址C处载入到RAM中。步骤S203:所述BIN映像文件的内容读入完成后,执行所述BIN映像文件的指令代码,并根据所述入口函数指定的入口地址进行所述映像文件中的全局/静态变量的重新映射,完成程序的动态加载。具体地,所述BIN映像文件的内容读入完成后,才艮据所述入口地址以及分配的预留数据段的地址信息,设置将映像文件中的全局/静态变量从所述入口地址映射到所述预留数据段的内存空间的映射程序,系统CPU从地址C处开始执行BIN映像文件中的指令代码,在进入BIN映像文件的入口地址的入口函数ModMain后调用所述映射程序,所述映射程序相当于入口函^t调用的第一个子函数,将映像文件中的全局/静态变量映射到所述预留数据段的内存空间中,让程序可以正常执行,完成程序的动态加载。需要说明的是,上述实施例还包括,系统在执行所述映像文件的指令代码时,可以根据所述入口函数ModMain对BIN映像文件程序中的所有函数进行相对地址寻址,其他非本^莫块(即模块外部)的函数都可以在ModMain上的函数地址表来进行寻址,完成映像文件在加载中关于模块内部/外部函数的动态寻址。需要说明的是,在生成BIN映像文件的过程中,可以在BIN映像文件的头部添加分配信息,所述分配信息为自定义的固定结构的一个头部信息,分配信息包括所述映像文件的指令代码段的起始信息以及大小信息、数据段的起始信息以及大小信息等。在系统对生成的BIN映像文件分配预留数据段的内存空间、指令代码段的内存空间时,具体地,系统可以根据所述分配信息中指令代码段的信息以及数据段的信息分别计算需要分配的预留数据段以及指令代码段的内存空间,然后为BIN映像文件分配计算出的预留数据段以及指令代码段的内存空间,因此系统通过所述分配信息可以得知动态加载时需要耗用的RAM空间,节省了RAM空间。2、ELF格式的映像文件的动态加载终端用户、厂商等生成基于ARM体系并且与地址无关的ELF格式映像文件,具体地,可以〗吏用ADS编译工具,可以通过armcc/armcpp/tcc/tcpp编译生成.o格式OBJ文件,然后使用armlink与系统SDK链接生成.axf格式的ELF文件,在生成过程中可以利用ADS编译、链接的一些选项,如ropi、rwpi等,或者利用ELF转换器,设置ELF映像文件的入口地址的入口函数,如ModMain,使生成的ELF映像文件程序中的所有函数在进行动态加载时可以相对于一个特定的入口函数(如上述的ModMain)进行相对地址寻址,即ELF映像文件的起始地址为ModMain的地址,其他非本模块(即模块外部)的函数都可以在ModMain上的函数地址表来进行寻址。另外,生成的ELF格式的映像文件含有固定的ELF头部,可以根据所述ELF头部的信息计算出ELF映像文件的数据段大小以及指令代码段的大小。下面结合图4示出的本发明实施例的在嵌入式系统中实现程序动态加栽ELF格式的映像文件的方法流程图,进一步说明本发明的一种在嵌入式系统中实现程序动态加载的方法,包括如下步骤步骤S401:为进行加载的ELF映像文件分配内存;具体地,为进行加载的所述ELF映像文件分配预留数据段的内存空间、指令代码段的内存空间以及函数地址表空间,与上述实施例为进行加载的BIN映像文件分配内存的过程类似,系统可以根据ELF映像文件的头部信息计算需要分配的预留数据段的内存空间,由ELF映像文件的大小减去ELF头部的大小可以计算出需要分配的指令代码段的内存空间,然后为ELF映像文件分配计算出的预留数据段以及指令代码段的内存空间。步骤S402:将所述ELF映像文件的内容读入所述分配的内存;具体地,将ELF映像文件中ELF头部以外的内容读入分配的指令代码段的内存空间,即将ELF映i象文件的内容从指定的地址处载入到RAM中。步骤S403:所述ELF映像文件的内容读入完成后,执行所述ELF映像文件的指令代码,并根据所述入口函数指定的入口地址进行所述映像文件中的全局/静态变量的重新映射,完成程序的动态加载。具体地,所述ELF映像文件的内容读入完成后,根据所述入口地址以及分配的预留数据段的地址信息,设置将映像文件中的全局/静态变量从所述入口地址映射到所述预留数据段的内存空间的映射程序,系统CPU从地址C处开始执行ELF映像文件中的指令代码,在进入ELF映像文件的入口地址的入口函数ModMain后调用所述映射程序,所述影射程序相当于入口函数调用的第一个子函数,将映像文件中的全局/静态变量映射到所述预留数据段的内存空间中,让10程序可以正常执行,完成程序的动态加载。需要说明的是,上述实施例还包括,系统在执行所述映像文件的指令代码时,可以根据所述入口函数ModMain对ELF映像文件程序中的所有函数进行相对地址寻址,其他非本模块(即模块外部)的函数都可以在ModMain上的函数地址表来进行寻址,完成映像文件在加载中关于模块内部/夕卜部函数的动态寻址。需要说明的是,除了上述BIN格式和ELF格式的映像文件外,基于此两种格式的衍生格式映像文件也可以通过上述实施例的方法实现程序的动态加载。下面结合图5示出的本发明实施例的嵌入式设备的结果示意图,详细说明本发明的一种嵌入式设备的结构,包括分配模块51,用于为基于嵌入式系统进行加栽的映像文件分配内存,所述映像文件中设有指定所述映像文件进行加载时的入口地址的入口函数;具体地,为基于嵌入式系统进行加载的映像文件分配预留数据段的内存空间、指令代码段的内存空间以及函数地址表空间。读入^f莫块52,用于将所述映像文件的内容读入分配模块51分配的内存;具体地,将所述映像文件的内容读入分配的指令代码段的内存空间。加载模块53,执行所述映像文件的指令代码,并根据所述入口函数指定的入口地址进行映像文件中的全局/静态变量的重新映射,完成程序的动态加载。需要说明的是,在嵌入式系统中对映像文件进行动态加载前,需要由终端用户、厂商等生成进行加载的映像文件,具体地,在使用编译器编译映像文件时设置映像文件的入口函数,所述入口函数指定所述映像文件进行加载时的入口地址,然后由上述实施例中的嵌入式设备对生成的映像文件进行动态加载。下面结合图6示出的本发明实施例的分配模块的结构示意图,进一步说明本发明的一种嵌入式设备的结构,分配模块51包括计算单元511,用于根据所述映射文件的头部信息计算预留数据段以及指令代码段的内存空间,所述头部信息含有所述映像文件的指令代码段的起始信息以及大小信息、数据段的起始信息以及大小信息;分配子单元512,用于为所述映像文件分配所述计算单元计算出的预留数据段以及指令代码段的内存空间。具体地,以BIN格式的映像文件的动态加载为例,在生成BIN映像文件的过程中,可以在BIN映像文件的头部添加分配信息,所述分配信息为自定义的固定结构的一个头部信息,分配信息包括所述映像文件的指令代码段的起始信息以及大小信息、数据段的起始信息以及大小信息等,计算单元511可以根据所述分配信息中指令代码段的信息以及数据段的信息分别计算需要分配的预留数据段以及指令代码段的内存空间,然后分配子单元512为BIN映像文件分配计算出的预留数据段以及指令代码段的内存空间;以ELF格式的映像文件的动态加载为例,生成的ELF格式的映像文件含有固定的ELF头部,计算单元511可以根据ELF映像文件的头部信息计算需要分配的预留数据段的内存空间,由ELF映像文件的大小减去ELF头部的大小可以计算出需要分配的指令代码段的内存空间,然后分配子单元512为ELF映^f象文件分配计算出的预留数据段以及指令代码段的内存空间。因此系统通过BIN映像文件中的分配信息或者ELF映像文件中的头部信息可以得知动态加载时需要耗用的RAM空间,节省了RAM空间。下面结合图7示出的本发明实施例的加载模块的结构示意图,进一步说明本发明的一种嵌入式设备的结构,加载模块53包括执行单元531,用于执行读入模块52读入的映像文件的指令代码;设置单元532,用于根据所述入口地址以及分配模块51分配的预留数据段的地址信息,设置将映像文件中的全局/静态变量从所述入口地址映射到所述预留数据段的内存空间的映射程序;调用单元533,用于调用设置单元532"^殳置的映射程序,完成将映像文件中的全局/静态变量映射到所述预留数据段的内存空间中。寻址单元534,用于当执行单元531执行映像文件的指令代码时,根据所述入口函数指定的入口地址进行函数的相对地址寻址。具体地,所述映像文件的内容读入完成后,设置单元532根据所述入口地址以及分配的预留数据段的地址信息,设置将映像文件中的全局/静态变量从所述入口地址映射到所述预留数据段的内存空间的映射程序,执^f亍单元531开始执行BIN映像文件中的指令代码,在进入映像文件的入口地址的入口函数(如ModMain)后调用单元533调用所述映射程序,所述映射程序相当于入口函数调用的第一个子函数,将映像文件中的全局/静态变量映射到所述预留数据段的内存空间中,让程序可以正常执行,完成程序的动态加载。另外,执行单元531在执行所述映像文件的指令代码时,寻址单元534可以4艮据所迷入口函数ModMain对映像文件程序中的所有函数进行相对地址寻址,其4也非本模块(即才莫块外部)的函数都可以在ModMain上的函数地址表来进行寻址,完成映4象文件在加载中关于模块内部/外部函数的动态寻址。综上所述,实施本发明实施例,通过在分配内存空间之前计算需要分配的合适内存空间,节省了RAM空间,通过生成基于ARM体系并且与地址无关的映像文件,在加载该映像文件时,对映像文件中的全局/静态变量进行重新映射,实现了动态加载映像文件支持全局/静态变量,解决了当加载涉及映像文件用到的全局/静态变量时程序会出现执行异常,导致加栽失败的问题,更加便于对生成的映像文件的测试,满足了用户的需求。需要说明的是,通过以上的实施方式的描述,本领域的才支术人员可以清楚地了解到本发明可借助软件加必需的硬件平台的方式来实现,当然也可以全部通过硬件来实施。基于这样的理解,本发明的技术方案对背景^f支术做出贡献的全部或者部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。以上所揭露的仅为本发明实施例中的一种较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。权利要求1、一种在嵌入式系统中实现程序动态加载的方法,其特征在于,包括如下步骤为基于嵌入式系统进行加载的映像文件分配内存,所述映像文件中设有指定所述映像文件进行加载时的入口地址的入口函数;将所述映像文件的内容读入所述分配的内存;所述映像文件的内容读入完成后,执行所述映像文件的指令代码,并根据所述入口函数指定的入口地址进行所述映像文件中的全局/静态变量的重新映射,完成程序的动态加载。2、如权利要求l所述的方法,其特征在于,所述为基于嵌入式系统进行加载的映像文件分配内存的步骤包括为所述映像文件分配预留数据段的内存空间、指令代码段的内存空间以及函数地址表空间。3、如权利要求2所述的方法,其特征在于,当所述映像文件为二进制文件BIN格式的映像文件时,所述映像文件的头部含有分配信息,所述分配信息包括所述映像文件的指令代码段的起始信息以及大小信息、数据段的起始信息以及大小信息,所述为所述映像文件分配预留数据段的内存空间、指令代码段的内存空间的步骤包括根据所述分配信息计算预留数据段以及指令代码段的内存空间;为所述映像文件分配计算出的预留数据段以及指令代码段的内存空间。4、如权利要求2所述的方法,其特征在于,当所述映像文件为可执行映像和连接ELF格式的映像文件时,所述为所述映像文件分配预留数据段的内存空间、指令代码段的内存空间的步骤包括根据ELF格式的映像文件中的头部信息计算预留数据段以及指令代码段的内存空间;为所述映像文件分配计算出的预留数据段以及指令代码段的内存空间。5、如权利要求2所迷的方法,其特征在于,所述根据所述入口函数指定的入口地址进行映像文件中的全局/静态变量的重新映射的步骤包括根据所述入口地址以及分配的预留数据段的地址信息,设置将映像文件中的全局/静态变量从所述入口地址映射到所述预留数据段的内存空间的映射程序;调用所述映射程序,完成将映像文件中的全局/静态变量映射到所述预留数据段的内存空间中。6、如权利要求l所述的方法,其特征在于,所述方法还包括执行所述映像文件的指令代码时,根据所述入口函数指定的入口地址进行函数的相对地址寻址。7、一种生成基于嵌入式系统的映像文件的方法,其特征在于,编译器编译映像文件时设置映像文件的入口函数,所述入口函数指定所述映像文件进行加载时的入口地址。8、如权利要求7所述的方法,其特征在于,当所述映像文件为BIN格式的映像文件时,所述方法还包括编译器编译映像文件后,在所述映像文件的头部添加分配信息,所述分配信息包括所述映像文件的指令代码段的起始信息以及大小信息、数据段的起始信息以及大小信息。9、一种嵌入式设备,其特征在于,包括分配模块,用于为基于嵌入式系统进行加载的映像文件分配内存,所述映像文件中设有指定所述映像文件进行加载时的入口地址的入口函数;读入模块,用于将所述映像文件的内容读入所述分配模块分配的内存;加载模块,执行所述映像文件的指令代码,并根据所述入口函数指定的入口地址进行映像文件中的全局/静态变量的重新映射,完成程序的动态加载。10、如权利要求9所述的嵌入式设备,其特征在于,所述分配模块包括计算单元,用于根据所述映射文件的头部信息计算预留数据段以及指令代码段的内存空间,所述头部信息含有所述映像文件的指令代码段的起始信息以及大小信息、数据段的起始信息以及大小信息;分配子单元,用于为所述映像文件分配所述计算单元计算出的预留数据段以及指令代码段的内存空间。11、如权利要求10所述的嵌入式设备,其特征在于,所述加载模块包括执行单元,用于执行所述读入模块读入的映像文件的指令代码;设置单元,用于根据所述入口地址以及所述分配才莫块分配的预留数据段的地址信息,设置将映像文件中的全局/静态变量从所述入口地址映射到所述预留数据段的内存空间的映射程序;调用单元,用于调用所述设置单元设置的映射程序,完成将映像文件中的全局/静态变量映射到所述预留数据段的内存空间中。12、如权利要求11所述的嵌入式设备,其特征在于,所述加载模块还包括寻址单元,用于当所述执行单元执行映像文件的指令代码时,根据所述入口函数指定的入口地址进行函数的相对地址寻址。全文摘要本发明公开了一种在嵌入式系统中实现程序动态加载的方法,包括如下步骤为基于嵌入式系统进行加载的映像文件分配内存;将映像文件的内容读入所述分配的内存;所述映像文件的内容读入完成后,执行映像文件的指令代码,并根据入口函数指定的入口地址进行映像文件中的全局/静态变量的重新映射,完成程序的动态加载。相应地,本发明还公开了一种生成基于嵌入式系统的映像文件的方法以及一种嵌入式设备,通过实施本发明实施例,对映像文件中的全局/静态变量进行重新映射,实现了动态加载映像文件支持全局/静态变量,解决了当加载涉及映像文件用到的全局/静态变量时程序会出现执行异常,导致加载失败的问题,更加便于对生成的映像文件的测试。文档编号G06F9/445GK101661397SQ20081019818公开日2010年3月3日申请日期2008年8月29日优先权日2008年8月29日发明者燕青洲申请人:宇龙计算机通信科技(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1