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

文档序号:8319097阅读:来源:国知局
读写请求地址映射模块
[0135]如图3所示,前端应用访问请求在读取缓存中的某一逻辑存储块的数据时,读请求地址映射模块会按照一定的规则将该地址映射到缓存中某一实际的物理存储块上。例如,前端访问请求想读取缓存逻辑存储块I的数据,但本次请求实际读取的是缓存的物理存储块15的数据。
[0136]读写请求地址映射模块内部有两张映射表,一张是读映射表,一张是写映射表。每一个写入逻辑存储块在写映射表中都有一个表项,对应一个物理存储块,具体是一个表项中一个写入逻辑存储块号对应一个物理存储块号。每一个读出逻辑存储块在读映射表中都有一个表项,对应一个物理存储块。以上面为例,假设缓存系统提供IK个写入逻辑存储块,则该写映射表有IK个表项,可以存放在一个ram中。
[0137]读写请求地址映射模块可以串联在前端和物理缓存单元总线之间,如图2所示。例如读写请求地址映射模块可以截取读地址,则用读地址的逻辑存储块号,作为读映射表的地址索引,获取ram中该逻辑存储块号对应的物理存储块号,将此物理存储块号作为最终读地址发送给物理缓存。
[0138]读映射表和写映射表中的内容是由主控模块实时动态更新的。某一次逻辑存储块I可能对应物理存储块10,下一次访问时,逻辑存储块I可能就对应物理存储块50 了。
[0139]和读请求地址映射类似,前端访问请求在写缓存中某一块数据时,写映射表会按照一定的规则将其写地址映射到其他的某一实际物理存储块上。
[0140]缓存空闲块管理模块
[0141]缓存空闲块管理模块负责管理缓存的物理存储块的申请和回收。它包括I张引用计数表、I个空闲块FIFO队列和I个回收模块组成。
[0142]对于所有缓存的物理存储块,引用计数表都有一个对应的表项,以上面为例:容量为IGB的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,则表示只有I个逻辑存储块映射到了这个物理存储块上,将其计数器置为0,把物理存储块回收掉,将该物理存储块编号写回空闲物理块FIFO。如果其大于I,表示有多余I个逻辑存储块映射到了这个物理存储块上,将其计数器的值减I (设定引用次数),但不将其回收。
[0148]空闲物理块FIFO在每次分配新空闲块时,会将其分配出去的空闲块引用计数值设为I (第一引用次数值)。
[0149]缓存元数据记录表
[0150]如图6所示,缓存元数据记录表用来记录缓存当前缓存了哪些数据。
[0151]每一个page size大小的闪存,对应缓存元数据记录表中的一个表项。以pagesizel6KB为例,缓存元数据记录表中每一条记录对应的是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 ;然后将对应的物理存储块有效标志的值设成有效,四个物理存储块有效标识由四个比特位数组成,依次表示第一个物理存储块至第四个物理存储块,I代表有效,O代表无效;然后再把缓存元数据状态表的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标志位设置为
unlocko
[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]若无效,则该表项对应的地址还没读入数据,为该表项内所有无效的物理存储块位置,申请
当前第3页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1