一种单片机下模块的动态加载方法与流程

文档序号:13217883阅读:1593来源:国知局
技术领域本发明涉及单片机领域,特别提供了一种单片机下模块的动态加载方法。

背景技术:
目前,在单片机领域,处于成本或者其他原因的考虑,很多单片机没有MMU单元(内存管理单元),选用的操作系统也不是虚拟地址空间。对于这类单地址空间操作系统而言,无法动态加载模块。在某些对安全性要求较高的场合,如加密,解密部分,若将加/解密算法与系统应用一起编译,通过工具在运行时很容易从内存中破解出加/解密算法。这对于系统的安全危害不言而喻。此外,如果要对系统中的部分函数进行升级,也需要进行整体升级,给网络资源,存储资源,代码变更等带来风险。因此,如何解决上述问题,成为人们亟待解决的问题。

技术实现要素:
鉴于此,本发明的目的在于提供一种单片机下模块的动态加载方法,以至少解决以往单片机存在安全系数低、升级工作量大、存在风险等问题。1、本发明提供的技术方案,具体为,一种单片机下模块的动态加载方法,其特征在于,包括:S1:将单片机的系统程序代码烧写于单片机的内部norflash中;S2:将待加载的模块程序编译成系统可执行文件并存储于单片机的外部spiflash中;S3:根据预先为所述待加载模块程序预留的入口,从所述单片机的外部spiflash中读取所述可执行文件,并写入所述norflash中运行。优选,所述单片机下模块的动态加载方法,还包括:S4:当所述单片机的系统程序代码运行结束后,清除所述单片机norflash中从所述spiflash读入的可执行文件以及由所述可执行文件处理后的数据。进一步优选,所述步骤S2中的可执行文件中包括:函数、全局变量以及所述函数对应的二进制代码;所述函数对应的二进制代码存储于所述可执行文件的代码区;所述函数的地址存储为所述函数在代码区相对于代码区首地址的偏移量。进一步优选,所述步骤S2中将待加载的模块程序编译成系统可执行文件并存储于单片机的外部spiflash中时,将所述可执行文件中各函数地址的LSB位强制置0。进一步优选,步骤S3中将可执行文件写入所述norflash中运行时,将所述可执行文件中各函数地址的LSB位强制置1。本发明提供的单片机下模块的动态加载方法,在单片机的单地址空间下,将单片机的系统程序与待加载的模块程序分别存储,以读取调用的形式调用待加载的模块程序,完成单片机的整体运行。通过该方法,使待加载的模块程序在单片机存储器中的存放时间短,只有在系统程序运行的短暂时间内存在,使他人无法从单片机的内存(内部norflash)中获取有效信息进行破解,提高了单片机系统的安全性;同时,该加载方法还可以用于单片机的碎片化升级,例如,可以将以后系统升级可能涉及到的部分函数接口定义好,假如需要升级,将之前定义好的接口重新实现后,将实现的代码做成BIN文件,写入到单片机的外部spiflash中,这样升级之后,系统虽然调用的还是同样的函数名,但是函数的具体实现已经变了,这就可以完成部分升级,减小升级的代价(如网络资源,存储资源,代码变更带来的风险等)。附图说明图1为待加载的模块程序编译成系统可执行文件的示意图。具体实施方式下面以具体的实施方案对本发明进行进一步解释,但是并不用于限制本发明的保护范围。以往的单片机中将所有的应用程序均与系统程序一起编译,共同存储在单片机的内部norflash中,由于单片机的内部norflash中系统程序代码(包括系统代码和所有程序代码)是按照与源文件对应的方式顺序排列,存在一系列问题。例如:以往的单片机中将加/解密算法与系统程序一起编译,共同存储在单片机的内部norflash中,由于单片机的内部norflash中程序代码(包括系统程序代码和加/解密代码)是按照与源文件对应的方式顺序排列,所以很容易从程序代码中抽取出与加/解密函数相关的二进制代码,导致加/解密算法很容易被破解,造成单片机安全系数低等问题。为了解决上述问题,本实施方案提供了一种单片机下模块的动态加载方法,本实施方案中待加载的模块程序对应的为单片机中用于加/解密的算法程序,发明人研究发现上述用于加/解密算法的程序中不包含switch语句和库函数调用等,满足位置无关性,因此,考虑可以将用于加/解密算法程序代码存储于单片机的外部spiflash中,使用相对地址进行调用,具体的步骤如下:S1:将单片机的系统程序代码烧写于单片机的内部norflash中;S2:将待加载的加/解密的算法编译成系统可执行文件并存储于单片机的外部spiflash中;参见图1,将加/解密算法程序编译成系统可执行文件中包括:用于加/解密的函数、全局变量以及所述用于加/解密的函数对应的二进制代码,将用于加/解密的函数二进制代码存储在可执行文件的代码区(code区),并将用于加/解密的函数地址和全局变量的存放区域记录在可执行文件的文件头,其中,用于加/解密的函数地址存储为函数在代码区相对于代码区首地址的偏移量,优选,将全局变量放在一块,用于加/解密的函数放在一块。其中,将待加载的加/解密的算法编译成系统可执行文件并存储于单片机的外部spiflash中时,将所述可执行文件中各函数地址的LSB位强制置0。S3:根据预先为用于加/解密算法程序预留的入口,从所述单片机的外部spiflash中读取用于加/解密算法的可执行文件,并写入所述norflash中运行,且将可执行文件写入所述norflash中运行时,将所述可执行文件中各函数地址的LSB位强制置1。S4:当所述单片机的系统程序代码运行结束后,清除所述单片机norflash中从所述spiflash读入的可执行文件以及由所述可执行文件处理后的数据。该实施方案中,在单片机的单地址空间下,将单片机的系统程序代码和用于对数据进行加/解密程序代码分别存储,只有在运行系统程序代码时需要使用加/解密程序代码时才进行调用,用于进行接收数据的加/解密,当系统应用程序代码运行结束后,并将调用读入的加/解密程序二进制代码以及加/解密处理后的数据清除,因此,加/解密程序代码只在单片机的内部norflash中短暂的存在,使他人无法从单片机的内部norflash中获取有效信息进行破解,并且单独存放在单片机中的数据都是接收来的数据,经过发送装置进行加密后的数据,这同时也大大增加了他人破解的难度,提高了单片机系统的安全性。下面以一个具体的实施例1对本发明进行进一步的详细解释:实施例1假如现有系统工程SysProject,其中需要用到加解密算法(所在文件为algorithm.c,依次有函数EncodeFun1,Func1,DeCodeFun1,LastFun(在文件末尾,为空,只是为了计算有效函数的长度))。具体的操作流程为:1、另外建立一个工程GenerateProject,用于将加解密算法生成Bin文件;2、将algorithm.c拷贝到GenerateProject中;3、建立GenerateBin.c,用于生成算法Bin;4、在GenerateBin.c中将算法的二进制代码拷贝到外部spiflash中;关于拷贝算法的二进制代码采用如下代码:typedefstruct_EncyptBin{charEncodeFun1[4];//存储加密函数1在Code区的地址,为相对于数组code的偏移量;charFun1,//存储函数1在Code区的地址,为相对于数组code的偏移量;charDecodeFun1[4];//存储解密函数1在Code区的地址,为相对于数组code的偏移量;charGlobalData1[n];//存储相关的全局变量1;charcode[code_len];//存储算法的二进制代码;
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1