一种闪存管理方法和装置
技术领域
本发明实施例涉及存储器技术领域,特别是涉及一种闪存管理方法和装置。
背景技术
使用串行外设接口(Serial Peripheral Interface;SPI)闪存(Flash)作为数据存储介质,目前比较常用的数据处理方法包括两种。一是使用裸接口直接操作SPI Flash,用户自行对SPI Flash上的存储区域进行划分,由用户组织并使用整块SPI Flash上的所有存储区域;二是在存储系统中实现文件管理系统,常用的是闪存设备日志型文件系统(Journalling Flash File System;jffs)和第二版闪存设备日志型文件系统(Journalling Flash File System Version2;jffs2),数据的具体存放位置以及数据的处理操作由文件系统自行管理。
当采用第一种组织方法时,不同作用的数据只能存放在SPI Flash的不同块(block)里,每个block中包含多个子块。通常,数据可能存放在几个连续的block中,如果需要对数据进行修改,只能对欲修改的数据所占用的全部block进行擦除后,再全部重新写入。无论欲修改的数据所占用的子块的数据在修改前后是否相同,都要进行擦除和写入的操作,容易造成对同一个子块反复进行擦除和写入操作,其他子块擦除和写入的操作次数较少,整片SPI Flash中的全部子块的使用概率不平衡,降低了整片SPI Flash的寿命。
发明内容
本发明实施例公开一种闪存管理方法和装置,以解决SPI Flash寿命低的问题。
为了解决上述问题,本发明实施例公开了一种闪存管理方法,包括:
对目标数据进行分段得到各目标数据段;
计算各上述目标数据段的数据校验值;
针对各上述目标数据段中的每一段上述目标数据段,当上述目标数据段的上述数据校验值与上述目标数据段的对应子块的数据校验值不同时,确定上述对应子块的可用子块,并将上述目标数据段的数据写入上述可用子块;上述子块为上述闪存中的存储单元,多个上述子块组成一个块;
当上述目标数据段的上述数据校验值与上述目标数据段的对应子块的数据校验值相同时,保持上述对应子块的数据不变。
优选的,上述对目标数据进行分段得到各目标数据段,包括:
按照上述目标数据段的对应子块的长度将上述目标数据划分为各目标数据段。
优选的,上述对目标数据进行分段得到各目标数据段之前,上述方法还包括:
存储各块和各子块的管理信息至管理结构体中;
其中,各上述子块的管理信息包括子块的状态和子块的数据信息;上述子块的数据信息包括数据校验值、数据版本号和数据位置号;各上述块的管理信息包括块的状态和不同状态的子块的数量。
优选的,上述确定上述对应子块的可用子块,包括:
获取上述对应子块之后的各子块的状态,上述子块的状态包括可写入状态、可擦除状态和使用中状态;
选择可写入状态的子块作为可用子块;其中,上述对应子块的状态为使用中状态,且上述对应子块的数据版本号为最新版本;
上述将上述目标数据段的数据写入上述可用子块之后,上述方法还包括:
修改上述对应子块的状态为可擦除状态,并修改上述可用子块的状态为使用中状态。
优选的,上述方法还包括:
设置多个中转块;上述中转块的状态为可写入状态;
对于使用中状态的块,当其中使用中状态的子块的数量占上述使用中状态的块的所有子块的数量比值小于等于搬移阈值时,将上述使用中状态的子块的数据搬移到上述中转块中,并将上述使用中状态的块的状态变更为可擦除状态。
本发明实施例还公开了一种闪存管理装置,包括:
分段模块,用于对目标数据进行分段得到各目标数据段;
校验值计算模块,用于计算各上述目标数据段的数据校验值;
子块处理模块,用于针对各上述目标数据段中的每一段上述目标数据段,当上述目标数据段的上述数据校验值与上述目标数据段的对应子块的数据校验值不同时,确定上述对应子块的可用子块,并将上述目标数据段的数据写入上述可用子块;上述子块为上述闪存中的存储单元,多个上述子块组成一个块;
子块保持模块,用于针对各上述目标数据段中的每一段上述目标数据段,当上述目标数据段的上述数据校验值与上述目标数据段的对应子块的数据校验值相同时,保持上述对应子块的数据不变。
优选的,上述分段模块按照上述目标数据段的对应子块的长度将上述目标数据划分为各目标数据段。
优选的,上述装置还包括:
管理信息存储模块,用于在上述分段模块对目标数据进行分段得到各目标数据段之前,存储各块和各子块的管理信息至管理结构体中;
其中,各上述子块的管理信息包括子块的状态和子块的数据信息;上述子块的数据信息包括数据校验值、数据版本号和数据位置号;各上述块的管理信息包括块的状态和不同状态的子块的数量。
优选的,上述子块处理模块,包括:
状态获取子模块,用于获取上述对应子块之后的各子块的状态,上述子块的状态包括可写入状态、可擦除状态和使用中状态;
子块选择子模块,用于选择可写入状态的子块作为可用子块;其中,上述对应子块的状态为使用中状态,且上述对应子块的数据版本号为最新版本;
上述装置还包括:
状态修改模块,用于在上述子块处理模块将上述目标数据段的数据写入上述可用子块之后,修改上述对应子块的状态为可擦除状态,并修改上述可用子块的状态为使用中状态。
优选的,上述装置还包括:
中转块设置模块,用于设置多个中转块;上述中转块的状态为可写入状态;
搬移模块,用于对于使用中状态的块,当其中使用中状态的子块的数量占上述使用中状态的块的所有子块的数量比值小于等于搬移阈值时,将上述使用中状态的子块的数据搬移到上述中转块中,并将上述使用中状态的块的状态变更为可擦除状态。
与背景技术相比,本发明实施例包括以下优点:
SPI Flash中的数据按照块(块还具体分为各个子块)的形式进行存储,块的状态由其中各子块的状态决定,当块中所有子块为可写入状态时,该块为可写入状态;当块中所有子块为可擦除状态时,该块为可擦除状态;当块中至少存在一个使用中状态的子块时,该块为使用中状态。对于可写入状态的块和子块,其中未包含任何数据,可直接写入数据;对于可擦除状态的块和子块,其中包含过期数据,需要先擦除后再写入数据,而且擦除操作针对块进行,不可以只对子块进行擦除操作;对于使用中状态的子块,其中包含使用中的数据,当该子块的数据为过期数据时,该子块的状态变更为可擦除状态。
在对SPI Flash中的子块进行管理时,先将目标数据与当前数据进行比较,具体是将分割为各目标数据段之后的目标数据与SPI Flash中对应子块中的当前数据进行比较。如果两种数据的校验值不同,则表示目标数据段中的数据与SPI Flash中对应子块的当前数据不同,需要将对应子块中的当前数据进行处理,并且在对应子块的可用子块中写入匹配的目标数据;如果两种数据的校验值相同,则表示目标数据段与SPI Flash中对应子块的数据相同,不需要处理对应子块中的当前数据。本发明实施例只在目标数据与当前数据不同的情况下,对相关的子块进行处理和写入操作,不需要处理的子块保持当前信息不变,减少了不必要的子块操作,延长了SPI Flash的使用寿命。
附图说明
图1是本发明实施例中各块的状态变化示意图;
图2是本发明实施例中一种闪存管理方法流程图;
图3是本发明实施例中一种闪存管理方法流程图;
图4是本发明实施例中一种闪存管理方法的块回收过程流程图;
图5是本发明实施例中一种闪存管理装置结构图;
图6本发明实施例中一种闪存管理装置结构图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
在本发明实施例中,可以将闪存具体为SPI Flash,以SPI Flash为例进行闪存管理方法和装置的说明,同时,闪存也可以为其他规格、类型的存储介质,本发明实施例不对闪存的具体规格、类型或者型号进行限制。
SPI Flash由块组成,块由更小的子块组成,一片SPI Flash可以包含多个块,其中的块也可以包含多个子块。块的状态由其中子块的状态决定,子块的状态主要可以分为以下三种情况:可写入(Clean)状态、可擦除(Dirty)状态和使用中(Using)状态。当一个块中的全部子块均为Clean状态时,该块为Clean状态,此时该块中无任何数据;当一个块中的全部子块均为Dirty状态时,该块为Dirty状态,此时该块中全部为过期数据;当一个块中至少存在一个Using状态的子块时,该块为Using状态。而且,除上述三种主要的子块状态外,子块还包含一种写入中(Writing)状态,Writing状态为一种瞬间的状态,当一个块为Using状态时,其中可以包含Writing状态的子块,当一个块中的全部子块均为Writing状态时,该块为Writing状态。
SPI Flash的操作过程主要可以为分为以下三种情况:
一、擦除:可以在系统空闲时对Dirty状态的块进行擦除操作。
二、写入:对Clean状态的子块进行写入操作。
三、标志位改写:在进行上述擦除或者写入操作之后,改变被操作的块或者子块的状态。如果对块进行了擦除操作,则该块由Dirty状态改变为Clean状态;如果对子块进行了写入操作,则该子块由Clean状态改变为Using状态。
而且,上述写入操作又可以具体分为以下三个步骤:
步骤1、将待写入的数据顺序写入SPI Flash的子块中;被写入子块由Clean状态改变为Writing状态。
步骤2、在步骤1完成后,顺序改变被写入子块的状态,由Writing状态改变为Using状态。
步骤3、在步骤2完成后,顺序改变旧数据子块的状态,由Using状态改变为Dirty状态。
需要说明的是,上述写入操作过程中设计到旧数据子块和被写入子块,上述写入操作具体为数据更新操作,即将旧数据更新为新数据,但是不是将久数据子块进行擦除,而是将新数据写入到Clean状态的子块中,同时将旧数据子块的状态由Using改变为Dirty。
除了上述数据更新操作外,还有一种纯粹的数据写入操作,即不存在旧数据,只需要将待写入数据写入到Clean状态的子块中,并将被写入的子块状态由Clean改变为Using。
在SPI Flash的正常使用过程中,各块的状态是变化的,如图1所示。其中,过程1表示干净的Clean状态的块被写入数据的过程,该块的状态改变为Writing状态;过程2表示该块中存在有效数据,有效数据写入完毕,该快的状态改变为Using状态;过程3表示该块中的有效数据全部过期,该块的状态改变为Dirty状态;过程4表示该块中的数据被更新后,全部数据位过期数据,该块的状态改变为Dirty状态;过程5表示该块的回收过程,对该块进行擦除操作,该块中的全部子块的状态均改变为Clean状态,该块也改变为Clean状态。
在本发明实施例中,可以将SPI Flash中的块划分为同样大小的多个子块,以一个256Kbytes的块为例进行说明,将该块划分为32个8Kbytes的子块,每个子块的数据结构如下表所示。
表1
表1中,Header为子块相关管理信息;Data为子块中保存的真正的数据。
其中,Header的结构如下表所示。
表2
表2中,U32state为子块的状态信息;U32CRC为子块中数据的校验值;U32SeqNum为子块中数据的版本号,子块中数据每更新一次,该数据的版本号就自动增加1,可以根据数据的版本号判断数据是否为最新版本。
其中,U32state的结构如下表所示。
状态信息 |
Update_total_NUM |
Sub_total_NUM |
Index |
表3
表3中的状态信息为8位字符串,其代表含义如下表所示。
值 |
含义 |
111xxxxx |
该子块不包含有效数据(Clean状态) |
110xxxxx |
该子块包含未写入完全的数据(Writing状态) |
100xxxxx |
该子块包含有效数据(Using状态) |
000xxxxx |
该子块包含作废数据(Dirty状态) |
表4
表3中的Update_total_NUM为8位字符串,表示所有待更新的子块数目;Sub_total_NUM为8位字符串,表示更新时,所有nv数据被划分成子块的总数;Index为8位字符串,表示当前子块中的数据在整个nv数据中的位置,用于组合数据使用。
在对闪存进行管理的初始阶段,需要对闪存进行初始化操作。以闪存中总共包括4个block,每个block的大小为256K bytes,当前数据的大小为256kbytes,子块为8Kbytes为例说明:
在初始化过程中,依次读取每个block的每个子块的第一个字符,根据该字符的最高3bit,可以判断每个子块的当前状态,参考表4。需要对Writing状态和Using状态的子块进行如下处理:
1、对于Using状态的子块,如果存在两个Using状态的子块具有相同的index(表3),则取其中U32SeqNum大的子块中的数据(表2)保存在管理结构体的sbigger(高版本数据存放位置)中,U32SeqNum小的子块中数据保存在管理结构体的slittle(低版本数据存放位置)中,并且还可以把slittle对应的子块的状态信息修改为Dirty。
2、对于Writing状态的子块,处于Writing状态的子块的U32SeqNum会大于处于Using状态的同一数据存储位置的子块的U32SeqNum。对于同一数据存储位置的子块,将处于Writing状态的子块中的数据保存在sbigger中,对应的Using状态的子块中的数据保存在slittle中。而且,对于Writing状态的子块,从第一个出现的时候,就单独记录其信息,记录其所属的index。分析该Writing状态的子块的数据是不是完整更新数据的尾部,如果是尾部,说明上一次更新的异常出现在步骤2。此时可以说明所有的Writing状态的子块中的数据为最新可用数据,则可以继续进行原来的步骤2和3,修改所有Writing状态为Using状态,修改原来的Using状态为Dirty状态;如果该Writing状态的子块中的数据不是完整更新数据的尾部,则对下一个子块进行处理。
所有子块读取完毕后,若分析得知Writing状态的子块的数据不是更新数据的尾部,说明上一次更新的异常出现在步骤1,更新不完整,需要使用对应子块的上一版本的数据,则把所有Writing状态的子块修改为Dirty状态;对应的在管理结构体中,sbigger中存储的数据修改为对应的Using状态子块的数据。
所有子块读取完毕后,若分析得知Writing状态的子块的数据是更新数据的尾部,说明上一次更新的异常出现在步骤2,所有的Writing状态的子块的数据为最新可用数据,则可以继续进行原来的步骤2和3,修改所有Writing状态的子块为Using状态,修改原来的Using状态的子块为Dirty状态。
处理完所有的子块信息后,在管理结构体中已经保存有完整的数据信息的各子块信息,开始读取对应的数据内容组合成完整的数据供使用。
Block信息在初始化过程中被初始化完毕,针对每个block,记录了其中Using状态的子块个数,Dirty状态的子块个数,Clean状态的子块个数;还记录了block的状态。
下面通过列举几个具体的实施例详细介绍本发明公开的一种闪存管理方法。
实施例一
详细介绍本发明实施例公开的一种闪存管理方法。
参照图2,示出了本发明实施例中一种闪存管理方法流程图。
步骤100,对目标数据进行分段得到各目标数据段,并计算各目标数据段的数据校验值。
上述目标数据可以理解为对闪存进行管理之后得到的数据,例如,当前数据为12345,欲对当前数据进行更新操作,更新之后的数据为12534,则目标数据即12545。对目标数据12545进行分段操作,可以得到各目标数据段M1、M2、M3、M4、M5,目标数据段M1中的数据为1,目标数据段M5中的数据为5。计算各目标数据段M1、M2、M3、M4、M5的数据校验值,对应得到a1、a2、a3、a4、a5。需要说明的是,本实施例不对计算各目标数据段的数据校验值的计算方法进行限定,同时也不对数据校验值的数据格式、类型等进行限制,只需要保证根据数据校验值可以唯一确定目标数据段的数据即可。
步骤102,针对各目标数据段中的每一段目标数据段,将目标数据段与该目标数据段的对应子块的数据校验值进行比较。
上述步骤100分段得到的每一段目标数据段均存在与之对应的子块,且每个对应子块也具有数据校验值。
例如,上述目标数据段M1、M2、M3、M4、M5各自的对应子块分别为当前数据12345所占用的子块D1、D2、D3、D4、D5,对应子块D1、D2、D3、D4、D5的数据校验值分别为b1、b2、b3、b4、b5。
针对步骤100分段得到的所有目标数据段,可以依次将每段目标数据段的数据校验值和与其对应子块的数据校验值进行比较。例如,将目标数据段M1的数据校验值a1与对应子块D1的数据校验值b1进行比较。
步骤104,当目标数据段的数据校验值与该目标数据段的对应子块的数据校验值不同时,确定该对应子块的可用子块,并将该目标数据段的数据写入到该可用子块。
其中,子块可以为闪存中的存储单元,多个子块可以组成一个块。
例如,当目标数据段M3的数据校验值a3与对应子块D3的数据校验值b3不同时,即a3不等于b3时,确定对应子块D3的可用子块K3,并将目标数据段M3的数据5写入到可用子块K3中。
步骤106,当目标数据段的数据校验值与该目标数据段的对应子块的数据校验值相同时,保持该对应子块的数据不变。
例如,当目标数据段M1的数据校验值a1与对应子块D1的数据校验值b1相同时,即a1等于b1时,保持对应子块D1的数据1不变。
本实施例通过采用上述技术方案,在对SPI Flash中的子块进行管理时,先将目标数据与当前数据进行比较,具体是将分割为各目标数据段之后的目标数据与SPI Flash中对应子块中的当前数据进行比较。如果两种数据的校验值不同,则表示目标数据段中的数据与SPI Flash中对应子块的当前数据不同,需要将对应子块中的当前数据进行处理,并且在对应子块的可用子块中写入匹配的目标数据;如果两种数据的校验值相同,则表示目标数据段与SPI Flash中对应子块的数据相同,不需要处理对应子块中的当前数据。本发明实施例只在目标数据与当前数据不同的情况下,对相关的子块进行处理和写入操作,不需要处理的子块保持当前信息不变,减少了不必要的子块操作,延长了SPI Flash的使用寿命。
实施例二
详细介绍本发明实施例公开的一种闪存管理方法。
参照图3,示出了本发明实施例中一种闪存管理方法流程图。
步骤200,存储各块和各子块的管理信息至管理结构体中。
其中,各子块的管理信息包括子块的状态和子块的数据信息。子块的数据信息可以包括数据校验值、数据版本号和数据位置号。各块的管理信息可以包括块的状态和不同状态的子块的数量。
上述管理结构体可以位于内存中,可以为内存的一部分。所以,可以将上述步骤200理解为将各块和各子块的管理信息存储到内存中。
存储各块和各子块的管理信息至管理结构体中,是为了方便对各块和各子块进行管理。而且,管理结构体中各块和各子块的管理信息还可以实时进行更新,保证管理结构体中的管理信息保持最新。
步骤202,对目标数据进行分段得到各目标数据段,并计算各目标数据段的数据校验值。
优选的,上述步骤202中对目标数据进行分段得到各目标数据段的执行过程可以为:
按照目标数据段的对应子块的长度将目标数据划分为各目标数据段。
例如,当前数据为12345,目标数据为12545,目标数据12545的各目标数据段的对应子块分别为当前数据12345所占用的子块D1、D2、D3、D4、D5,对应子块D1、D2、D3、D4、D5的长度均为一个“数字”(1、2、3、4、5)所占用的长度,则按照一个“数字”的长度将目标数据12545划分为各目标数据段M1、M2、M3、M4、M5,其中,目标数据段M1、M2、M3、M4、M5中对应的数据为1、2、5、4、5。
步骤204,针对各目标数据段中的每一段目标数据段,将目标数据段与该目标数据段的对应子块的数据校验值进行比较。
优选的,可以依次将每段目标数据段的数据校验值和与其对应子块的数据校验值进行比较。
上述步骤204的比较过程中涉及到目标数据段的对应子块的数据校验值,对应子块的数据校验值可以从上述步骤200中的管理结构体中获取得到。
上述步骤204的比较结果可以分为两种情况,一种为目标数据段与该目标数据段的对应子块的数据校验值不同,此时可以按照下列步骤206执行后续操作;另一种为目标数据段与该目标数据段的对应子块的数据校验值相同,此时可以按照下列步骤210执行后续操作。
步骤206,当目标数据段的数据校验值与该目标数据段的对应子块的数据校验值不同时,确定该对应子块的可用子块,并将该目标数据段的数据写入到该可用子块。
优选的,上述步骤206中确定该对应子块的可用子块的执行过程可以分为以下两个子步骤:
子步骤2061,获取该对应子块之后的各子块的状态。
子块的状态可以包括可写入状态、可擦除状态和使用中状态。
上述对应子块的状态可以为使用中状态,即对应子块中存储着使用中的数据,而且,当多个子块中存储着当前数据中同一位置的数据时,上述对应子块中的数据的版本号应该为最新版本。例如,当前数据为12345,子块D3和子块D8中均存储着当前数据的第三位数据,子块D3中存储的数据为3,数据版本号为4,子块D8中存储的数据为2,数据版本号为3,因为数据版本号4高于数据版本号3,则子块D3中存储的数据3为最新版本的数据,子块D3为对应子块,子块D8不是对应子块。
通常情况下,对应子块之后的各子块可以理解为对应子块右边的各子块。
子步骤2062,选择可写入状态的子块作为可用子块。
优选的,可以选择对应子块之后的第一个可写入状态的子块作为可用子块,例如,对应子块D5之后的子块D9和D10均为可写入状态,子块D9为对应子块D5之后的第一个可写入状态的子块,则子块D9为对应子块D5的可用子块。
步骤208,修改该对应子块的状态为可擦除状态,并修改该可用子块的状态为使用中状态。
例如,上述步骤206将目标数据段M3的数据5写入到对应子块D3的可用子块D7中之后,将对应子块D3的状态从使用中状态修改为可擦除状态,并且将可用子块D7的状态从可写入状态修改为使用中状态。
步骤210,当目标数据段的数据校验值与该目标数据段的对应子块的数据校验值相同时,保持该对应子块的数据不变。
例如,当目标数据段M1的数据校验值a1与对应子块D1的数据校验值b1相同时,即a1等于b1时,保持对应子块D1的数据1不变。
优选的,在本实施例中,还可以包括对利用率低的块进行回收的执行步骤,如图4所示。
在利用率低的块中,处于可写入状态的子块非常少,其中大部分子块的状态为使用中状态或者可擦除状态。利用率最低的情况是:该块中只有一个使用中状态的子块,其他子块的状态为可擦除状态。
而且,块的状态也包括可写入状态、可擦除状态和使用中状态。
其中,可写入状态的块中,各子块的状态均为可写入状态。
可擦除状态的块中,各子块的状态均为可擦除状态。
使用中状态的块至少存在一个使用中状态的子块。
步骤300,设置多个中转块。
中转块的状态为可写入状态。
优选的,可以保证在闪存中至少存在四个中转块。
步骤302,对于使用中状态的块,当其中使用中状态的子块的数量占所有子块的数量比值小于等于搬移阈值时,将使用中状态的子块的数据搬移到中转块中,并将使用中状态的块的状态变更为可擦除状态。
例如,闪存中某个处于使用中状态的块包括10个子块,其中处于使用中状态的子块为2个,则使用中状态的子块的数量占所有子块的数量的比值为2/10=20%,若搬移阈值为20%,因为上述比值等于20%,则将2个处于使用中状态的子块中的数据搬移到中转块中,同时将使用中状态的块的状态变为可擦除状态;若搬移预置为25%,因为上述比值小于25%,则将2个处于使用中状态的子块中的数据搬移到中转块中,同时将使用中状态的块的状态变为可擦除状态。
本实施例通过采用上述技术方案,在对SPI Flash中的子块进行管理时,先将目标数据与当前数据进行比较,具体是将分割为各目标数据段之后的目标数据与SPI Flash中对应子块中的当前数据进行比较。如果两种数据的校验值不同,则表示目标数据段中的数据与SPI Flash中对应子块的当前数据不同,需要将对应子块中的当前数据进行处理,并且在对应子块的可用子块中写入匹配的目标数据;如果两种数据的校验值相同,则表示目标数据段与SPI Flash中对应子块的数据相同,不需要处理对应子块中的当前数据。本发明实施例只在目标数据与当前数据不同的情况下,对相关的子块进行处理和写入操作,不需要处理的子块保持当前信息不变,减少了不必要的子块操作,延长了SPI Flash的使用寿命。
而且,本实施例可以在使用统一的SPI Flash访问接口访问硬件设备,只对更新前后有变化的数据的相关子块进行写入操作,更新前后保持不变的数据的相关子块不进行处理,可以有效提高SPI Flash的存储效率。
将SPI Flash中块和子块的管理信息存储到管理结构体中并实时更新,可以有效解决SPI Flash存储过程中的异常掉电导致的数据丢失问题。可以根据异常掉电的不同时刻,将SPI Flash中的数据恢复为上次更新后的数据或者恢复为原始数据。
实施例三
详细介绍本发明实施例公开的一种闪存管理装置。
参照图5,示出了本发明实施例中一种闪存管理装置结构图。
上述闪存管理装置可以包括分段模块400,校验值计算模块402,子块处理模块404,子块保持模块406。其中,分段模块400用于对目标数据进行分段得到各目标数据段。校验值计算模块402可以与分段模块400连接,校验值计算模块402用于计算各目标数据段的数据校验值。子块处理模块404可以与校验值计算模块402连接,子块处理模块404用于针对各目标数据段中的每一段目标数据段,当目标数据段的数据校验值与目标数据段的对应子块的数据校验值不同时,确定对应子块的可用子块,并将目标数据段的数据写入可用子块。其中,子块为闪存中的存储单元,多个子块组成一个块。子块保持模块406可以与校验值计算模块402连接,子块保持模块406用于针对各目标数据段中的每一段目标数据段,当目标数据段的数据校验值与目标数据段的对应子块的数据校验值相同时,保持对应子块的数据不变。
本实施例的闪存管理装置,通过采用上述模块实现闪存管理与上述相关方法实施例的实现机制相同,详细可以参考上述相关方法实施例的记载,在此不再赘述。
本实施例通过采用上述技术方案,在对SPI Flash中的子块进行管理时,先将目标数据与当前数据进行比较,具体是将分割为各目标数据段之后的目标数据与SPI Flash中对应子块中的当前数据进行比较。如果两种数据的校验值不同,则表示目标数据段中的数据与SPI Flash中对应子块的当前数据不同,需要将对应子块中的当前数据进行处理,并且在对应子块的可用子块中写入匹配的目标数据;如果两种数据的校验值相同,则表示目标数据段与SPI Flash中对应子块的数据相同,不需要处理对应子块中的当前数据。本发明实施例只在目标数据与当前数据不同的情况下,对相关的子块进行处理和写入操作,不需要处理的子块保持当前信息不变,减少了不必要的子块操作,延长了SPI Flash的使用寿命。
实施例四
详细介绍本发明实施例公开的一种闪存管理装置。
参照图6,示出了本发明实施例中一种闪存管理装置结构图。
上述闪存管理装置可以包括管理信息存储模块500,分段模块502,校验值计算模块504,子块处理模块506,子块保持模块508,状态修改模块510,中转块设置模块512,搬移模块514。其中,子块处理模块506可以包括状态获取子模块5061和子块选择子模块5062。
在本实施例中,管理信息存储模块500用于在分段模块502对目标数据进行分段得到各目标数据段之前,存储各块和各子块的管理信息至管理结构体中。其中,各子块的管理信息包括子块的状态和子块的数据信息;子块的数据信息包括数据校验值、数据版本号和数据位置号;各块的管理信息包括块的状态和不同状态的子块的数量。分段模块502可以与管理信息存储模块500连接,分段模块502用于对目标数据进行分段得到各目标数据段。校验值计算模块504可以与分段模块502和管理信息存储模块500连接,校验值计算模块504用于计算各目标数据段的数据校验值。子块处理模块506可以与校验值计算模块504和管理信息存储模块500连接,子块处理模块506用于针对各目标数据段中的每一段目标数据段,当目标数据段的数据校验值与目标数据段的对应子块的数据校验值不同时,确定对应子块的可用子块,并将目标数据段的数据写入可用子块。其中,子块为闪存中的存储单元,多个子块组成一个块。子块保持模块508可以与校验值计算模块504和管理信息存储模块500连接,子块保持模块508用于针对各目标数据段中的每一段目标数据段,当目标数据段的数据校验值与目标数据段的对应子块的数据校验值相同时,保持对应子块的数据不变。状态修改模块510可以与子块处理模块506连接,状态修改模块510用于在子块处理模块506将目标数据段的数据写入可用子块之后,修改对应子块的状态为可擦除状态,并修改可用子块的状态为使用中状态。中转块设置模块512,用于设置多个中转块。其中,块的状态包括可写入状态、可擦除状态和使用中状态,中转块的状态为可写入状态。搬移模块514可以与中转块设置模块512和管理信息存储模块500连接,搬移模块514用于对于使用中状态的块,当其中使用中状态的子块的数量占使用中状态的块的所有子块的数量比值小于等于搬移阈值时,将使用中状态的子块的数据搬移到中转块中,并将使用中状态的块的状态变更为可擦除状态。
优选的,分段模块502按照目标数据段的对应子块的长度将目标数据划分为各目标数据段。
优选的,子块处理模块506包括状态获取子模块5061,用于获取对应子块之后的各子块的状态,子块的状态包括可写入状态、可擦除状态和使用中状态;子块选择子模块5062可以与状态获取子模块5061连接,子块选择子模块5062用于选择可写入状态的子块作为可用子块。
优选的,对应子块的状态为使用中状态,且对应子块的数据的版本号为最新版本。可写入状态的块中,各子块的状态均为可写入状态;可擦除状态的块中,各子块的状态均为可擦除状态;使用中状态的块至少存在一个使用中状态的子块。
本实施例的闪存管理装置,通过采用上述模块实现闪存管理与上述相关方法实施例的实现机制相同,详细可以参考上述相关方法实施例的记载,在此不再赘述。
本实施例通过采用上述技术方案,在对SPI Flash中的子块进行管理时,先将目标数据与当前数据进行比较,具体是将分割为各目标数据段之后的目标数据与SPI Flash中对应子块中的当前数据进行比较。如果两种数据的校验值不同,则表示目标数据段中的数据与SPI Flash中对应子块的当前数据不同,需要将对应子块中的当前数据进行处理,并且在对应子块的可用子块中写入匹配的目标数据;如果两种数据的校验值相同,则表示目标数据段与SPI Flash中对应子块的数据相同,不需要处理对应子块中的当前数据。本发明实施例只在目标数据与当前数据不同的情况下,对相关的子块进行处理和写入操作,不需要处理的子块保持当前信息不变,减少了不必要的子块操作,延长了SPI Flash的使用寿命。
而且,本实施例可以在使用统一的SPI Flash访问接口访问硬件设备,只对更新前后有变化的数据的相关子块进行写入操作,更新前后保持不变的数据的相关子块不进行处理,可以有效提高SPI Flash的存储效率。
将SPI Flash中块和子块的管理信息存储到管理结构体中并实时更新,可以有效解决SPI Flash存储过程中的异常掉电导致的数据丢失问题。可以根据异常掉电的不同时刻,将SPI Flash中的数据恢复为上次更新后的数据或者恢复为原始数据。
对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
以上对本发明实施例所公开的一种闪存管理方法和装置,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。