一种闪存存储系统及其读写、删除方法转让专利

申请号 : CN201510056206.0

文献号 : CN104636285B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李超丁杰周文刘建伟

申请人 : 北京麓柏科技有限公司

摘要 :

本发明公开了一种闪存存储系统及其读写、删除方法,闪存存储系统包括缓存、主控模块、缓存元数据记录表、读映射表和写映射表,所述写映射表用于存储在缓存中写入逻辑存储块与物理存储块的对应关系,所述读映射表用于存储在缓存中读出逻辑存储块与物理存储块的对应关系,所述缓存元数据记录表用于存储元数据表地址、物理存储块和后端闪存地址之间的对应关系。本闪存存储系统,可以减少对后端闪存的不必要写入或读出,实现读写数据通路上的零拷贝,消除不必要的中间拷贝过程,从而提高读写效率;并且可以使前端应用的读写访问与后端闪存大小相匹配。

权利要求 :

1.一种闪存存储系统的写数据方法,其特征是,所述闪存存储系统包括缓存、主控模块、缓存元数据记录表和写映射表;其中,所述写映射表用于存储在缓存中写入逻辑存储块与物理存储块的对应关系,所述缓存元数据记录表用于存储元数据表地址、物理存储块和后端闪存地址之间的对应关系;所述闪存存储系统的写数据方法包括如下步骤:S1,所述主控模块接收前端应用发出的将第一写入逻辑存储块中的数据写入第一后端闪存地址的命令;

S2,所述主控模块读取所述写映射表,获取与所述第一写入逻辑存储块对应的所述缓存中的第一物理存储块;

S3,所述主控模块对所述第一后端闪存地址进行计算,获得与所述第一后端闪存地址对应的第一元数据表地址;

S4,所述主控模块读取所述缓存元数据记录表,获取与所述第一元数据表地址对应的当前后端闪存地址;

S5,所述主控模块判断所述第一后端闪存地址与当前后端闪存地址是否相同;

S6,若所述第一后端闪存地址与所述当前后端闪存地址相同,则将所述第一物理存储块替换所述缓存元数据记录表中与所述当前后端闪存地址对应的当前物理存储块;

S7,若所述第一后端闪存地址与所述当前后端闪存地址不同,则将所述缓存元数据记录表中与所述当前后端闪存地址对应的当前物理存储块的数据存储到后端闪存的当前后端闪存地址中,并将所述第一后端闪存地址和第一物理存储块分别替代所述当前后端闪存地址和当前物理存储块。

2.如权利要求1所述的闪存存储系统的写数据方法,其特征是,所述闪存存储系统还包括引用计数表、空闲物理块FIFO和回收模块,所述空闲物理块FIFO用于存放所述缓存中空闲的物理存储块,所述引用计数表用于存储物理存储块与对应的引用次数,当所述空闲物理块FIFO将空闲的物理存储块分配出去时,将分配出去的物理存储块的引用次数设置为第一引用次数值;

还包括回收物理存储块步骤:

对于被替换的物理存储块,读取所述引用计数表中对应物理存储块的引用次数,若对应物理存储块的引用次数大于所述第一引用次数值则将对应的物理存储块的引用次数减设定引用次数,若对应物理存储块的引用次数等于第一引用次数值,则所述回收模块将对应的物理存储块写入所述空闲物理块FIFO中。

3.如权利要求2所述的闪存存储系统的写数据方法,其特征是,所述缓存元数据记录表还用于存储与物理存储块对应的物理存储块有效标志位,在所述物理存储块存储数据之前对应的物理存储块有效标志位的值被置为非有效值,在所述物理存储块存储数据之后对应的物理存储块有效标志位的值被置为有效值;

在所述步骤S6中,在将所述第一物理存储块替换所述缓存元数据记录表中与所述当前后端闪存地址对应的当前物理存储块之前,还包括如下步骤:在所述缓存元数据记录表中判断所述当前后端闪存地址对应的当前物理存储块的物理存储块有效标志位的值是有效值还是非有效值,若是有效值则执行回收物理存储块步骤。

4.如权利要求2所述的闪存存储系统的写数据方法,其特征是:所述闪存存储系统还包括缓存元数据状态表;

所述缓存元数据记录表中,所述物理存储块具有多个,多个物理存储块分别与以所述后端闪存地址为基准的连续多个后端闪存地址相对应;

所述缓存元数据记录表还用于存储与物理存储块对应的物理存储块有效标志位,在物理存储块存储数据之前对应的物理存储块有效标志位的值被置为非有效值,在物理存储块存储数据之后对应的物理存储块有效标志位的值被置为有效值;

所述缓存元数据状态表用于存储元数据表地址、占用标志位和空标志位之间的对应关系,所述占用标志位的值包括分别表示所述元数据表地址对应的表项被占用和没有被占用的占用值和非占用值,所述空标志位的值包括分别表示所述元数据表地址中的物理存储块被写入数据和没有被写入数据的非空值和空值;

在所述步骤S3与步骤S4之间,还包括如下步骤:

S3.1,所述主控模块读取所述缓存元数据记录表,判断所述第一元数据表地址对应的占用标志位的值是否为占用值,若是则等待,否则执行步骤S3.2;

S3.2,所述主控模块判断所述第一元数据表地址对应的空标志位的值是否为非空值,若是则执行步骤S4;

在所述步骤S6中,还包括如下步骤:

S6.1,判断所述缓存元数据记录表中,与所述第一后端闪存地址对应的物理存储块的物理存储块有效标志位的值是否为有效值;

S6.2,若是有效值则执行回收物理存储块步骤,并执行步骤S6.4;

S6.3,若不是有效值则将对应的物理存储块有效标志位的值设为有效值,并执行步骤S6.4;

S6.4,将所述第一物理存储块写入所述缓存元数据记录表的对应位置。

5.如权利要求2所述的闪存存储系统的写数据方法,其特征是:

在步骤S6和步骤S7后,从所述空闲物理块FIFO中为所述第一写入逻辑存储块分配新的物理存储块。

6.一种闪存存储系统的读数据方法,其特征是,所述闪存存储系统包括缓存、主控模块、缓存元数据记录表和读映射表;其中,所述读映射表用于存储在缓存中读出逻辑存储块与物理存储块的对应关系,所述缓存元数据记录表用于存储元数据表地址、物理存储块和后端闪存地址之间的对应关系;所述闪存存储系统的读数据方法包括如下步骤:S1,所述主控模块接收前端应用发出的将第一后端闪存地址的数据写入第一读出逻辑存储块中的命令;

S2,所述主控模块对所述第一后端闪存地址进行计算,获得与所述第一后端闪存地址对应的第一元数据表地址;

S3,所述主控模块读取所述缓存元数据记录表,获取与所述第一元数据表地址对应的当前后端闪存地址;

S4,所述主控模块判断所述第一后端闪存地址与当前后端闪存地址是否相同;

S5,若所述第一后端闪存地址与所述当前后端闪存地址相同,则将所述缓存元数据记录表中与所述第一后端闪存地址对应的当前物理存储块写入所述读映射表中且与所述第一读出逻辑存储块相对应;

S6,若所述第一后端闪存地址与所述当前后端闪存地址不同,则将所述缓存元数据记录表中与所述当前后端闪存地址对应的当前物理存储块的数据存储到后端闪存的当前后端闪存地址中,并将所述第一后端闪存地址和新的物理存储块分别替代所述当前后端闪存地址和当前物理存储块,并将所述新的物理存储块写入所述读映射表中且与所述第一读出逻辑存储块相对应。

7.如权利要求6所述的闪存存储系统的读数据方法,其特征是,

所述闪存存储系统还包括引用计数表、空闲物理块FIFO和回收模块,所述空闲物理块FIFO用于存放所述缓存中空闲的物理存储块,所述引用计数表用于存储所述物理存储块与对应的引用次数,当所述空闲物理块FIFO将空闲的物理存储块分配出去时,将分配出去的物理存储块的引用次数设置为第一引用次数值;还包括回收物理存储块步骤:在步骤S5中,当所述第一后端闪存地址对应的当前物理存储块写入所述读映射表中后,还包括如下步骤:S5.1,将与所述第一后端闪存地址对应的当前物理存储块的引用次数增加设定引用次数,并将所述读映射表中与所述第一读出逻辑存储块对应的旧的物理存储块的引用次数减所述设定引用次数;

在步骤S6中,将所述新的物理存储块写入所述读映射表中后,还包括如下步骤:

S6.1,将所述新的物理存储块的引用次数增加设定引用次数,并将所述读映射表中与所述第一读出逻辑存储块对应的旧的物理存储块的引用次数减所述设定引用次数;

对于替换和被替换的物理存储块,读取所述引用计数表中物理存储块的引用次数,若物理存储块的引用次数大于所述第一引用次数值,则将对应的物理存储块的引用次数减设定引用次数,若物理存储块的引用次数等于第一引用次数值,则所述回收模块将对应的物理存储块写入所述空闲物理块FIFO中。

8.如权利要求7所述的闪存存储系统的读数据方法,其特征是,所述闪存存储系统还包括缓存元数据状态表;

所述缓存元数据记录表中,所述物理存储块具有多个,多个物理存储块分别与以所述后端闪存地址为基准的连续多个后端闪存地址相对应;

所述缓存元数据记录表还用于存储与物理存储块对应的物理存储块有效标志位,在物理存储块存储数据之前对应的物理存储块有效标志位的值被置为非有效值,在物理存储块存储数据之后对应的物理存储块有效标志位的值被置为有效值;

所述缓存元数据状态表用于存储元数据表地址、占用标志位和空标志位之间的对应关系,所述占用标志位的值包括分别表示所述元数据表地址对应的表项被占用和没有被占用的占用值和非占用值,所述空标志位的值包括分别表示所述元数据表地址中的物理存储块被写入数据和没有被写入数据的非空值和空值;

在所述步骤S2与步骤S3之间,还包括如下步骤:

S3.1,所述主控模块读取所述缓存元数据记录表,判断所述第一元数据表地址对应的占用标志位的值是否为占用值,若是则等待,否则执行步骤S3.2;

S3.2,所述主控模块判断所述第一元数据表地址对应的空标志位的值是否为非空值,若是则执行步骤S3;

在所述步骤S5中,还包括如下步骤:

S5.1,判断所述缓存元数据记录表中,与所述第一后端闪存地址对应的物理存储块的物理存储块有效标志位的值是否为有效值;

S5.2,若是有效值则执行回收物理存储块步骤;

S5.3,若不是有效值则将对应的物理存储块有效标志位的值设为有效值。

9.一种闪存存储系统的删除数据方法,其特征是,所述闪存存储系统包括缓存、主控模块和缓存元数据记录表;其中,所述缓存元数据记录表用于存储元数据表地址、物理存储块和后端闪存地址之间的对应关系;所述闪存存储系统的删除数据方法包括如下步骤:S1,所述主控模块接收前端应用发出的删除第一后端闪存地址的数据的命令;

S2,所述主控模块对所述第一后端闪存地址进行计算,获得与所述第一后端闪存地址对应的第一元数据表地址;

S3,所述主控模块读取所述缓存元数据记录表,获取与所述第一元数据表地址对应的当前后端闪存地址;

S4,所述主控模块判断所述第一后端闪存地址与当前后端闪存地址是否相同;

S5,若所述第一后端闪存地址与所述当前后端闪存地址相同,则将当前后端闪存地址对应的表项删除,并执行步骤S7;

S6,若所述第一后端闪存地址与所述当前后端闪存地址不同,则执行步骤S7;

S7,将所述删除第一后端闪存地址的数据的命令发送到后端闪存。

10.一种闪存存储系统,其特征是,包括缓存、主控模块、缓存元数据记录表、读映射表和写映射表;其中,所述写映射表用于存储在缓存中写入逻辑存储块与物理存储块的对应关系,所述读映射表用于存储在缓存中读出逻辑存储块与物理存储块的对应关系,所述缓存元数据记录表用于存储元数据表地址、物理存储块和后端闪存地址之间的对应关系;

所述主控模块用于接收前端应用发出的将第一写入逻辑存储块中的数据写入第一后端闪存地址的命令;

所述主控模块用于读取所述写映射表,获取与所述第一写入逻辑存储块对应的所述缓存中的第一物理存储块;

所述主控模块用于对所述第一后端闪存地址进行计算,获得与所述第一后端闪存地址对应的第一元数据表地址;

所述主控模块用于读取所述缓存元数据记录表,获取与所述第一元数据表地址对应的当前后端闪存地址;

所述主控模块用于判断所述第一后端闪存地址与当前后端闪存地址是否相同,若所述第一后端闪存地址与所述当前后端闪存地址相同,则将所述第一物理存储块替换所述缓存元数据记录表中与所述当前后端闪存地址对应的当前物理存储块;若所述第一后端闪存地址与所述当前后端闪存地址不同,则将所述缓存元数据记录表中与所述当前后端闪存地址对应的当前物理存储块的数据存储到后端闪存的当前后端闪存地址中,并将所述第一后端闪存地址和第一物理存储块分别替代所述当前后端闪存地址和当前物理存储块;

所述主控模块用于接收前端应用发出的将第一后端闪存地址的数据写入第一读出逻辑存储块中的命令;

所述主控模块用于对所述第一后端闪存地址进行计算,获得与所述第一后端闪存地址对应的第一元数据表地址;

所述主控模块用于读取所述缓存元数据记录表,获取与所述第一元数据表地址对应的当前后端闪存地址;

所述主控模块用于判断所述第一后端闪存地址与当前后端闪存地址是否相同;若所述第一后端闪存地址与所述当前后端闪存地址相同,则将所述缓存元数据记录表中与所述第一后端闪存地址对应的当前物理存储块写入所述读映射表中且与所述第一读出逻辑存储块相对应;若所述第一后端闪存地址与所述当前后端闪存地址不同,则将所述缓存元数据记录表中与所述当前后端闪存地址对应的当前物理存储块的数据存储到后端闪存的当前后端闪存地址中,并将所述第一后端闪存地址和新的物理存储块分别替代所述当前后端闪存地址和当前物理存储块,并将所述新的物理存储块写入所述读映射表中且与所述第一读出逻辑存储块相对应。

11.如权利要求10所述的闪存存储系统,其特征是,

所述闪存存储系统还包括引用计数表、空闲物理块FIFO和回收模块,所述空闲物理块FIFO用于存放所述缓存中空闲的物理存储块,所述引用计数表用于存储所述物理存储块与对应的引用次数,当所述空闲物理块FIFO将空闲的物理存储块分配出去时,将分配出去的物理存储块的引用次数设置为第一引用次数值;

当所述第一后端闪存地址对应的当前物理存储块写入所述读映射表中后,将与所述第一后端闪存地址对应的当前物理存储块的引用次数增加设定引用次数,并将所述读映射表中与所述第一读出逻辑存储块对应的旧的物理存储块的引用次数减所述设定引用次数;

将所述新的物理存储块写入所述读映射表中后,将所述新的物理存储块的引用次数增加设定引用次数,并将所述读映射表中与所述第一读出逻辑存储块对应的旧的物理存储块的引用次数减所述设定引用次数;

对于替换和被替换的物理存储块,读取所述引用计数表中物理存储块的引用次数,若物理存储块的引用次数大于所述第一引用次数值,则将对应的物理存储块的引用次数减设定引用次数,若物理存储块的引用次数等于第一引用次数值,则所述回收模块将对应的物理存储块写入所述空闲物理块FIFO中。

12.如权利要求10所述的闪存存储系统,其特征是,所述缓存元数据记录表的一个表项中具有四个物理存储块,每个物理存储块的大小为4KB。

说明书 :

一种闪存存储系统及其读写、删除方法

【技术领域】

[0001] 本发明涉及存储领域,具体涉及一种闪存存储系统及其读写、删除方法。【背景技术】
[0002] 使用NAND Flash的固态存储系统逐渐成为一种新的广受欢迎的存储系统(Solid State Disk,SSD)。随着闪存技术的发展,MLC(Multi-Level Cell)的单page容量从4KB逐渐发展到8KB,16KB,32KB,随着TLC技术的成熟,单page容量会达到64KB,128KB甚至更高。然而Flash的使用寿命是有限的(25nm MLC擦写次数在3000次左右)。
[0003] 零拷贝(zero-copy)最初是实现主机或路由器等设备高速网络接口的主要技术。零拷贝技术后来泛指可以减少数据拷贝和共享总线操作的次数,消除数据在存储器之间不必要的中间拷贝过程,有效地提高通信效率,是设计高速接口通道、实现高速服务器和路由器的关键技术之一。
[0004] 当前缓存技术的两大不足:
[0005] 由于Flash使用寿命有限,在Flash之前增加一级缓存,从而减少对Flash的擦写,是传统通用做法,但存储系统读写访问大小是4KB,而闪存的写入单位是page。而随着闪存技术发展,单page的容量可达16KB,32KB。如果按照传统做法,以访问请求大小4KB作为缓存的load,flush单位,则会造成写放大。增加Flash擦写次数,降低Flash寿命。如果单纯按照page大小申请缓存,则会造成缓存空间的浪费,从而降低缓存命中率。
[0006] 传统闪存的缓存在读写时,需要经过两次数据拷贝,从而降低了缓存的访问速度。影响整个存储系统的性能。
【发明内容】
[0007] 为了克服现有技术的不足,本发明提供了一种闪存存储系统及其读写、删除方法,以减少缓存与后端闪存之间的中间拷贝过程。
[0008] 一种闪存存储系统的写数据方法,所述闪存存储系统包括缓存、主控模块、缓存元数据记录表和写映射表;其中,所述写映射表用于存储在缓存中写入逻辑存储块与物理存储块的对应关系,所述缓存元数据记录表用于存储元数据表地址、物理存储块和后端闪存地址之间的对应关系;所述闪存存储系统的写数据方法包括如下步骤:
[0009] S1,所述主控模块接收前端应用发出的将第一写入逻辑存储块中的数据写入第一后端闪存地址的命令;
[0010] S2,所述主控模块读取所述写映射表,获取与所述第一写入逻辑存储块对应的所述缓存中的第一物理存储块;
[0011] S3,所述主控模块对所述第一后端闪存地址进行计算,获得与所述第一后端闪存地址对应的第一元数据表地址;
[0012] S4,所述主控模块读取所述缓存元数据记录表,获取与所述第一元数据表地址对应的当前后端闪存地址;
[0013] S5,所述主控模块判断所述第一后端闪存地址与当前后端闪存地址是否相同;
[0014] S6,若所述第一后端闪存地址与所述当前后端闪存地址相同,则将所述第一物理存储块替换所述缓存元数据记录表中与所述当前后端闪存地址对应的当前物理存储块;
[0015] S7,若所述第一后端闪存地址与所述当前后端闪存地址不同,则将所述缓存元数据记录表中与所述当前后端闪存地址对应的当前物理存储块的数据存储到后端闪存的当前后端闪存地址中,并将所述第一后端闪存地址和第一物理存储块分别替代所述当前后端闪存地址和当前物理存储块。
[0016] 在一个实施例中,所述闪存存储系统还包括引用计数表、空闲物理块FIFO和回收模块,所述空闲物理块FIFO用于存放所述缓存中空闲的物理存储块,所述引用计数表用于存储物理存储块与对应的引用次数,当所述空闲物理块FIFO将空闲的物理存储块分配出去时,将分配出去的物理存储块的引用次数设置为第一引用次数值;
[0017] 还包括回收物理存储块步骤:
[0018] 对于被替换的物理存储块,读取所述引用计数表中对应物理存储块的引用次数,若对应物理存储块的引用次数大于所述第一引用次数值则将对应的物理存储块的引用次数减设定引用次数,若对应物理存储块的引用次数等于第一引用次数值,则所述回收模块将对应的物理存储块写入所述空闲物理块FIFO中。
[0019] 在一个实施例中,所述缓存元数据记录表还用于存储与物理存储块对应的物理存储块有效标志位,在所述物理存储块存储数据之前对应的物理存储块有效标志位的值被置为非有效值,在所述物理存储块存储数据之后对应的物理存储块有效标志位的值被置为有效值;
[0020] 在所述步骤S6中,在将所述第一物理存储块替换所述缓存元数据记录表中与所述当前后端闪存地址对应的当前物理存储块之前,还包括如下步骤:
[0021] 在所述缓存元数据记录表中判断所述当前后端闪存地址对应的当前物理存储块的物理存储块有效标志位的值是有效值还是非有效值,若是有效值则执行回收物理存储块步骤。
[0022] 在一个实施例中,所述闪存存储系统还包括缓存元数据状态表;
[0023] 所述缓存元数据记录表中,所述物理存储块具有多个,多个物理存储块分别与以所述后端闪存地址为基准的连续多个后端闪存地址相对应;
[0024] 所述缓存元数据记录表还用于存储与物理存储块对应的物理存储块有效标志位,在物理存储块存储数据之前对应的物理存储块有效标志位的值被置为非有效值,在物理存储块存储数据之后对应的物理存储块有效标志位的值被置为有效值;
[0025] 所述缓存元数据状态表用于存储元数据表地址、占用标志位和空标志位之间的对应关系,所述占用标志位的值包括分别表示所述元数据表地址对应的表项被占用和没有被占用的占用值和非占用值,所述空标志位的值包括分别表示所述元数据表地址中的物理存储块被写入数据和没有被写入数据的非空值和空值;
[0026] 在所述步骤S3与步骤S4之间,还包括如下步骤:
[0027] S3.1,所述主控模块读取所述缓存元数据记录表,判断所述第一元数据表地址对应的占用标志位的值是否为占用值,若是则等待,否则执行步骤S3.2;
[0028] S3.2,所述主控模块判断所述第一元数据表地址对应的空标志位的值是否为非空值,若是则执行步骤S4;
[0029] 在所述步骤S6中,还包括如下步骤:
[0030] S6.1,判断所述缓存元数据记录表中,与所述第一后端闪存地址对应的物理存储块的物理存储块有效标志位的值是否为有效值;
[0031] S6.2,若是有效值则执行回收物理存储块步骤,并执行步骤S6.4;
[0032] S6.3,若不是有效值则将对应的物理存储块有效标志位的值设为有效值,并执行步骤S6.4;
[0033] S6.4,将所述第一物理存储块写入所述缓存元数据记录表的对应位置。
[0034] 在一个实施例中,在步骤S6和步骤S7后,从所述空闲物理块FIFO中为所述第一写入逻辑存储块分配新的物理存储块。
[0035] 本发明还提供了一种闪存存储系统的读数据方法,所述闪存存储系统包括缓存、主控模块、缓存元数据记录表和读映射表;其中,所述读映射表用于存储在缓存中读出逻辑存储块与物理存储块的对应关系,所述缓存元数据记录表用于存储元数据表地址、物理存储块和后端闪存地址之间的对应关系;所述闪存存储系统的读数据方法包括如下步骤:
[0036] S1,所述主控模块接收前端应用发出的将第一后端闪存地址的数据写入第一读出逻辑存储块中的命令;
[0037] S2,所述主控模块对所述第一后端闪存地址进行计算,获得与所述第一后端闪存地址对应的第一元数据表地址;
[0038] S3,所述主控模块读取所述缓存元数据记录表,获取与所述第一元数据表地址对应的当前后端闪存地址;
[0039] S4,所述主控模块判断所述第一后端闪存地址与当前后端闪存地址是否相同;
[0040] S5,若所述第一后端闪存地址与所述当前后端闪存地址相同,则将所述缓存元数据记录表中与所述第一后端闪存地址对应的当前物理存储块写入所述读映射表中且与所述第一读出逻辑存储块相对应;
[0041] S6,若所述第一后端闪存地址与所述当前后端闪存地址不同,则将所述缓存元数据记录表中与所述当前后端闪存地址对应的当前物理存储块的数据存储到后端闪存的当前后端闪存地址中,并将所述第一后端闪存地址和新的物理存储块分别替代所述当前后端闪存地址和当前物理存储块,并将所述新的物理存储块写入所述读映射表中且与所述第一读出逻辑存储块相对应。
[0042] 在一个实施例中,所述闪存存储系统还包括引用计数表、空闲物理块FIFO和回收模块,所述空闲物理块FIFO用于存放所述缓存中空闲的物理存储块,所述引用计数表用于存储所述物理存储块与对应的引用次数,当所述空闲物理块FIFO将空闲的物理存储块分配出去时,将分配出去的物理存储块的引用次数设置为第一引用次数值;还包括回收物理存储块步骤:
[0043] 在步骤S5中,当所述第一后端闪存地址对应的当前物理存储块写入所述读映射表中后,还包括如下步骤:
[0044] S5.1,将与所述第一后端闪存地址对应的当前物理存储块的引用次数增加设定引用次数,并将所述读映射表中与所述第一读出逻辑存储块对应的旧的物理存储块的引用次数减所述设定引用次数;
[0045] 在步骤S6中,将所述新的物理存储块写入所述读映射表中后,还包括如下步骤:
[0046] S6.1,将所述新的物理存储块的引用次数增加设定引用次数,并将所述读映射表中与所述第一读出逻辑存储块对应的旧的物理存储块的引用次数减所述设定引用次数;
[0047] 对于替换和被替换的物理存储块,读取所述引用计数表中物理存储块的引用次数,若物理存储块的引用次数大于所述第一引用次数值,则将对应的物理存储块的引用次数减设定引用次数,若物理存储块的引用次数等于第一引用次数值,则所述回收模块将对应的物理存储块写入所述空闲物理块FIFO中。
[0048] 在一个实施例中,所述闪存存储系统还包括缓存元数据状态表;
[0049] 所述缓存元数据记录表中,所述物理存储块具有多个,多个物理存储块分别与以所述后端闪存地址为基准的连续多个后端闪存地址相对应;
[0050] 所述缓存元数据记录表还用于存储与物理存储块对应的物理存储块有效标志位,在物理存储块存储数据之前对应的物理存储块有效标志位的值被置为非有效值,在物理存储块存储数据之后对应的物理存储块有效标志位的值被置为有效值;
[0051] 所述缓存元数据状态表用于存储元数据表地址、占用标志位和空标志位之间的对应关系,所述占用标志位的值包括分别表示所述元数据表地址对应的表项被占用和没有被占用的占用值和非占用值,所述空标志位的值包括分别表示所述元数据表地址中的物理存储块被写入数据和没有被写入数据的非空值和空值;
[0052] 在所述步骤S2与步骤S3之间,还包括如下步骤:
[0053] S3.1,所述主控模块读取所述缓存元数据记录表,判断所述第一元数据表地址对应的占用标志位的值是否为占用值,若是则等待,否则执行步骤S3.2;
[0054] S3.2,所述主控模块判断所述第一元数据表地址对应的空标志位的值是否为非空值,若是则执行步骤S3;
[0055] 在所述步骤S5中,还包括如下步骤:
[0056] S5.1,判断所述缓存元数据记录表中,与所述第一后端闪存地址对应的物理存储块的物理存储块有效标志位的值是否为有效值;
[0057] S5.2,若是有效值则执行回收物理存储块步骤;
[0058] S5.3,若不是有效值则将对应的物理存储块有效标志位的值设为有效值。
[0059] 本发明还一种闪存存储系统的删除数据方法,所述闪存存储系统包括缓存、主控模块和缓存元数据记录表;其中,所述缓存元数据记录表用于存储元数据表地址、物理存储块和后端闪存地址之间的对应关系;所述闪存存储系统的删除数据方法包括如下步骤:
[0060] S1,所述主控模块接收前端应用发出的删除第一后端闪存地址的数据的命令;
[0061] S2,所述主控模块对所述第一后端闪存地址进行计算,获得与所述第一后端闪存地址对应的第一元数据表地址;
[0062] S3,所述主控模块读取所述缓存元数据记录表,获取与所述第一元数据表地址对应的当前后端闪存地址;
[0063] S4,所述主控模块判断所述第一后端闪存地址与当前后端闪存地址是否相同;
[0064] S5,若所述第一后端闪存地址与所述当前后端闪存地址相同,则将当前后端闪存地址对应的表项删除,并执行步骤S7;
[0065] S6,若所述第一后端闪存地址与所述当前后端闪存地址不同,则执行步骤S7;
[0066] S7,将所述删除第一后端闪存地址的数据的命令发送到后端闪存。
[0067] 本发明还提供了一种闪存存储系统,包括缓存、主控模块、缓存元数据记录表、读映射表和写映射表;其中,所述写映射表用于存储在缓存中写入逻辑存储块与物理存储块的对应关系,所述读映射表用于存储在缓存中读出逻辑存储块与物理存储块的对应关系,所述缓存元数据记录表用于存储元数据表地址、物理存储块和后端闪存地址之间的对应关系;
[0068] 所述主控模块用于接收前端应用发出的将第一写入逻辑存储块中的数据写入第一后端闪存地址的命令;
[0069] 所述主控模块用于读取所述写映射表,获取与所述第一写入逻辑存储块对应的所述缓存中的第一物理存储块;
[0070] 所述主控模块用于对所述第一后端闪存地址进行计算,获得与所述第一后端闪存地址对应的第一元数据表地址;
[0071] 所述主控模块用于读取所述缓存元数据记录表,获取与所述第一元数据表地址对应的当前后端闪存地址;
[0072] 所述主控模块用于判断所述第一后端闪存地址与当前后端闪存地址是否相同,若所述第一后端闪存地址与所述当前后端闪存地址相同,则将所述第一物理存储块替换所述缓存元数据记录表中与所述当前后端闪存地址对应的当前物理存储块;若所述第一后端闪存地址与所述当前后端闪存地址不同,则将所述缓存元数据记录表中与所述当前后端闪存地址对应的当前物理存储块的数据存储到后端闪存的当前后端闪存地址中,并将所述第一后端闪存地址和第一物理存储块分别替代所述当前后端闪存地址和当前物理存储块;
[0073] 所述主控模块用于接收前端应用发出的将第一后端闪存地址的数据写入第一读出逻辑存储块中的命令;
[0074] 所述主控模块用于对所述第一后端闪存地址进行计算,获得与所述第一后端闪存地址对应的第一元数据表地址;
[0075] 所述主控模块用于读取所述缓存元数据记录表,获取与所述第一元数据表地址对应的当前后端闪存地址;
[0076] 所述主控模块用于判断所述第一后端闪存地址与当前后端闪存地址是否相同;若所述第一后端闪存地址与所述当前后端闪存地址相同,则将所述缓存元数据记录表中与所述第一后端闪存地址对应的当前物理存储块写入所述读映射表中且与所述第一读出逻辑存储块相对应;若所述第一后端闪存地址与所述当前后端闪存地址不同,则将所述缓存元数据记录表中与所述当前后端闪存地址对应的当前物理存储块的数据存储到后端闪存的当前后端闪存地址中,并将所述第一后端闪存地址和新的物理存储块分别替代所述当前后端闪存地址和当前物理存储块,并将所述新的物理存储块写入所述读映射表中且与所述第一读出逻辑存储块相对应。
[0077] 在一个实施例中,所述闪存存储系统还包括引用计数表、空闲物理块FIFO和回收模块,所述空闲物理块FIFO用于存放所述缓存中空闲的物理存储块,所述引用计数表用于存储所述物理存储块与对应的引用次数,当所述空闲物理块FIFO将空闲的物理存储块分配出去时,将分配出去的物理存储块的引用次数设置为第一引用次数值;
[0078] 当所述第一后端闪存地址对应的当前物理存储块写入所述读映射表中后,将与所述第一后端闪存地址对应的当前物理存储块的引用次数增加设定引用次数,并将所述读映射表中与所述第一读出逻辑存储块对应的旧的物理存储块的引用次数减所述设定引用次数;
[0079] 将所述新的物理存储块写入所述读映射表中后,将所述新的物理存储块的引用次数增加设定引用次数,并将所述读映射表中与所述第一读出逻辑存储块对应的旧的物理存储块的引用次数减所述设定引用次数;
[0080] 对于替换和被替换的物理存储块,读取所述引用计数表中物理存储块的引用次数,若物理存储块的引用次数大于所述第一引用次数值,则将对应的物理存储块的引用次数减设定引用次数,若物理存储块的引用次数等于第一引用次数值,则所述回收模块将对应的物理存储块写入所述空闲物理块FIFO中。
[0081] 在一个实施例中,所述缓存元数据记录表的一个表项中具有四个物理存储块,每个物理存储块的大小为4KB。
[0082] 本闪存存储系统,可以减少对后端闪存的不必要写入或读出,实现读写数据通路上的零拷贝,消除不必要的中间拷贝过程,从而提高读写效率;
[0083] 并且可以使前端应用的读写访问与后端闪存大小相匹配。【附图说明】
[0084] 图1是本发明一种实施例的闪存存储系统工作流程示意图;
[0085] 图2是本发明一种实施例的闪存存储系统原理框图;
[0086] 图3是本发明一种实施例的缓存中逻辑存储块和物理存储块地址转换示意图;
[0087] 图4是本发明一种实施例的回收物理存储块的流程示意图;
[0088] 图5是本发明一种实施例的命令完成队列处理流程示意图;
[0089] 图6是本发明一种实施例的缓存元数据记录表示意图;
[0090] 图7是本发明一种实施例的缓存元数据状态表示意图;
[0091] 图8是本发明一种实施例的删除后端闪存数据的流程示意图;
[0092] 图9是本发明一种实施例的向后端闪存写入数据的流程示意图;
[0093] 图10是本发明一种实施例的从后端闪存读入数据的流程示意图;
[0094] 图11是本发明一种实施例的初始状态时写映射表示意图;
[0095] 图12是本发明一种实施例的初始状态时读映射表示意图;
[0096] 图13是本发明一种实施例的初始状态时缓存元数据状态表示意图;
[0097] 图14是本发明一种实施例的初始状态时空闲物理块FIFO存储示意图;
[0098] 图15是图14的空闲物理块FIFO在分配一部分物理存储块给写映射表后的示意图;
[0099] 图16是本发明一种实施例的第一次写请求前缓存元数据记录表示意图;
[0100] 图17是图16的缓存元数据记录表在第一次写请求后的示意图;
[0101] 图18是本发明一种实施例的第一次写请求前写映射表的示意图;
[0102] 图19是图18的写映射表在第一次写请求后的示意图;
[0103] 图20是本发明一种实施例的第一次写请求前缓存元数据状态表的示意图;
[0104] 图21是本发明一种实施例的缓存元数据状态表在第一次写请求后的示意图;
[0105] 图22是本发明一种实施例的在某一次读请求前缓存元数据记录表的示意图;
[0106] 图23是图22缓存元数据记录表在该次读请求后的示意图;
[0107] 图24是本发明一种实施例的在某一次读请求前读映射表的示意图;
[0108] 图25是图24的读映射表在经过该次读请求后的示意图;
[0109] 图26是本发明一种实施例的在某一次读请求前缓存元数据状态表的示意图;
[0110] 图27是图26的缓存元数据状态表在经过该次读请求后的示意图;
[0111] 图28是本发明一种实施例的主控模块发送给后端闪存的命令示意图;
[0112] 图29是图28的命令ID为16回收前缓存元数据状态表示意图;
[0113] 图30是图28的命令ID为16回收后缓存元数据状态表示意图。【具体实施方式】
[0114] 以下对发明的较佳实施例作进一步详细说明。
[0115] 如图1所示,本发明一种实施例的闪存存储系统工作流程示意图。
[0116] 在本实施例中,本闪存存储系统包括:缓存、读写请求地址映射模块、缓存空闲块管理模块、缓存元数据记录表、缓存元数据状态表和主控模块,所述主控模块在缓存系统内。
[0117] 本实施例中,对缓存的读写访问请求都是以4KB为大小,将缓存按照4KB的大小划分为若干个物理存储块。例如容量为1GB的DDR,会划分为1GB/4KB=256K个物理存储块,称为PBN1~PBN256K。PBN即physical block num,物理存储块编号,与其对应的是LBN,即logic block num,逻辑存储块编号。
[0118] 缓存系统会虚拟少量逻辑存储块,给前端访问使用,以1GB缓存空间为例,它含有256K个物理存储块。缓存系统可以虚拟出1K个逻辑存储块(也是4KB大小),给前端应用使用,这个1K和前面的256K大小之间没有关系,两者可以采用其他的数值及关系。
[0119] 前端应用写访问时,首先先选择1个空闲的逻辑存储块(初始时所有块都是空闲的),将数据写入该逻辑存储块,假设为逻辑存储块1,如图1的步骤1所示。
[0120] 然后前端应用向缓存的主控模块发命令,让其将逻辑存储块1内的4KB数据搬到后端闪存存储的某个地址,如步骤2所示。
[0121] 缓存不一定立刻将其实际写入后端存储的闪存中,而是暂时存在自身空间内。但会向前端应用发送一个完成消息,告知其此数据搬移已经完成,如步骤3所示。
[0122] 前端应用收到完成消息,认为该数据已经写入后端的闪存,将逻辑存储块1释放掉。这样后面的写请求就可以再次利用逻辑存储块1进行操作。
[0123] 前端应用想从后端闪存中读取某个后端地址的数据时,先送命令,让缓存系统将后端某个地址的数据搬到某个空闲的逻辑存储块,假设是逻辑存储块1,如步骤2所示。
[0124] 缓存会将数据准备好,放在逻辑存储块1上。有可能这个数据本身就存在缓存内,即缓存命中,也可能是从后端闪存读进缓存内的。
[0125] 缓存准备好后,会送完成消息,告知前端数据已经准备好,如步骤3所示。
[0126] 前端会读取逻辑地址1的数据,完成访问,如步骤1所示。
[0127] 除了读写请求,前端应用访问会还有一种删除请求,请求将后端存储的某个地址的数据删除。这是为了提高闪存利用率,只有闪存存储系统才有的删除请求。接收到这个请求后,缓存系统会首先检查自身内是否储存了该地址的数据,如果有,则将其删除,然后将这个命令传递给后端的闪存,向前端应用报告请求完成。
[0128] 图1中的步骤4是缓存系统在写(flush)、读(load)或删除(del)操作时向后端模块发送命令。
[0129] 步骤5是后端模块完成flush,load,del操作时,向缓存系统返回完成。
[0130] 步骤6是后端模块根据flush和load的命令信息,控制并完成缓存内数据和后端存储数据的交换。
[0131] 如图2所示,一种实施例的闪存存储系统结构图,以下对各个构成进行说明。
[0132] 物理存储块
[0133] 也即物理缓存单元,是一块DDR,用于存储实际的数据。它被按照4KB的大小,划分为若干个物理存储块。
[0134] 读写请求地址映射模块
[0135] 如图3所示,前端应用访问请求在读取缓存中的某一逻辑存储块的数据时,读请求地址映射模块会按照一定的规则将该地址映射到缓存中某一实际的物理存储块上。例如,前端访问请求想读取缓存逻辑存储块1的数据,但本次请求实际读取的是缓存的物理存储块15的数据。
[0136] 读写请求地址映射模块内部有两张映射表,一张是读映射表,一张是写映射表。每一个写入逻辑存储块在写映射表中都有一个表项,对应一个物理存储块,具体是一个表项中一个写入逻辑存储块号对应一个物理存储块号。每一个读出逻辑存储块在读映射表中都有一个表项,对应一个物理存储块。以上面为例,假设缓存系统提供1K个写入逻辑存储块,则该写映射表有1K个表项,可以存放在一个ram中。
[0137] 读写请求地址映射模块可以串联在前端和物理缓存单元总线之间,如图2所示。例如读写请求地址映射模块可以截取读地址,则用读地址的逻辑存储块号,作为读映射表的地址索引,获取ram中该逻辑存储块号对应的物理存储块号,将此物理存储块号作为最终读地址发送给物理缓存。
[0138] 读映射表和写映射表中的内容是由主控模块实时动态更新的。某一次逻辑存储块1可能对应物理存储块10,下一次访问时,逻辑存储块1可能就对应物理存储块50了。
[0139] 和读请求地址映射类似,前端访问请求在写缓存中某一块数据时,写映射表会按照一定的规则将其写地址映射到其他的某一实际物理存储块上。
[0140] 缓存空闲块管理模块
[0141] 缓存空闲块管理模块负责管理缓存的物理存储块的申请和回收。它包括1张引用计数表、1个空闲块FIFO队列和1个回收模块组成。
[0142] 对于所有缓存的物理存储块,引用计数表都有一个对应的表项,以上面为例:容量为1GB的DDR,会划分为1GB/4KB=256K个物理存储块,则引用计数表内会有256K个表项。
[0143] 空闲物理块FIFO的队列深度和引用计数表的表项数相同,如上例所示,也是256K,存放的是当前空闲可用的物理存储块的编号。当空闲物理块FIFO存储为空时,代表当前无可用的物理存储块。当空闲物理块FIFO不为空时,里面每一个数字代表缓存中对应的物理存储块可用。初始状态时,所有物理存储块都在空闲物理块FIFO中,都是未使用的状态。当主控模块申请使用新的物理存储块时,会从空闲物理块FIFO中读出一个空闲物理存储块编号,返回给主控模块使用。当某一个物理存储块使用完毕,被回收模块回收时,会被再写回空闲物理块FIFO。
[0144] 回收模块与主控模块(FTL)完成队列相连。每当完成队列有新数据时(即有新的命令完成了),回收模块会检测新数据,处理后,将完成队列的信息传递给主控模块。
[0145] 如图4所示是回收模块工作流程,如图5所示是完成队列处理流程,处理流程如下:
[0146] 1.若此完成的命令是读命令(load),或者删除命令。则不进行任何操作,直接传递给主控模块。
[0147] 2.若此完成的命令是写命令(flush),则依次读出该写命令中4个物理存储块编号,并读出4个有效标志位。对每一个有效的物理存储块编号,把其编号作为引用计数表的地址索引,读出引用计数表中对应的计数器值(引用次数值),如果其等于1,则表示只有1个逻辑存储块映射到了这个物理存储块上,将其计数器置为0,把物理存储块回收掉,将该物理存储块编号写回空闲物理块FIFO。如果其大于1,表示有多余1个逻辑存储块映射到了这个物理存储块上,将其计数器的值减1(设定引用次数),但不将其回收。
[0148] 空闲物理块FIFO在每次分配新空闲块时,会将其分配出去的空闲块引用计数值设为1(第一引用次数值)。
[0149] 缓存元数据记录表
[0150] 如图6所示,缓存元数据记录表用来记录缓存当前缓存了哪些数据。
[0151] 每一个page size大小的闪存,对应缓存元数据记录表中的一个表项。以page size16KB为例,缓存元数据记录表中每一条记录对应的是16KB空间。由于物理存储块时是4KB,则每一个表项内包含4个物理存储块以及每个物理存储块是否有效的标志。每一条表项还包含一个后端闪存存储的地址(后端闪存地址)。缓存元数据的存放地址(元数据表地址)可以是基于后端地址(GBAx)hash变换得到的。
[0152] 主控模块
[0153] 主控模块负责处理前端应用的请求,管理整个缓存。
[0154] 如图7所示,它包括一个缓存元数据状态表,每一个表项都和缓存元数据记录表中的表项一一对应,即缓存元数据状态表的某一个表项的地址与缓存元数据记录表的对应表项的地址相同。
[0155] 缓存元数据状态表包括以下标志位:
[0156] 占用标志位(lock标志位),表明缓存元数据状态表的对应表项是否正在被使用,其具有两个值lock和unlock,若是lock则表示占用,禁止操作;若是unlock则表示未被占用,允许操作。
[0157] 改动标志位(dirty标志位),表明缓存元数据状态表对应表项对应的16KB是否经过改动,其具有dirty(表示数据被改动过)和clean(表示数据没有被改动过)两个值。例如刚从后端闪存读(load)进缓存的某个物理存储块,该物理存储块对应的缓存元数据状态表的改动标志位的值为clean。对于改动标志位的值是clean的,在没有更改过的情况下,在写(flush)出缓存时,是不用重复写到后端闪存存储的。
[0158] 空标志位(empty标志位),表明缓存元数据状态表的对应表项是否有效,在初始化时,所有表项的空标志位的值都是empty。
[0159] 主控模块负责处理具体读写请求,它会解析并执行前端应用发来的读写命令。
[0160] 前端命令分为3类:删除请求、写请求和读请求
[0161] 删除请求
[0162] 如图8所示,前端应用请求删除某个后端闪存地址上的数据,主控模块会先检查此地址是否在缓存内。若在,则将缓存的数据删除。然后通知后端模块删除掉这个地址上的数据。后端模块完成后,经由主控模块通知前端应用,已完成删除。
[0163] 写请求
[0164] 如图9所示,主控模块先读取写映射表,获得逻辑存储块号对应的物理存储块号,然后对后端闪存地址做hash处理,得到缓存元数据记录表的地址(也即缓存元数据状态表的地址)。
[0165] 主控模块读取元数据状态表,判断该缓存元数据状态表的地址对应的表项的占用标志位的值是否为lock,如果是lock,则会一直等待,等到该占用标志位的值为unlock为止。
[0166] 如果该表项的占用标志位的值为unlock,则主控模块进一步读取元数据状态表中该表项的空标志位的值。若该表项的空标志位的值为empty,则创建一个新表项(此处所谓创建,是在该表项中创建,也可以称之为在该表项中赋值),如图6所示,空的表项中的数值可以是一个非法值,例如是大于实际分配的物理存储块号的数值,然后将该物理存储块号写进该表项的对应位置。因为写操作大小是4KB,一条表项的空间是16KB,包含4个物理存储块的位置,根据后端闪存地址除以4的余数,来决定该物理存储块写入第几个物理存储块位置。例如,后端闪存地址后几位是0x0000,可以整除4,则写在第一个物理存储块位置上,若是0x0002,则写在第三个物理存储块位置上,而这个表项的后端闪存地址GBAX则为0x0000;然后将对应的物理存储块有效标志的值设成有效,四个物理存储块有效标志位由四个比特位数组成,依次表示第一个物理存储块至第四个物理存储块,1代表有效,0代表无效;然后再把缓存元数据状态表的empty标识、dirty标识分别设成not empty和dirty,返回完成命令。
[0167] 如果该表项空标志位的值为not empty,则主控模块进一步判断表项中的当前后端闪存地址是否和本次要操作的后端闪存地址相同。
[0168] 如果不同,则将该表项的内容发送一条flush命令到后端模块,命令格式是表项内容前面附加上一个命令ID和操作标志(flush操作),也就是说,将该表项中四个物理存储块中的内容依次存储到对应的后端闪存地址中。
[0169] 然后创建新表项(对该表项重新赋值),和前面一样,将本次写操作的物理存储块号写到对应位置,将对应的物理存储块有效标志设成有效,把元数据状态表的empty标识和dirty标识分别设成not empty和dirty,返回完成命令。
[0170] 如果后端闪存地址相同,则说明缓存命中,继续判断该物理存储块对应的有效标志是否有效。
[0171] 若无效,则该地址还没写入数据,直接将该物理存储块号写入表项,并将对应有效位标识成有效,返回完成命令。
[0172] 若有效,则该地址的数据被覆盖,将旧的物理存储块号回收,再将该物理存储块号写入表项。返回完成命令。
[0173] 读请求
[0174] 如图10所示,主控模块对后端闪存地址做hash处理,得到缓存元数据记录表的地址(也即缓存元数据状态表的地址)。
[0175] 主控模块读取元数据状态表,判断该表项的lock标识位是否为lock,如果为lock,则会一直等待,等到lock标志位为unlock为止。
[0176] 如果该表项的标志位是unlock,则主控模块进一步根据元数据状态表的empty标志位,若empty标志位为empty,则创建一个新表项(也即在该表项中赋值),创建的时候申请4个空闲的物理存储块号,并将其中对应的一个物理存储块号写到读映射表请求的位置上。将该位置的旧物理存储块号释放,将4个物理存储块对应的物理存储块有效标志位都标识为有效,在缓存元数据状态表中,将lock标志位、empty标志位和clean标识位分别标识为lock、not empty和clean。然后主控模块发送一条命令,要求后端模块将后端闪存地址上的16KB数据依次分别读到这4个物理存储块上。由于读取需要时间,此时将缓存元数据状态表中该表项的lock标志位设置为lock,从而将该表项锁定,不允许其他命令对此表项进行操作,直到后端模块将数据读入为止。在缓存系统接收到后端模块的完成命令后,才会向前端模块返回完成命令,并将缓存元数据状态表中的该表项的lock标志位设置为unlock。
[0177] 如果该表项的empty标志位为not empty,则主控模块进一步判断该表项中的当前后端闪存地址是否和本次要操作的后端地址相同。
[0178] 如果不同,则将该表项的内容发送一条flush命令到后端模块,命令格式是表项内容前面附加上一个命令ID和操作标志(flush操作),即将该表项的四个物理存储块中的数据存储到对应的后端闪存地址中。Flush后(不需要等待完成),创建一个新表项(即对该表项重新赋值),创建的时候申请4个空闲的物理存储块号,并将其中对应的一个物理存储块号写到读映射表请求的位置上,并将读映射表中对应位置的旧物理存储块号释放。然后在缓存元数据状态表中将4个物理存储块的物理存储块有效标志位都标识为有效,并将lock标志位、empty标志位和clean标志位分别标识为lock、not empty和clean。主控模块发送一条命令,要求后端模块将后端闪存地址上的16KB数据读到这4个物理存储块上。
[0179] 在缓存系统的主控模块接收到后端模块的完成命令后,才会向前端模块返回完成命令,并将缓存元数据状态表中该表项的lock标志位置为unlock。
[0180] 如果后端地址相同,则说明缓存命中,继续判断该物理存储块对应的物理存储块有效标志是否有效。
[0181] 若无效,则该表项对应的地址还没读入数据,为该表项内所有无效的物理存储块位置,申请新的物理存储块,并将其中对应的一个物理存储块号写到读映射表请求的位置上,并将读映射表中对应位置的旧物理存储块号释放。将4个物理存储块都标识为有效,在缓存元数据状态表中将lock标志位、empty标志位和clean标志位分别标志为lock、not empty和clean。然后主控模块再发送一条命令,要求后端模块将后端闪存地址上的数据读到这几个新的物理存储块上,但原先物理存储块标识位为有效的物理存储块不会被覆盖,仅读取并覆盖原先无效的物理存储块。在缓存系统接收到后端模块的完成命令后,才会向前端模块返回完成命令,并将对应表项的lock标志位设置为unlock。
[0182] 若对应的物理存储块标志位为有效,说明该数据已经在缓存中,将该物理存储块号写到读映射表请求的位置上,并将该物理存储块号的引用计数加1,同时将读映射表中该位置的旧物理存储块号释放。
[0183] 对于写入读映射表的物理存储块,在引用计数表中将该物理存储块的引用次数加1,而当某个物理存储块从读映射表被删除时,则在引用计数表中将该物理存储块的引用次数减1,从而保证读映射表中的物理存储块不被回收。
[0184] 实施例1
[0185] 假设物理存储块共有1000个,大小是4KB,等于前端应用访问大小。
[0186] 假设后端闪存系统的page size是16KB,则缓存元数据记录表和缓存元数据状态表都是250个表项,因为他们是基于page size的,1000*4KB=250*16KB。
[0187] 假设前端应用能看到的虚拟逻辑存储块有100个,多少个可以随意,主要目的是考虑处理延时,多设几个便于并行处理。
[0188] 如图11至15是各个数据表或存储器初始状态下:
[0189] 初始状态时,写映射表已经为各个逻辑块号分配好了对应的物理存储块号,如图11所示。读映射表保持空的状态,所有表项写入一个无效的物理存储块号,例如“X”表示一个大于有效物理存储块号的数值,表示当前为初始状态,这样在前端应用读入某个读入逻辑存储块号时,则无数据返回,如图12所示。
[0190] 如图13所示,初始状态时,缓存元数据记录表是空的,因为缓存中没有存放任何数据,缓存元数据状态表(里面有250条表项)都是empty,unlock,clean的状态。
[0191] 如图14所示,初始状态时,空闲物理块FIFO是满的,里面存放着所有的物理存储块号(1000个)。初始状态下所有物理存储块都是未使用的空闲状态。
[0192] 初始状态时,主控模块会在空闲FIFO队列中先申请100个(逻辑存储块数目)物理存储块,将其写到写映射表中,为写映射表中的每一个逻辑存储块分配一个物理存储块号。由于初始时所有物理存储块在空闲物理块FIFO中,在主控模块将前100个物理存储块号分配到写映射表后,空闲物理块FIFO就只剩下900个物理存储块,如图15所示。后续物理存储块使用情况不同,回收先后不同,空闲物理块FIFO里的物理存储块号的顺序将会是杂乱的。
[0193] 第一次写请求,如图16至21所示。
[0194] 前端应用将数据先写到了逻辑存储块1中。由于有写映射表,此时逻辑地址1对应的是物理存储块1,所以数据实际被写到了物理存储块1中。
[0195] 前端应用发下命令,将逻辑存储块1的数据写到后端某个地址GBAx,假设GBAx最低两位的比特为00。
[0196] 主控模块接收到了这个命令,将GBAx做hash运算,得出其对应的缓存元数据地址索引是15(假设)。并查询写地址映射表,得出当前逻辑存储块1对应物理存储块1。
[0197] 主控模块读取缓存元数据状态表,发现地址15的表项状态是empty、unlock和clean(因为初始化之后所有表项都是这个状态)。
[0198] 主控模块在缓存元数据记录表15的位置新建一个表项,将物理存储块1写到第一个物理存储块位置。GBAx最低两位比特00~11的4种情况,决定了该物理存储块要写到第几个位置,依次对应表项的第一个物理存储块位置到第四个物理存储块位置。
[0199] 缓存元数据记录表中的GBAx的后两位是0,因为元数据记录表的一条表项大小是16KB,和前端命令4KB地址相比大4倍,所以最后两位地址记录成0即可。
[0200] 将缓存元数据状态表第15个表项设为not empty、unlock和dirty,代表本表项已被使用,unlock和dirty则分别指本表项的数据较新一些(和后端GBAx存储的数据比)。
[0201] 主控模块在向空闲物理块FIFO申请一个新物理存储块(假设是101),写入写映射表第一个位置(逻辑存储块1的位置),如图19所示,现在再来写逻辑存储块1,实际就写入物理存储块101了。
[0202] 主控模块向前端应用返回命令完成。
[0203] 某一次读请求,如图22至27所示。
[0204] 若干次操作后,前端应用发送命令,要求将后端地址GBAy的数据,读到逻辑存储块2上。然后前端应用等待命令完成后,再访问逻辑存储块2获得数据。
[0205] 主控模块对GBAy进行hash计算,得出其对应的缓存元数据记录表的地址是30(假设)。
[0206] 如图22所示,当前地址30的表项是有数据的,但是该该表项对应的后端存储地址是GBAz,与要访问的后端地址GBAy并不相同,也即缓存没有命中,需要先将这个表项(也即旧表项)的数据写到后端闪存中,同时将需要的新数据读(load)进来。
[0207] 主控模块先查出元数据地址30是有数据的,但后端地址GBAz并不等于GBAy。
[0208] 主控模块读取状态表,发现元数据地址30的位置的dirty标志位是dirty,说明需要将对应的四个物理存储块的数据写到后端闪存。
[0209] 主控模块发送命令,通知后端模块将物理存储块123、物理存储块75、物理存储块50和物理存储块100的数据(共16KB),写入到GBAz这个地址起始的16KB空间中。
[0210] 主控模块不需要等待上个命令完成,立刻将元数据记录表的表项30擦掉,新建一个表项,即对表项30重新赋值。向缓存空闲块管理模块申请4个新的物理存储块,假设是物理存储块400、物理存储块500、物理存储块600和物理存储块700,将其依次写到第一个到第四个位置的物理存储块位置。
[0211] 假设GBAy的末两位是01,代表是4个4KB中的第2个,因此将第二个物理存储块位置上的物理存储块500写到读映射表2的位置上。
[0212] 在写之前,读映射表2对应的旧物理存储块是物理存储块20,此处前端访问的请求表示已经不再需要逻辑存储块2的数据了,因此物理存储块20会被释放。当然物理存储块20不一定会写到空闲物理块FIFO中,这取决物理存储块20的当前引用计数。这部分在回收模块中有描述具体过程。
[0213] 主控模块再发一个命令,要求后端模块将GBAy(地址低2bit为0,地址16KB对齐)开始的16KB数据依次读到物理存储块400、500、600和700(每个物理存储块4KB)中。
[0214] 主控模块将此表项在缓存元数据状态表中置为lock、clean和not empty。
[0215] 由于读取需要时间,主控模块此时不会立刻向前端返回完成命令,他需要先等待后端模块返回读取完成,然后再讲表项30的lock标志位设置为unlock。
[0216] 某一次后端命令完成,如图28至30所示。
[0217] 如图28所示,缓存系统发给后端闪存两个命令,命令ID号15的是一次flush(写)操作,命令ID号16的是一次load(读)操作。现在后端模块返回这两个命令完成。
[0218] 对于ID号15的命令,回收模块会先检查其操作类型是写操作,然后将其中有效的物理存储块号,本例中是两个,物理存储块18和物理存储块2,回收掉。回收流程依然按照之前描述的方式进行。
[0219] 回收完成后并不会通知前端,因为写操作的命令返回在之前就返回过了。
[0220] 对与ID号16的命令,回收模块会对GBAy进行hash计算,按上面实例,它对应元数据记录表的第30个表项。当时缓存系统将该表项的lock标志位设置为了lock,此时数据读取回来,缓存系统会将该表项的lock标志位置为unlock,同时通知前端模块,之前的这条读命令完成了。
[0221] 以上内容是结合具体的优选实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干简单推演或替换,都应当视为属于本发明由所提交的权利要求书确定的专利保护范围。