首页> 中国专利> 基于Nand闪存的动态分区搜索装置及其方法

基于Nand闪存的动态分区搜索装置及其方法

摘要

本发明公开一种基于Nand闪存的动态分区搜索装置及其方法,包括:版本升级模块,将预存储在动态分区的各分区的二进制执行部件按序组装合并成一个文件加入版本头信息;可烧录版本模块,将Nand闪存中实际存储的N个分区的顺序依次进行烧录版本组装;烧录模块:需要烧录版本文件到Nand闪存时,将带ECC算法的可烧录版本烧录到Nand闪存中;动态分区解析模块:用于在引导程序启动时搜索版本头,根据版本头记录的信息和Nand闪存依次搜索到的块状态构造出动态分区表,内核通过引导程序传递环境变量的方式或通过将动态分区表共享到同一段未使用的内存的方式获取来构造内核分区表。采用本发明,能够在解决坏块的同时减少冗余块,提高存储介质的利用率。

著录项

  • 公开/公告号CN103744694A

    专利类型发明专利

  • 公开/公告日2014-04-23

    原文格式PDF

  • 申请/专利号CN201310720438.2

  • 发明设计人 曹木莲;

    申请日2013-12-24

  • 分类号G06F9/445(20060101);G06F12/02(20060101);G06F11/10(20060101);

  • 代理机构11228 北京汇泽知识产权代理有限公司;

  • 代理人刘淑敏

  • 地址 430074 湖北省武汉市洪山区邮科院路88号

  • 入库时间 2024-02-19 23:15:09

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-08-11

    授权

    授权

  • 2014-05-21

    实质审查的生效 IPC(主分类):G06F9/445 申请日:20131224

    实质审查的生效

  • 2014-04-23

    公开

    公开

说明书

技术领域

 本发明涉及数据存储技术,尤其涉及一种基于Nand闪存(Flash)的动态分区搜索装置及其方法,属于将Nand Flash作为存储介质的Unix/Linux终端产品使用烧录器烧录二进制版本文件时,在出现坏块(Bad Block)的情况下系统无法正常运行的防护机制。

背景技术

随着用户对终端产品所具备的功能需求越来越多,其对应的软件版本也成递增的趋势。作为大多数基于Linux操作系统的终端设备 ,传统的存储方式都是以Nor Flash作为存储介质。但由于Nor Flash容量较小,或者成本太高等原因已经慢慢变得不适用起来。与此相反,以Nand Flash作为存贮介质由于容量大、读写速度快、成本低等优势开始成为家庭网关,机顶盒,监控前端产品等终端设备的首选存贮介质。

在大规模产品批量出厂的过程中,为了提高效率,一般使用专门的烧录器将需要烧录的数据写入Nand Flash中,因此需要为烧录器提供专门的烧录文件,烧录文件的好块直接影响着产品量产的效率和良率。

现有技术中,一般有两种方法生成烧录文件。一种简单的方法是先通过常规的方式,借助网络,串口或USB等方式完成一台产品的升级,再从升级好的产品中将Nand Flash中的所有数据读出来,生成烧录版本文件。另一种方法是将编译生成的各二进制文件按照他们在Nand Flash上实际存储的分区位置进行组装合并,未达到实际分区大小的进行0xFF填充,最后生成烧录版本文件。

Nand Flash 的特性决定了在出厂时或者在使用过程中都有可能产生坏块。如果烧录器在烧录之前Nand Flash已产生了坏块,或者在烧录过程中产生了坏块,烧录器将二进制烧录版本文件全部烧录到Flash上后,Nand Flash上实际存储的分区内容将和原始规划的分区内容将产生相应的偏移,如图1所示。而Linux终端设备的系统启动和文件系统的挂载都是按照分区的方式进行的,那么内核或文件系统可能就面临无法正常启动的问题。

目前,很多厂家为了避免由于坏块原因导致系统无法启动问题,比较普遍使用的一种方法是将uboot引导程序通过烧录器或其他方法先烧录到Nand Flash中,然后通过uboot引导程序以软件的方式下载烧录其他的部分,如内核,文件系统等。这种方法虽然能够避免由于坏块的原因导致系统起不来的问题,但生产效率低下。

发明内容

有鉴于此,本发明的主要目的在于提供一种基于Nand Flash的动态分区搜索装置及其方法,用以解决现有技术不能实现简单、高效的烧录Nand Flash版本文件,烧录的版本文件可启动概率低的问题。以及用于解决为规避由于Nand Flash存储介质存在坏块的特性必须为每个分区预留一定数量的多余的冗余块而引起的存储空间浪费的问题。

为达到上述目的,本发明的技术方案是这样实现的:

一种基于Nand闪存的动态分区搜索装置,该装置包括版本升级模块、可烧录版本模块、烧录模块以及动态分区解析模块;其中:

版本升级模块,用于将预存储在动态分区的各分区的二进制执行部件按序组装合并成一个文件,并加入版本头信息部件;

可烧录版本模块,用于将Nand闪存中实际存储的N个分区的顺序依次进行烧录版本组装;由N-M个静态分区预存储的二进制执行部件和版本升级模块进行组装合并;

烧录模块:用于当需要烧录版本文件到Nand闪存中时,将所述带ECC算法的可烧录版本提供给烧录器,由所述烧录器将所述可烧录版本文件烧录到Nand闪存中;

动态分区解析模块:用于在引导程序启动时搜索版本头,根据版本头记录的信息和Nand闪存依次搜索到的块状态构造出动态分区表,内核通过引导程序传递环境变量的方式或者通过将动态分区表共享到同一段未使用的内存的方式获取来构造内核分区表。

其中,所述的版本升级模块,用于按照块对齐的方式记录各动态分区存储文件的实际大小。

还用于在Nand闪存中的引导程序能正常启动的情况下,将该版本升级文件用于通过软件的方式进行版本的在线升级更新。

在所述可烧录版本模块中,如果N-M个静态分区预存储的二进制执行部件未达到该分区大小,则所述未达到的部分需要按0xFF进行填充。

在所述可烧录版本模块中,各部件组装合并完毕,再根据具体的硬件电路加入相应ECC算法进行填充。

一种基于Nand闪存的动态分区搜索方法,该方法包括:

A、获取原始分区信息,所述原始分区信息包括N个分区及每个所述分区的空间大小,其中N为正整数;

B、将需要运用动态构造分区搜索方法的分区数M合并成一个大的静态分区C;其中M为正整数,且1<M<N;

C、根据分区C的起始地址和分区大小,通过从分区C的起始地址开始搜索特定的软件版本头信息,并根据版本头信息和块状态确定各分区起始地址和动态分区大小;通过版本头中记录的各分区存储的实际二进制文件大小信息和检测C分区的块状态,生成M个分区的动态分区表;

D、将所述的动态分区表通过环境变量的方式或将动态分区表共享同一段未使用的内存的方式传递给内核构造内核分区表信息。

其中:步骤C所述根据版本头信息和块状态确定各分区起始地址和动态分区大小的过程,具体包括:

C1、从所述的C分区的起始地址开始搜索特定的软件版本头信息,当检测到当前的块状态为坏块,则将坏块加1;当检测到当前的块状态为好,则读取该块特定软件版本头结构大小的数据内容判断是否为版本头;如果该块存储的不是版本头,则继续依次检测下一块的状态;如果是版本头,则根据版本头的信息获取各分区实际存储的二进制文件大小的相关信息;

C2、当搜到的是存储版本头信息的块时,继续检测下一块的状态,如果是坏块,则将坏块加1;当检测到的块状态为好,则此块存储的就是M分区里面的第1个动态分区的起始地址;根据版本头信息记录的该分区的大小和依次搜索到的块状态即可确定第1个动态分区的终止地址。

该方法进一步包括:在改变内核原有构造内核分区表的方式时,引导程序将动态分区表通过环境变量的方式或将动态分区表共享同一段未使用的内存的方式传递给内核构造内核分区表信息。

所述依据所述版本头信息,按第i个动态分区的起始地址和版本头信息记录的第i个动态分区实际存储文件大小的块数能够确定第i+1个动态分区的起始地址,其中1<=i<=M;具体为:第i+1个动态分区的起始地址=第i个动态分区的起始地址+(第i个动态分区坏块数+第i个动态分区存储的实际文件内容所占的块数)*块大小。

所述执行动态分区搜索之前,还包括:

生成带特定版本头信息的升级版本文件;所述升级版本文件由版本头结构体和需要构造M个动态分区的所对应存储的二进制执行文件组成;依次读取编译生成的预存储在第i(1<=i<=M)个动态分区二进制文件,并按照实际的分区顺序进行组装合并,并将各分区实际存储的文件大小记录到版本头对应的结构体中,各部件按照块的方式进行对齐。

在所述执行动态分区搜索之前,还包括:将动态分区构造搜索算法放在引导程序中执行,并在引导程序引导内核之前执行;并且在所述Nand 闪存的第一个分区的第一个块写入引导程序。

本发明所提供的基于Nand 闪存(Flash)的动态分区搜索装置及其方法,具有以下优点:

本发明的装置,采用通过软件的方式将要单独在线升级烧录到各分区的二进制文件进行创造性的组装合并成可以直接使用Nand Flash烧录器直接烧写的烧录版本文件;在引导程序引导内核代码之前加入动态分区搜索算法,可在每次系统时实时构造动态分区表;每个动态分区的大小为实际存储的二进制文件大小,不需要预留冗余的块,节省了Nand Flash的存储空间,提高了存储的利用率。而且不需要使用传统的比较繁琐的流程就可以实现Nand Flash版本文件的烧录,实现简单,且适用于产品的批量生产应用。加快了产品的出货速度,提高了产线的生产效率,降低了生产的人力成本。由于使用了实时的动态分区构造算法,烧录的版本文件可启动概率为100%,不会出现系统无法正常启动的问题。

附图说明

图1为使用现有技术通过烧录器烧录版本文件的结构示意图;

图2为本发明实施例基于Nand Flash的动态分区装置的结构示意图;

图3为本发明实施例基于Nand Flash的动态分区搜索算法的实现流程图;

图4为本发明实施例基于Nand Flash的动态分区装置的烧录版本结构以及在Nand Flash上的存储结构示意图。

【主要部件符号说明】

401:uboot区

402:用户配置区

403:firware区

404:版本头

405:内核

406:文件系统

407:firware文件系统

408:burnrom版本

409:NAND Flash物理区域。

具体实施方式

下面结合附图及本发明的实施例对本发明的动态分区搜索装置及其方法作进一步详细的说明。

现有技术中无法根据实际各分区存储的文件大小来进行构造动态分区,每个分区都会预留一定的冗余块作为坏块损耗用。在大部分情况下这些冗余块基本都在空闲状态,浪费了大量的存储资源。而且现有技术中使用烧录器烧录的版本文件经常由于Nand Flash存在坏块的情况导致系统可启动的概率很低。

本发明提供的基于Nand Flash的动态分区搜索方法,能够根据存储在Nand Flash芯片文件中的实际大小来构造动态分区,每个构造的动态分区大小为实际的存储二进制文件大小。而且不需要将动态分区信息存储到相关的存储介质上,直接通过引导程序的环境变量的方式或共享内存的方式传递给内核来构造内核的动态分区信息。

图4为本发明实施例基于Nand Flash的动态分区装置的烧录版本结构以及在Nand Flash上的存储结构示意图。本发明以单版本的结构为例对所述的搜索方法进行说明。

如图4所示,为一个单版本Linux系统在Nand Flash上的物理存储结构。该系统的Nand Flash物理区域409本来由uboot区401、用户配置区402、内核405和文件系统406组成。

现将原始的内核405和文件系统406的分区合并成一个静态分区fireware区403。其目的之一是为了不用从存储介质的第一块开始搜索版本头信息,能够节省分区搜索的时间。目的二是为了便于firmware版本文件407的在线软件升级。

修改uboot引导代码,可以将内核区和文件系统区合并成一个大的静态分区,并增加基于合并的静态分区构造动态分区的搜索算法。

图3为本发明实施例基于Nand Flash的动态分区搜索算法的实现流程图。如图3所示,该步骤包括:

步骤301:初始化变量。内核起始之前的坏块数bad_block=0,内核起始到内核终止之间的坏块数kbad_block=0,内核终止到文件系统起始之间的坏块数fbad_block=0 ;好块:block=0;

步骤302:从静态分区fireware区403的第0块开始搜索。静态分区的大小是由内核405,文件系统406和冗余块决定的。冗余块的大小需要根据芯片厂家的建议百分比值来设置。

步骤303:判断是否为坏块。如果是坏块,bad_block++,搜索下一块并重新回到步骤303。

步骤304:判断是否是版本头,如果不是,block++,回到步骤303。

步骤305:根据版本头信息获取内核和文件系统的大小。

步骤306:搜索下一块,判断是否为坏块,如果是坏块,bad_block++,搜索下一块并重新回到步骤306。

步骤307:找到kernel的起始地址,继续搜索下一块。

步骤308:判断是否为坏块,如果是坏块,kbad_block++;搜索下一块并回到步骤308。

步骤309:判断所搜索的块是否在内核区,如果--kernel_blocks!=1说明所在块还是属于内核区,继续搜索下一块,回到步骤308。

步骤310:得到内核区的终止块地址。从而就可以计算出动态内核分区的起止区间。

步骤311:搜索下一块,判断是否为坏块,如果是坏块,fbad_block++;跳转到步骤311。

步骤312:得到文件系统的起始地址。可以将静态分区剩余的块全部作为文件系统区。该方法的好处是可以减少分区数量。不用将剩余的块作为一个独立的分区进行设置。同时提高了搜索速度,得到文件系统的起始地址后就不用搜索了。此外还可以提高Flash的利用率。

步骤313:将Linux内核静态的分区方式修改为动态的分区方式,即采用uboot中动态搜索方法计算出的新的分区表通过环境变量的方式或通过将动态分区表共享到同一段未使用的内存中进行获取。此时内核启动的分区信息就是最新的使用动态分区搜索算法的实时分区信息。

为了实现步骤301~步骤313所述的动态分区搜索方法,合并后的静态分区必须存储如图4所示的firmware版本文件407。该升级版本文件是由版本头404,Linux内核405、根文件系统40以块大小对齐的方式进行组装合并而成。版本头404用于识别firmware版本文件407和记录Linux内核405、根文件系统406等二进制文件大小等信息的数据结构。

对于需要构造N个动态分区的实施例时,N>=2,前N-1个分区的搜索过程按步骤302~步骤312的顺序进行。第i+1个分区的起始地址=第i个分区的起始地址+(第i个分区坏块数+第i个分区存储的实际文件内容所占的块数)*块大小。其中,动态分区之前的静态分区个数<i<N+动态分区之前的静态分区个数。当搜索到最后一个动态分区的起始地址时,就可以把剩下的存储空间作为该动态分区的大小。

图2为本发明实施例基于Nand Flash的动态分区的装置结构示意图。如图2所示,该基于Nand Flash的动态分区的装置,主要包括:版本升级模块201,可烧录版本模块202,烧录模块203及动态分区解析模块204。其中:

版本升级模块201:用于将预存储在动态各分区的二进制执行部件按序组装合并成一个文件,并加入版本头信息部件;还用于记录各动态分区存储文件的实际大小。并且各部件按照块对齐的方式进行。不需要进行校验和纠错(ECC)算法进行填充。所述模块的一个作用是可以方便可烧录版本的制作,另一个作用是可用来作为软件的在线升级版本文件。

可烧录版本模块202:用于将Nand存储介质上实际存储的N个分区的顺序依次进行烧录版本组装。如图4所示,burnrom版本408是由uboot二进制文件、用户配置文件、fireware版本407组装合并而成。其中,fireware版本407文件是由版本头、内核和文件系统组装合并而成。如果uboot二进制文件的大小未达到uboot区401的大小时,需要进行0xFF进行填充,用户配置需要使用0xFF填充用户配置区402的区域大小。fireware版本407组装版本头404,内核405和文件系统406时需要进行块对齐,大小未达到的部分使用0xFF进行填充。

这里,根据不同的硬件设计方案,Nand Flash所采用的ECC纠错编码方式可能有所不同,确定自己所采用的ECC编码方式后,根据芯片厂家提供的ECC算法,对上面组装成的烧录版本文件burnrom版本408加入ECC算法进行相应的填充处理。

烧录模块203:用于当需要烧录版本文件到Nand Flash芯片中时,将所述带ECC算法的可烧录版本burnrom版本408提供给烧录器,由所述烧录器将所述可烧录版本文件烧录到Nand闪存芯片中。

动态分区解析模块204:用于在引导程序启动时搜索版本头,根据版本头信息和Nand闪存的块状态构造出动态分区表,并向动态分区表通过环境变量的方式或将动态分区表共享同一段未使用的内存的方式传递给内核构造内核分区表。

对于双版本、备份版本等存储结构的应用场合,本发明的上述搜索方法和装置也同样适用。

本发明实施例提供的上述基于Nand闪存的动态分区搜索装置及其方法,适用于各种支持Nand闪存的烧录器。应用该搜索方法可以减少Nand存储介质预留的冗余块,提高Nand存储介质的存储空间利用率。同时,运用上述方法和装置,能够改变生产线原有的生产方式,通过使用烧录器直接烧录可烧录版本文件,能够简化操作人员对烧录器软件的复杂操作,通过简单配置即可完成烧录过程。此外,还可以解决对于Nand Flash存在坏块的情况下,在使用现有技术的烧录方式可能导致系统无法正常运行的问题。

以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号