一种elf文件添加crc校验的方法

文档序号:6367008阅读:676来源:国知局

专利名称::一种elf文件添加crc校验的方法
技术领域
:本发明涉及嵌入式系统数据通信领域,特别是ー种ELF文件校验方法。
背景技术
:随着嵌入式科技的高速发展,嵌入式产品应用越来越广泛,比如高速鉄路、通讯设备等,嵌入式开发包括硬件和软件开发,为了提高开发速度,在嵌入式软件开发中一般会采用文件系统,将文件和数据保存在文件系统当中,文件系统使用能带来很多的好处,比如使用简单方便、API接ロ丰富、上手和开发速度快,同时文件传递也很方便。但是嵌入式系统有时应用在环境严酷的场合,复杂的周围环境、软件缺陷等可能导致文件内容被破坏或者改写,特殊情况下还有可能造成文件系统的损坏。通常,嵌入式系统启动的时候从文件系统里面读取应用程序来执行,如果文件系统内部的应用文件被损坏,那么可能会造成系统启动或者运行异常,导致系统不稳定;此外,由于嵌入式系统下的传输协议较为简单,缺乏足够的容错机制,在文件更新过程中也有可能发生数据丢失、输出传错等情况,这样传输到文件系统的文件可能已经被改写,这种损坏的文件是不能使用的,带来的后果通常不可预知,在目前的嵌入式系统中,一般没有提供文件完整性校验方法,不能判断文件是否是正确可用的;另外,即使文件已经发生损坏,也不能立刻检测出来,文件的完整性不能得到保障。目前,在一般的嵌入式系统的设计中,使用文件系统来保存文件和数据,保存的文件包括启动程序和应用程序,比如使用vxWorks实时操作系统的嵌入式系统一般把vxfforksimage文件和应用程序(out文件)等放在文件系统内,vxfforksimage和out应用程序均属于ELF文件(ExecutableandLinkableFormat),ELF文件结构见图1,最前面是ELF头(ELFHeader),紧接着是ELF文件的各个段,比如代码段,最后还要一些辅助结构,比如字符串表、符号表等;ELF文件开始的ELF头定义了ELF魔数、文件机器字节长度、数据存储方式、版本、运行平台、ABI版本、ELF重定位类型、硬件平台、入口地址、段表位置和长度等信息,其中关键的一点是记录了段表(SectionTable)的位置和长度,通过段表的位置可以从ELF文件中读出段表内容,然后从中得到代码段、数据段等的位置、长度以及其他属性。操作系统在加载ELF文件的时候会用到段表来定位和访问各个段的属性信息,从段表里面获取代码段、数据段的地址和长度信息并将代码段、数据段从文件中相应位置拷贝到内存的相应区域,从而实现可执行文件的装载和运行。文件的完整性主要体现在加载和更新的时候,加载的时候加载错误文件会导致启动失败或者异常,文件更新的时候也可会出错。目前的方案是,在加载的时候一般是依靠操作系统提供检测方法,检查ELF头是否有效,但并不能检查整个ELF文件;在传输过程中,一般依靠传输协议来保证,比如FTP、xmodem等协议,在嵌入式环境中传输协议只能保证传输过程中的准确性,但是并不能保证写到存储器上的内容是正确的,保存过程也有可能会出错。目前CRC校验一般有两种方式(I)将文件和文件的CRC校验和放在不同的位置,比如使用其他的另外ー个文件来存放需要校验的文件CRC校验和;(2)将CRC校验和等一些信息放置在校验文件头部,即在文件的开始添加一个校验文件头。上述两种方法都有缺点方法1,由于文件和CRC校验和分别存放,需要从其他地方取的CRC校验和,使得校验过程麻烦,而且容易出现校验和丢失后无法校验的情况;方法2会破坏ELF文件结构,因为ELF标准要求在ELF文件的开始是ELF头,如果在文件前面添加一个校验文件头之后就不再是ELF文件(成为ー种新文件),因此这样做会破坏ELF文件结构,导致操作系统不能直接加载该类型文件,如果要加载的话需要另外单独为这种新文件类型编写加载程序,这样会提高系统的复杂度,而且换操作系统平台之后加载程序需要重写,降低通用性。
发明内容本发明所要解决的技术问题是,针对现有技术不足,提供ー种ELF文件添加CRC校验的方法,避免使用错误和损坏的文件,提高嵌入式系统的可靠性,有效保证加载正确文件和文件更新的正确性,保障文件的完整性。为解决上述技术问题,本发明所采用的技术方案是ー种ELF文件添加CRC校验的方法,该方法包括以下步骤1)在ELF文件末尾添加一个校验文件头;2)打开添加了校验文件头的ELF文件;3)将文件指针指向文件的末尾,获取文件的长度;4)从文件的末尾往前跳,跳到校验文件头的开始位置,判断文件长度是否比校验文件头长度还小,若是,跳到9);若否,进入5);5)将校验文件头的内容读到内存,计算整个校验文件头的CRC校验和,判断校验文件头是否有效,若有效,进入6);若无效,跳到8);6)跳到文件开始,判断ELF文件是否读取完毕,若是,跳到8);若否,进入7);7)逐段读取文件,计算该段文件的CRC校验和,返回6);8)采用累加方式计算出文件的CRC校验和,比较文件的CRC校验和与保存在校验文件头内的CRC校验和是否一致,若一致,则文件正确;否则文件校验失败;9)结束。本发明的方法中,校验文件头添加在ELF文件的尾部,不会影响ELF文件的使用,即添加校验文件头之后和不添加校验文件头对于操作系统来说是ー样的,操作系统在加载带有校验文件头的ELF文件的时候不会处理这个校验文件头,加载ELF文件的代码无需改动,可直接使用;计算CRC采用逐步计算的方式,简单可靠,而且不需要申请大量内存,节约内存,这在嵌入式系统中尤其重要;在添加的文件内可以放入大量的有用信息,比如文件版本、特殊标识、时间信息等,进ー步扩展应用范围;本发明避免了使用错误和损坏的文件,提高了嵌入式系统的可靠性,有效地保证了加载正确文件和文件更新的正确性,保障了文件的完整性。图I为ELF文件结构示意图;图2为本发明一实施例ELF文件添加校验文件头的流程图3为本发明一实施例ELF文件CRC校验的流程图。具体实施例方式如图2和图3所示,本发明ー实施例ELF文件CRC校验用在ELF文件加载之前和文件更新之后,在加载之前先校验文件的CRC,校验通过之后才能加载,此外还可以校验文件的版本等信息,防止启动非法文件;在文件更新之后,计算文件的CRC,保证更新过程中没有出现错误,校验过程为1)打开需要校验的添加了校验文件头的ELF文件;2)将文件指针指向文件的末尾,使用ftell函数来获取文件的长度,并判断文件长度是否比校验文件头长度还小,由于校验文件头是放在ELF文件的末尾,显然正确的文件长度是要校验文件头长度要长的;3)从文件的末尾往前跳,跳到校验文件头的开始位置,假设文件大小为a,校验文件头的大小为b(这是个固定值,在设计校验文件头的时候已经确定好),那么从文件末尾往前跳b个字节便是校验文件头的开始位置;4)将校验文件头的内容读到内存,并校验校验文件头先判断第一个字段是不是AddFileHead工具填充的特殊标识,这个特殊标识表明是不是校验文件头的起始位置;然后读出存放自身CRC校验和的字段,将放自身CRC校验和的字段改成0,计算整个校验文件头的CRC,比较计算出来的和原来保存的自身CRC校验和是否一致,一致说明这是ー个正确有效的校验文件头;5)跳到文件的开始,逐段读取文件,采用累加方式逐段计算CRC校验和,计算出文件的CRC校验和;6)比较计算出来的CRC校验和和保存在校验文件头里面的CRC校验和是否一致,一致说明文件正确,否则文件校验失败。步骤4)中的特殊标识可以是数字、字母或者其他标识。AddFileHead工具使用VisualC++6.0开发,功能是在ー个ELF文件的尾部添加一个校验文件头校验文件头的第一个字段是ー个特殊的标识,以表明这是校验文件头的开始,特殊标识符是根据实际使用要求定义,可以是数字或者字母;校验文件头中还含有ELF文件的CRC校验和版本等其他信息;校验文件头还含有自身的CRC校验和,该校验和用来检查校验文件头是否正确,该校验和的计算方法为将存放自身校验和的字段填0,然后计算整个校验文件头的CRC校验和,并将CRC校验和填充到校验文件头里面的存放自身校验和的字段。AddFileHead工具和校验文件头的定义有关,是根据设计的校验文件头来开发的,不同的校验文件头使用不同的AddFiIeHead工具,比如因实际使用需要在校验文件头里面添加了一种新的信息,那么AddFileHead也需要修改,在添加文件头的时候要把这个新的信息添加进去,确保AddFileHead工具添加的文件头和设计的校验文件头一致。在ELF文件末尾添加一个校验文件头,这个校验文件头含有ELF文件的CRC校验和、版本、校验文件头自身的CRC等信息,在加载和更新文件的时候计算ELF文件的CRC,然后比较计算出来的CRC和校验文件头里面的CRC值是否一致,如果一致说明文件完整,如果不一致说明文件不完整。其实施过程为在PC机上,把vxWorksimage、应用文件(.out文件)等ELF文件通过ー个AddFileHead工具软件添加一个校验文件头,这个校验文件头添加在ELF文件的后面,因此不会影响操作系统对这个文件的正常操作(操作系统使用ELF文件的时候只关心ELF文件前面的ELF头);在加载vxWorksimage等ELF文件的时候,先检查文件的CRC是否正确,这样来保证整个ELF文件是完整可用的;在更新文件的时候,把文件写到文件系统之后,再次读出文件计算文件的CRC,这样如果发现不一致还可以采取删除错误文件、重传等补救措施,保证文件系统内部的文件是正确的,而不是残缺的或者破坏了的;在系统运行的时候,还可以调用计算文件CRC的接ロ函数计算文件是否是正确的,可以方便来定位在运行过程中的文件意外改写问题。权利要求1.ー种ELF文件添加CRC校验的方法,其特征在于,该方法包括以下步骤1)在ELF文件末尾添加一个校验文件头;2)打开添加了校验文件头的ELF文件;3)将文件指针指向文件的末尾,获取文件的长度;4)从文件的末尾往前跳,跳到校验文件头的开始位置,判断文件长度是否比校验文件头长度还小,若是,跳到9);若否,进入5);5)将校验文件头的内容读到内存,计算整个校验文件头的CRC校验和,判断校验文件头是否有效,若有效,进入6);若无效,跳到9);6)跳到文件开始,判断ELF文件是否读取完毕,若是,跳到8);若否,进入7);7)逐段读取文件,计算该段文件的CRC校验和,返回6);8)采用累加方式计算出文件的CRC校验和,比较文件的CRC校验和与保存在校验文件头内的CRC校验和是否一致,若一致,则文件正确;否则文件校验失败;9)结束。2.根据权利要求I所述的ELF文件添加CRC校验的方法,其特征在于,所述步骤3)中,采用ftell函数获取文件的长度。3.根据权利要求I所述的ELF文件添加CRC校验的方法,其特征在于,所述步骤5)中,判断校验文件头是否有效的过程为定义ー个校验文件头特殊标识,先判断第一个字段是不是特殊标识,若是,则该特殊标识表明是校验文件头的起始位置;读取出存放自身CRC校验和的字段,将存放自身CRC校验和的字段改成O,计算整个校验文件头的CRC校验和,比较计算出来的CRC校验和与校验文件头原来保存的自身CRC校验和是否一致,一致说明这是一个正确有效的文件头。4.根据权利要求3所述的ELF文件添加CRC校验的方法,其特征在于,所述特殊标识为数字或者字母。5.根据权利要求I所述的ELF文件添加CRC校验的方法,其特征在于,所述添加的校验文件头含有ELF文件的CRC校验和、版本、校验文件头自身的CRC校验和信息。全文摘要本发明公开了一种ELF文件添加CRC校验的方法,在ELF文件末尾添加一个校验文件头,这个校验文件头含有ELF文件的CRC校验和、版本、校验文件头自身的CRC等信息,在ELF文件加载和更新文件的时候计算文件的CRC,然后比较计算出来的CRC和校验文件头里面的CRC值是否一致,如果一致说明文件完整,如果不一致说明文件不完整,本发明的方法避免了使用错误和损坏的文件,提高了嵌入式系统的可靠性,有效地保证了加载正确文件和文件更新的正确性,保障了文件的完整性。文档编号G06F11/10GK102662789SQ20121008378公开日2012年9月12日申请日期2012年3月27日优先权日2012年3月27日发明者刘永阳,宁侨,杨卫峰,肖家博申请人:株洲南车时代电气股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1