一种闪存块磨损平衡的方法和系统
技术领域
本发明涉及存储技术领域,特别涉及一种闪存块磨损平衡的方法和系统。
背景技术
随着计算机的普及,各种存储介质越来越受到人们的关注。而闪存由于其存储的便捷性和传输速率的高速性受到了人们的重视,并被很块地应用到了各个领域。闪存采用的是半导体技术,与普通硬盘、光盘类的存储介质相比,闪存是相对静态的;并且拥有较小的体积,便于携带;而且随着半导体技术的发展,闪存的价格也在不断地下降,因此,目前大多存储介质采用闪存技术。
闪存也可以称为Flash ROM,它是一种电擦除非易失性(在断电的情况下仍能够保持所存储的数据信息)存储器,由浮栅型场效应管构成。写入数据时,利用热电子注入,使浮栅带电;擦除数据时,利用高压下的隧道效应,使浮栅失去电子。通过改变浮栅的状态进行数据的存储,具有可多次擦写的特点。
闪存的存储方式通常是这样的:为了增加传输的速度,大部分闪存都不是采用单字节的方式进行数据传输,而是以(逻辑)块为单位进行的。由于闪存的工作方式是通过采用热电子注入使浮栅带电来存储信息的,因此其存储信息的过程具有一定的特殊性。闪存在写入数据时,所要写入的块的写入区必须是空白的,存储有信息的闪存都不能满足这个条件。所以在写入数据之前,必须先进行块的擦除操作,将块中写入区域存储的信息变为空白,然后才能进行写操作,这就是一个写的生命周期。由于数据的传输、访问是以块为单位进行的,因此每次修改,即使是一个字节数据的修改,也要将数据所在的逻辑块擦除干净,再将新的信息写入。因此,如果频繁的更改某一块的数据就会造成该块的寿命减少,最终使该块成为坏块。
现有技术中,闪存的逻辑块通常都是被编号的。假设一个闪存共有100个逻辑块,每个逻辑块的大小是512字节,但是在闪存实际工作过程中,每个逻辑块的实际存储量是511字节,因为每个逻辑块的首字节是不存储数据的,这个字节用来存储逻辑块的逻辑块号信息。
在存储一个文件时,闪存会查找一系列空的逻辑块,并用逻辑块号将这一系列逻辑块联系起来。假设创建一个大小为1024字节的文件,需要三个逻辑块才能存储下,该文件数据区的存储可以如图1所示。每个逻辑块块头标志该逻辑块的逻辑块号。需要说明的是,在一个文件所包含的逻辑块中,逻辑块号不一定按顺序相连。
为了操作简单,闪存进行擦除写入时都是先将编号靠前的块进行擦写,久而久之就会影响闪存的寿命。经过实验证明,闪存的可擦写寿命一般是十万次。如果我们每次都利用编号靠前的逻辑块进行写操作而忽视了编号靠后的逻辑块,导致的后果就是,编号靠前的逻辑块在不断的加电失电的过程中被大大的磨损,而编号靠后的逻辑块却几乎没有被应用,这必然会大大减少闪存的寿命,造成资源的极大浪费,同时也会使闪存使用者的利益受到损害。
目前出现了利用平衡的方法增加闪存寿命的技术,所谓平衡就是将对逻辑块擦写的次数平均到每一个逻辑块,使其受到的磨损状况大致相同,避免坏块的提早产生。
现在所采取的平衡技术,一般都是这样进行的:在每一个逻辑块上取两个字节单位,第一个字节对逻辑块进行编号,记录其逻辑块的ID;另一个字节为计数器,记录该ID的逻辑块擦写的次数。在每次将要进行擦写操作时,系统寻找计数器中被擦写次数最小的逻辑块进行擦写,使每个逻辑块受到的磨损的几率相同,能够延长闪存的寿命。
发明人认为现有技术至少存在以下缺点:
1、需要为计数器单独设置一个空间,造成了存储空间的额外开支,实际上减少了存储空间;
2、由于每次都是寻找计数器最小的逻辑块,而不是连续的进行擦除写入,导致了存储信息的不连贯,不便于管理;
3、存储过程中需要对计数器进行查找等操作,程序控制复杂,降低了执行效率;
4、在发生异常的情况下,逻辑块中用来存储计数器擦写次数的信息容易发生丢失,不能完全保障达到磨损平衡。
发明内容
为了提高闪存的使用寿命、达到闪存存储空间的磨损平衡,本发明提供了一种闪存块磨损平衡的方法和系统。所述技术方案如下:
一种闪存块磨损平衡的方法,包括:
接收到向第一逻辑块写入新数据的指令;
获取备份块的位置;
将所述第一逻辑块中的数据读入内存,在所述内存中将所述第一逻辑块中的数据更新为欲写入所述第一逻辑块中的写入数据;
将所述写入数据写入所述备份块;
擦除所述第一逻辑块;
按照预先设定的规则获取第二逻辑块的位置;
将所述第二逻辑块中的数据写入所述第一逻辑块;
擦除所述第二逻辑块,并设置所述第二逻辑块为新的备份块。
所述获取备份块的位置之前,所述方法还包括:
判断所述第一逻辑块的写入区域是否为空;
当判断结果为所述第一逻辑块的写入区域为空时,在所述第一逻辑块的写入区域中写入新数据,完成一次写入操作;
相应地,所述获取备份块的位置,具体包括:
当判断结果为所述第一逻辑块的写入区域不为空时,获取所述备份块的位置。
将所述第一逻辑块中的数据读入内存,在所述内存中将所述第一逻辑块的数据更新为欲写入所述第一逻辑块中的写入数据,具体包括:
将所述第一逻辑块中的数据读入内存,所述第一逻辑块中的数据包括逻辑块号和所述第一逻辑块写入区域的数据;
在所述内存中将所述第一逻辑块中的数据进行拆分,将所述第一逻辑块的逻辑块号和所述新数据结合生成所述写入数据。
将所述写入数据写入所述备份块,具体包括:
擦除所述备份块中存储的逻辑块号信息,将所述新数据写入所述备份块的写入区域;
所述新数据写入完成后,在所述备份块存储逻辑块号的区域写入所述第一逻辑块的逻辑块号。
所述擦除所述第一逻辑块,具体包括:
擦除所述第一逻辑模块中存储的逻辑块号和写入区域的数据。
所述按照预先设定的规则获取第二逻辑块的位置,具体包括:
获取所述备份块对应的物理块;
寻找所述物理块的下一个或者上一个物理块;
获取所述下一个或者上一个物理块对应的逻辑块;
记录所述下一个或者上一个物理块对应的逻辑块,并将所述下一个或者上一个物理块对应的逻辑块作为第二逻辑块。
一种闪存块磨损平衡的系统,包括:主机和闪存;
所述主机包括:
发送模块,用于向第一逻辑块发送写入新数据的指令;
内存模块,用于为所述闪存提供内存存储数据;
所述闪存包括:
接收模块,用于接收向第一逻辑块写入新数据的指令;
第一获取模块,用于获取备份块的位置;
更新模块,用于将所述第一逻辑块中的数据读入内存,在所述内存中将所述第一逻辑块中的数据更新为欲写入所述第一逻辑块中的写入数据;
第一写入模块,用于将所述写入数据写入所述备份块;
第一擦除模块,用于擦除所述第一逻辑块;
第二获取模块,用于按照预先设定的规则获取第二逻辑块的位置;
第二写入模块,用于将所述第二逻辑块中的数据写入所述第一逻辑块;
第二擦除模块,用于擦除所述第二逻辑块;
设置模块,用于设置擦除后的所述第二逻辑块为新的备份块。
所述闪存还包括:
判断模块,用于判断所述第一逻辑块的写入区域是否为空;
相应的,所述第一获取模块具体用于:
当所述判断模块的判断结果为所述第一逻辑块的写入区域不为空时,获取所述备份块的位置。
所述更新模块具体包括:
读入单元,用于将所述第一逻辑块中的数据读入内存,所述第一逻辑块中的数据包括逻辑块号和所述第一逻辑块写入区域的数据;
拆分组合单元,用于在所述内存中将所述第一逻辑块中的数据进行拆分,将所述第一逻辑块的逻辑块号和所述新数据结合生成所述写入数据。
所述第一写入模块具体用于:
擦除所述备份块中存储的逻辑块号信息,将所述新数据写入所述备份块的写入区域;
写入完成后,在所述备份块存储逻辑块号的区域写入所述第一逻辑块的逻辑块号。
所述第一擦除模块具体用于:
擦除所述第一逻辑模块中存储的逻辑块号信息和写入区域的数据。
所述第二获取模块具体包括:
第一获取单元,用于获取所述备份块对应的物理块;
寻找单元,用于寻找所述物理块的下一个或者上一个物理块;
第二获取单元,用于获取所述下一个或者上一个物理块对应的逻辑块;
记录单元,用于记录所述逻辑块的逻辑块号,并将所述逻辑块作为第二逻辑块。
本发明实施例提供的技术方案带来的有益效果是:
通过设立一个空白的备份块,并通过不断移动备份块的方法,达到了闪存块真正的磨损平衡。另外,本发明不需要使用计数器,节省闪存的空间,实现简单,可以达到掉电保护的目的。
附图说明
图1是本发明实施例1中提供的闪存块磨损平衡的方法流程图;
图2是本发明实施例1中提供的闪存块的内部结构示意图;
图3是本发明实施例1中提供的闪存块存储的信息示意图;
图4是本发明实施例1中提供的一种备份块移动的示意图;
图5是本发明实施例1中提供的另一种备份块移动的示意图;
图6是本发明实施例1中提供的第三种备份块移动的示意图;
图7是本发明实施例2中提供的闪存块磨损平衡的系统结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
实施例1
参见图1,本实施例提供了一种闪存块磨损平衡的方法,该方法包括:
101:接收到将新数据写入到第一逻辑块的指令;
102:判断第一逻辑块的写入区域是否为空白区域;
如果不为空白区域,则执行步骤103;
如果为空白区域,直接将新数据写入第一逻辑块的写入区域,完成操作;
103:寻找备份块的位置;
104:将第一逻辑块中存储的数据读入主机的内存,并在内存中更新为欲写入第一逻辑块中的写入数据;
这里需要说明的是,将第一逻辑块中存储的内容读入主机的内存时,需要包括第一逻辑块中第一字节所存储的逻辑块号信息和第一逻辑块的写入区域存储的数据;
在内存中进行数据更新时,逻辑块号的信息不变,只需要将除逻辑块号信息之外的其他数据部分更新为新数据。
其中,欲写入第一逻辑模块中的写入数据包括逻辑块号信息和新数据。
105:将内存中更新后的写入数据写入备份块,备份块成为新的第一逻辑块;
其中,将内存中更新后的写入数据写入备份块,是将逻辑块号信息和新数据都写入备份块,在写入时,先擦除备份块的逻辑块号,在备份块的写入区域写入新数据,最后写入第一逻辑块的逻辑块号。
更新后的写入数据写入备份块之后,原备份块对应的物理块,现在对应第一逻辑块。
在本发明实施例中,在写入新数据时,闪存并不是将第一逻辑块擦除后将新数据和逻辑块号直接写入第一逻辑块中,而是在内存中更新好后,先将更新好的写入数据写入备份块后再擦除第一逻辑块,这样做可以防止突然掉电造成数据丢失。
当然,在将写入数据写入备份块的过程中也可能突然掉电,产生逻辑块号相同的逻辑块。那么在闪存每次上电时,自动查找相同的逻辑块号,如果有逻辑块号相同的逻辑块,将数据不完整的逻辑块擦除,使其成为备份块,这样就可以解决掉电产生两个相同逻辑块号的逻辑块的问题。
106:擦除原第一逻辑块,并使其成为新的备份块;
107:闪存按照预先设定的规则找到第二逻辑块,并将第二逻辑块中存储的数据写入新的备份块,即原第一逻辑块中,使原第一逻辑块成为新的第二逻辑块,将原第二逻辑块擦除,并设置为最新的备份块,完成操作。
其中,预先设定的规则可以是:确定原备份块的位置后,找到与原备份块对应的物理块,根据物理地址找到该物理块的下一个物理块,选择与该下一个物理块对应的逻辑块,并记录下来,将该下一个物理块对应的逻辑块作为第二逻辑块;
或者,确定原备份块的位置后,找到与原备份块对应的物理块,根据物理地址找到该物理块的上一个物理块,选择与该上一个物理块对应的逻辑块,并记录下来,将该上一个物理块对应的逻辑块作为第二逻辑块。
当按照上述预先设定的规则记录下来的第二逻辑块与第一逻辑块重合时,则将内存中更新完毕的写入数据写入备份块,擦除第一逻辑块,并将第一逻辑块设置为新的备份块。
以存储容量为4K,包含8个物理块的闪存为例,将这个闪存划分为8个逻辑块,每个逻辑块只有一个物理块,如图2所示,8个逻辑块的逻辑块号分别为FF、01、02、03、04、05、06、07,每个块的大小都是512字节。闪存初始化时,将每个逻辑块的逻辑块号写入每个块的第一个字节中。在闪存中设置一备份块,备份块是一个空白块,写入区域不存储任何数据。在本实施例中,如图3所示,设定逻辑块FF为备份块,其他的块中都存有数据。
(1)以接收到将数据Data1写入逻辑块02的指令为例,参见图4:
判断逻辑块02的写入区域是否为空白区域;
结果为否,寻找备份块FF的位置;
将逻辑块02中的数据(包括逻辑块号0x02和写入区域的原数据)读入主机的内存,并将写入区域的原数据更新为Data1;
将在内存中更新后的数据(包括逻辑块号0x02和Data1)写入备份块FF;
擦除原逻辑块02;
找到逻辑块01,将逻辑块01中的数据写入原逻辑块02后,将逻辑块01作为新的备份块。
完成上述操作后,备份块FF与物理块01相对应。
(2)在(1)的基础上,以接收到将数据Data2写入逻辑块02的指令为例,参见图5:
判断判断逻辑块02的写入区域是否为空白区域;
结果为否,寻找备份块FF的位置;
将逻辑块02中的数据(包括逻辑块号0x02和Data1)读入主机的内存,并将Data1更新为Data2;
将在内存中更新后的数据(包括逻辑块号0x02和Data2)写入备份块FF;
擦除原逻辑块02;
找到逻辑块01,将逻辑块01中的数据写入原逻辑块02后,将逻辑块01作为新的备份块。
完成上述操作后,备份块FF与物理块02相对应。
(3)在(2)的基础上,以又接收到将数据Data3写入逻辑块05的指令为例,参见图6:
判断判断逻辑块05的写入区域是否为空白区域;
结果为否,寻找备份块FF的位置;
将逻辑块05中的数据(包括逻辑块号0x05和写入区域的原数据)读入主机的内存,并将逻辑块05中写入区域的原数据更新为Data3;
将在内存中更新后的数据(包括逻辑块号0x05和Data3)写入备份块FF;
擦除原逻辑块05;
找到逻辑块03,将逻辑块03中的数据写入原逻辑块05后,将逻辑块03作为新的备份块。
完成上述操作后,备份块FF与物理块03相对应。
从上述的内容可以看出,通过重复写入某一逻辑块或写入不同的逻辑块,在实际的写入过程中物理块是顺序写入的,实现了物理块的循环移动,因此可以达到真正的磨损平衡。
本发明实施例通过设立一个空白的备份块,并控制该备份块在逻辑上不断移动,节省了内存的存储空间,实现简单,达到了闪存块真正的磨损平衡。同时,还可以进行掉电保护。
实施例2
参见图7,本发明实施例提供了一种内存磨损平衡的系统,包括:主机701和闪存702;
主机701包括:
发送模块701A,用于发送向第一逻辑模块写入新数据的指令;
内存模块701B,用于为闪存702提供内存存储数据;
闪存702包括:
接收模块702A,用于接收向第一逻辑块写入新数据的指令;
第一获取模块702B,用于获取备份块的位置;
更新模块702C,用于将第一逻辑块中的数据读入内存,在所述内存中将所述第一逻辑块中的数据更新为欲写入第一逻辑块中的写入数据;
第一写入模块702D,用于将内存中的更新后的写入数据写入备份块;
第一擦除模块702E,用于擦除第一逻辑块;
第二获取模块702F,用于按照预先设定的规则获取第二逻辑块的位置;
第二写入模块702G,用于将第二逻辑块中的数据写入第一逻辑块;
第二擦除模块702H,用于擦除第二逻辑块;
设置模块702I,用于设置擦除后的第二逻辑块为新的备份块。
进一步地,闪存702还包括:
判断模块702J,用于判断第一逻辑块的写入区域是否为空;
相应的,第一获取模块702B具体用于:
当判断模块的判断结果为第一逻辑块的写入区域不为空时,获取备份块的位置。
其中,更新模块702C具体包括:
读入单元,用于将第一逻辑块中的数据读入内存,改第一逻辑块中的数据包括逻辑块号和第一逻辑块写入区域的数据;
拆分组合单元,用于在内存中将第一逻辑块中的数据进行拆分,将第一逻辑块的逻辑块号和欲写入第一逻辑块的新数据结合生成写入数据。
第一写入模块702D具体用于:
擦除备份块中存储的逻辑块号信息,将所述新数据写入所述备份块的写入区域,所述新数据写入完成后,在所述备份块存储逻辑块号的区域写入所述第一逻辑块的逻辑块号。
第一擦除模块702E具体用于:
擦除第一逻辑模块中存储的逻辑块号信息和和写入区域的数据。
第二获取模块702F具体包括:
第一获取单元,用于获取备份块对应的物理块;
寻找单元,用于寻找物理块的下一个或者上一个物理块;
第二获取单元,用于获取下一个或者上一个物理块对应的逻辑块;
记录单元,用于记录逻辑块,并将逻辑块作为第二逻辑块。
本发明实施例通过内存磨损平衡的系统设立一个空白的备份块,并控制该备份块不断移动,节省了内存的存储空间,实现简单,达到了闪存块真正的磨损平衡。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。