读取数据方法以及数据写入方法
技术领域
本发明涉及数据存储领域,更具体的说,是涉及一种读取数据方法以及数据写入方法。
背景技术
目前,NAND闪存中的NFTL(NANDFlashTranslationLayer,NANDFLASH转换层)是以逻辑地址与物理块按照以块为映射,页的相对偏移原则存储数据的,在向物理块中写入数据时,写的操作必须是完全顺序的,即逻辑页第一页必须写在物理页第一页,逻辑页第二页必须写在物理页第二页,以此类推。
不支持跳写的NAND闪存,当物理页X被写入数据时,所有小于X的物理页必须已经被写过数据,如果物理块第X-1页未写入数据,而直接在物理页第X页写数据,那么该物理块中的数据位将会发生翻转,导致物理块的数据错误,这时可以先在所有小于X的空白物理页中写入一些脏数据,再在物理页第X页写数据,这样物理块中的数据位就不会发生翻转了,支持跳写的NAND闪存,如果首先在物理页X被写入数据,再需要在物理页第X-1页写入数据时,需要增加一新空闲物理块,并在增加的空闲物理块的第X-1页写入数据;NAND闪存不支持覆盖写,如果物理块中已经写满了数据,当需要对该物理块中的第X页进行修改时,即该物理块中物理页X中的数据为无效数据,需要在增加一个空闲物理块,将第X页中需要重写的数据写入新增加的空闲物理块的第X页中,在新增加的空闲物理块的物理页X中存储的数据是有效数据,而新增加的物理块的第X-1页之前都是空白页或者被写入了脏数据;NAND闪存不支持回头写,如果一空闲物理块中首先写入了逻辑页X即在物理页X写入了数据,再向物理页X-1写逻辑页X-1对应的数据时,只能新增加一物理块,在新增加的物理块的第X-1页写入逻辑页X-1,而新增加的物理块的第X-2页之前都是空白页或者被写入了脏数据。
因此,现有技术的缺点主要有:第一,不支持跳写的NAND闪存需要在小于写入页之前的空白物理页写入脏数据,第二,支持跳写的NAND闪存在进行覆盖写或者回头写以及跳写时需要进行分配新的空闲物理块,所以物理块的页使用率较低。
发明内容
有鉴于此,本发明提供了一种读取数据方法以及数据写入方法,以克服不支持跳写的NAND闪存需要在小于写入页之前的空白物理页写入脏数据,以及支持跳写的NAND闪存在进行覆盖写或者回头写以及跳写时需要进行分配新的空闲物理块,导致的物理块的页使用率较低的问题。
为实现上述目的,本发明提供如下技术方案:
一种向NAND闪存写入数据方法,包括:A1、将本次写操作需要写入的数据对应的页码转换成相应的逻辑地址与逻辑页地址;A2、确定所述逻辑地址对应的链表的当前链表头在上次写操作中最后被写入数据的物理页的最新物理地址;A3、从所述最新物理地址的下一物理页地址开始依次将所述本次写操作需要写入的数据写入物理页的数据存储区域,在每写完一物理页后,将写入这一物理页中数据对应的逻辑页地址存储至所述这一物理页的地址存储区域,每一物理页包括数据存储区域以及地址存储区域;A4、根据本次写操作中每一逻辑页地址、所述每一逻辑页地址对应的逻辑页所在的物理页的物理页地址以及所述每一逻辑页地址对应的逻辑页所在的物理块的物理块地址的对应关系,对所述链表原始的动态映射页中的逻辑页地址与物理页地址和物理块地址的对应关系进行更新,所述动态映射页存储有有效数据对应的逻辑页地址、所述有效数据对应的逻辑页地址对应的逻辑页所在的物理页的物理页地址以及所述有效数据对应的逻辑页地址对应的逻辑页所在的物理块的物理块地址的对应关系。
一种读取NAND闪存中数据的方法,包括:B1、将需要读取的数据对应的页码转换为逻辑地址与逻辑页地址;B2:确定所述逻辑地址对应的链表;B3:根据与所述链表对应的动态映射页,确定出所述需要读取的数据对应的物理块地址和物理页地址,读取所述物理块地址与物理页地址中存储的数据,所述动态映射页存储有有效数据对应的逻辑页地址、所述有效数据对应的逻辑页地址对应的逻辑页所在的物理页的物理页地址以及所述有效数据对应的逻辑页地址对应的逻辑页所在的物理块的物理块地址的对应关系。
经由上述的技术方案可知,本发明实施例公开的数据写入方法,在执行写操作时,由于逻辑页地址与该逻辑页地址对应的逻辑页所在的物理页的物理页地址与该逻辑页地址对应的逻辑页所在的物理块的物理块地址,三者的对应关系存储在动态映射页中,所以物理页地址为一的物理页中可以不写入逻辑页地址一对应的数据。对于物理页地址而言,还是需要从物理页低地址写至物理页高地址。所以在进行覆盖写、回头写及跳写时,例如,需要重新写入逻辑页地址一对应的数据(覆盖写),或者首先写入了逻辑页地址三对应的数据后,现在需要写逻辑页地址二对应的数据(回头写),或者在写入逻辑页地址二对应的数据后,需要写入逻辑页地址四对应的数据(跳写)时,如果当前链表头已经写满,则增加一新空闲物理块,但是写入的数据可以写在新增加的物理块地址为零的物理页中,并不需要写在与逻辑页地址一致的物理页中,如果当前链表头没有被写满,那么直接将需要写入的数据写入最新物理地址的下一物理页地址开始的物理页的数据存储区域,从理论上说每一物理块中的每一物理页都可以写入数据,从而提高了物理块中物理页的使用率,不支持跳写的NAND闪存,由于实现了逻辑页的跳写,并不存在也不需要物理页的跳写,所以不需要写入脏数据,从而提高了读写数据的速率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本发明实施例公开的第一种向NAND闪存写入数据方法的流程图;
图2为本发明实施例公开的第二种向NAND闪存写入数据方法的流程图;
图3为固定映射链表向转换成随机映射链表的过程示意图;
图4为本发明实施例提供的第一种在随机映射链中写入数据的方法的流程图;
图5为本发明实施例提供的第二种在随机映射链表中写入数据的方法的流程图;
图6为物理块1与物理块2中各个物理页的spareoob信息图示;
图7为本发明实施例公开的第一种读取NAND闪存中数据的方法的流程图;
图8为本发明实施例公开的第二种读取NAND闪存中数据的方法的流程图;
图9为本发明实施例公开的一种将需要读取的数据对应的页码转换为物理块地址与物理页地址的方法流程图;
图10为将实施例六与实施例七相结合的一个具体实现算法流程图;
图11为本发明实施例公开的第一种加载动态映射页的方法的流程图;
图12为本发明实施例公开的第二种加载动态映射页的方法的流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
请参阅附图1,为本发明实施例公开的第一种向NAND闪存写入数据方法的流程图,该方法可以包括:
步骤S101:将本次写操作需要写入的数据对应的页码转换成相应的逻辑地址与逻辑页地址;
假设需要写入NAND闪存的数据对应的页码为120,而NAND闪存中每一物理块有100个物理页,那么页码数数为120的数据对应的逻辑地址为1,对应的逻辑页地址为20。
步骤S102:确定上述逻辑地址对应的链表的当前链表头在上次写操作中最后被写入数据的物理页的最新物理地址,从最新物理地址的下一物理页地址开始依次将本次写操作需要写入的数据写入物理页的数据存储区域,在每写完一物理页后,将写入这一物理页中数据对应的逻辑页地址存储至所述这一物理页的地址存储区域;
每一物理页包括两个区域:数据存储区域以及地址存储区域。可以将物理页中存储的逻辑页对应的逻辑页地址存储至一个结构体中,那么地址存储区域就为该结构体的存储区域。
每一逻辑地址对应一个链表,每一链表中个各个物理块对应同一逻辑地址,即逻辑地址与链表是一一对应的。如果当前链表头共有100个物理页,物理页0-80都已经被写入数据,那么最新物理地址为80。
链表中如果包括至少两个物理块,那么最初被写入数据的物理块为链表尾,最后被写入数据的物理块为链表头,如果链表中只有一个物理块,那么该物理块既是链表头,又是链表尾。由于链表的链表头的物理块地址可能会发生变换,例如,链表的链表头被写满数据了,需要增加一新的空闲物理块,新增加的这一空闲物理块就变为链表的链表头,所以称链表的链表头为当前链表头。
空闲物理块是指每一物理页中均没有被写入数据的物理块,或者原本物理页中有数据,但是每一物理页中的数据又都被擦除,且现在每一物理页中均没有数据的物理块。
在写入数据时,需要确定当前链表头中上次写操作中最后被写入数据的物理页的物理页地址即最新物理地址,因为在写入数据时,需要以所述最新物理地址的下一物理页地址开始依次将本次写操作需要写入的数据写入物理页的数据存储区域。在每写完一物理页后,将写入这一物理页中数据对应的逻辑页地址存储至所述这一物理页中,目的是为了保存逻辑页地址与存储该逻辑页地址对应数据的物理页的物理页地址的对应关系,只有将该对应关系保存至存储该逻辑页地址对应数据的物理页中,才可以继续后续的写操作。
步骤S103:根据本次写操作中每一逻辑页地址、所述每一逻辑页地址对应的逻辑页所在的物理页的物理页地址以及所述每一逻辑页地址对应的逻辑页所在的物理块的物理块地址的对应关系,对上述链表的原始动态映射页中的逻辑页地址与物理页地址和物理块地址的对应关系进行更新。
动态映射页存储有链表中有效数据对应的逻辑页地址、所述有效数据对应的逻辑页地址对应的逻辑页所在的物理页的物理页地址以及所述有效数据对应的逻辑页地址对应的逻辑页所在的物理块的物理块地址的对应关系。动态映射页存储在内存中。
在进行覆盖写时,假设已经将逻辑页地址九对应的数据写入物理地址为二的物理页中,现在需要重新写入逻辑页地址九对应的数据,那么物理页地址为二的物理页中存储的数据为无效数据,若确定出当前链表头中最新物理地址为五,那么可以将逻辑页地址九对应的数据写入物理地址为六的物理页中,这时逻辑页地址九与物理页地址六相对应,原始的动态映射页中的逻辑页地址九与物理页地址二相对应,所以需要对原始的动态映射页进行更新。同理在写入新数据时,也需要将逻辑页地址、物理块地址与物理页地址的对应关系更新至原始的动态映射页中。
本发明实施例公开的数据写入方法,在执行写操作时,由于逻辑页地址与该逻辑页地址对应的逻辑页所在的物理页的物理页地址与该逻辑页地址对应的逻辑页所在的物理块的物理块地址,三者的对应关系存储在动态映射页中,所以物理页地址为一的物理页中可以不写入逻辑页地址一对应的数据。对于物理页地址而言,还是需要从物理页低地址写至物理页高地址。所以在进行覆盖写、回头写及跳写时,例如,需要重新写入逻辑页地址一对应的数据(覆盖写),或者首先写入了逻辑页地址三对应的数据后,现在需要写逻辑页地址二对应的数据(回头写),或者在写入逻辑页地址二对应的数据后,需要写入逻辑页地址四对应的数据(跳写)时,如果当前链表头已经写满,则增加一新空闲物理块,但是写入的数据可以写在新增加的物理块地址为零的物理页中,并不需要写在与逻辑页地址一致的物理页中,如果当前链表头没有被写满,那么直接将需要写入的数据写入最新物理地址的下一物理页地址对应的物理页中,从理论上说每一物理块中的每一物理页都可以写入数据,从而提高了物理块中物理页的使用率,不支持跳写的NAND闪存,由于实现了逻辑页的跳写,并不存在也不需要物理页的跳写,所以不需要写入脏数据,从而提高了读写数据的速率。
实施例二
请参阅附图2,为本发明实施例公开的第二种向NAND闪存写入数据方法的流程图,该方法可以包括:
步骤S200:将本次写操作需要写入的数据对应的页码转换成相应的逻辑地址与逻辑页地址;
在步骤S200之前还可以包括:
步骤S2001:判断NAND闪存中空闲物理块的数目是否大于预设阈值,如果是,则进入步骤S2002,如果否,则进入步骤S200;
步骤S2002:判断垃圾队列中是否存在垃圾链,如果是,则进入步骤S2003,如果否,则进入步骤S200;
步骤S2003:对垃圾队列中的垃圾链进行回收。
系统空闲物理块比较少的原因可能是有太多的垃圾链,所以可以根据系统当前的空闲物理块的数目与预设阈值进行比较,如果目前的空闲物理块小少于预设阈值时,则判断是否有垃圾连存在,如果有则回收垃圾链,垃圾链回收操作最好在系统开机时执行,因为这个时候用户可能不会对NAND闪存进行任何写操作,所以可以在用户感觉不到的情况下回收垃圾链,从而获得空闲物理块,如果在用户向NAND闪存中写入数据时回收垃圾链,用户可能会感觉到写操作的速度慢。
步骤S201:确定上述链表的当前链表头在上次写操作中最后被写入数据的物理页的最新物理地址;
步骤S202:判断上述逻辑地址对应的链表是否为固定映射链表,如果是,则进入步骤S203,如果否,则进入步骤S205;
步骤S201可以在步骤S202之后,只是为了画图方便所以才规定了顺序。
上述链表包括至少一个物理块,固定映射链表是指链表中的所有物理块均为固定映射块的链表,固定映射块是指每一物理页地址与写入所述每一物理页的数据对应的逻辑页地址相同的物理块。
具体的,每一链表对应一数组,该数组中的字符可以表示该链表是否为固定映射链表,假设数组中的字符为1时,表示链表为固定映射链表,数组中的字符为0时,表示链表为随机定映射链表。或者固定映射链表和随机映射链表可以使用一个位图保存,例如逻辑地址相应位为1表示固定映射链表,0为随机映射链表。随机映射链表是指至少有一物理块为随机映射块的链表,随机映射块是指至少有一逻辑页地址与存储所述逻辑页地址对应数据的物理页的物理页地址不相同。
步骤S203:判断本次写操作需要写入的数据对应的初始逻辑页地址是否比所述最新物理地址大一,如果是,则进入步骤S204,如果否,则进入步骤S205;
本步骤的目的是判断初始逻辑页地址与要写入初始逻辑页地址对应的数据的物理页的物理页地址是否相同,如果相同,那么该固定映射链表仍为固定映射链表,如果不同,固定映射链表就变为随机映射链表,此时还需要将与上述链表对应的固定映射链表标识修改为随机映射链表标识。
下面举例说明固定映射链表向转换成随机映射链表的过程。请参阅图3,图3中的固定映射块a、固定映射块b以及随机映射块c是同一物理块,该物理块一共有12个物理页,假设写入每一物理页中的数字代表写入物理页中的数据对应的逻辑页地址,固定映射块a中的每一物理页地址均与相应的逻辑页地址相同,所以为固定映射块,固定映射块b中是在固定映射块a的基础上又在物理页地址10中写入了逻辑页地址10的数据,所以该物理块仍为固定映射块,随机映射块c是在固定映射块b的基础上在物理页地址11中写入了逻辑页地址5对应的数据,所以该物理块由固定映射块转变为随机映射块,该物理块所在的链表也由固定映射链表转变为随机映射链表。由于在一次写操作中需要写入的逻辑页一定是连续的,例如逻辑页三、逻辑页四以及逻辑页5,所以可以一次写入。
步骤S204:从最新物理地址的下一物理页地址开始依次将本次写操作需要写入的数据写入物理页的数据存储区域,在每写完一物理页后,将写入这一物理页中数据对应的逻辑页地址存储至所述这一物理页的地址存储区域,结束本次写操作。
固定映射链中由于物理页地址与逻辑页地址相同,所以不需要动态映射页。不论是固定映射块还是随机映射块,都需要保存一些必要的信息,以方便在读写数据时能更快的建立所需要的信息,在每一物理页中都会保存的信息是:参数BlkLogicAddr,该参数表示物理页中存储的数据对应的逻辑页地址,该参数的名称并不一定为BlkLogicAddr,可以为其它。物理页地址零中还包括物理块对应的逻辑地址的参数,这个参数可以在物理页地址零对应的物理页中,也可以在其它物理页中,在此不作具体限定。
步骤S205:从最新物理地址的下一物理页地址开始依次将本次写操作需要写入的数据写入物理页的数据存储区域,在每写完一物理页后,将写入这一物理页中数据对应的逻辑页地址存储至这一物理页的地址存储区域,并进入步骤S206。
步骤S205中依次写入本次写操作需要写入的数据具体可以包括:
A1、判断当前链表头是否被写满,如果是,则进入步骤A2,如果否,则从最新物理地址的下一物理页地址开始依次将本次写操作需要写入的数据写入物理页的数据存储区域,并在写入的过程中返回步骤A1判断当前链表头是否被写满;
A2、为链表增加一空闲物理块,将需要写入的数据写入增加的空闲物理块中,新增加的空闲物理块为当前链表头。
在当前链表头中写入数据时,首先判断当前链表头是否有可以写入数据的空白物理页,如果否,则直接增加一空闲物理块,如果是,则直接将数据写入空白物理页中,如果当前链表头中剩余的空白物理页的页数不足够保存要写的数据对应的页数,将先将当前链表头写满,再为链表重新分配一个空闲物理块,然后将剩余的数据写入重新分配的空闲物理块中。
空白物理页是指没有存储数据的物理页。
步骤S205与步骤S204不同,由于步骤S204中的链表为固定映射链,当前链表头也为固定映射块,所以在当前物理块中可以写完需要写入的数据,如果当前物理块中写不完需要写入的数据,那么在增加一新空闲物理块后,向增加的这一空闲物理块中写入数据时,逻辑页地址与物理页地址肯定不相同,那么固定映射链就转换成随机映射链了,所以步骤S204中不需要增加新的空闲物理块。
在步骤S205之后,步骤S206之前还可以包括:
C1、判断上述链表中的物理块个数是否大于预设物理块值,如果是,则进入步骤C2,如果否,则进入步骤S206;
C2、将上述链表添加至垃圾队列,选择一空闲物理块,并将上述链表中的有效数据写入选择的空闲物理块中,选择的所述空闲物理块为所述逻辑地址对应的链表的当前链表头,进入步骤S206。
链表被添加至垃圾队列后,该链表变为垃圾链。
步骤C1与步骤C2也可以在步骤S102与步骤S103之间。
步骤S206:根据本次写操作中每一逻辑页地址与所述每一逻辑页地址对应的逻辑页所在的物理页的物理页地址,以及所述每一逻辑页地址对应的的逻辑页所在的物理块的物理块地址的对应关系,对上述链表的原始动态映射页中的逻辑页地址、物理页地址和物理块地址的对应关系进行更新。
动态映射页存储有链表中有效数据对应的逻辑页地址与所述逻辑页地址对应的逻辑页所在的物理页的物理页地址,以及所述逻辑页地址对应的逻辑页所在的物理块的物理块地址。
在进行读写数据时,由于需要对随机映射链中的每一逻辑页地址、物理页地址以及物理块地址进行索引,所以引入动态映射页,用动态映射页保存随机映射链中所有的逻辑页地址、物理页地址和物理块地址的对应关系,即某个逻辑页的数据存储在哪个物理块的那个物理页中。
动态映射页中逻辑页地址、物理页地址和物理块地址的对应的关系的数据结构可以但不限定为:
Typedefstructtag_Akmtd_Nand_pageinfo
{
FakeAddr;//逻辑页所在的物理块的物理块地址
PageAddr;//逻辑页所在物理页的物理页地址
}本数据结构中并没有定义各个变量的类型,由于各个变量的类型不影响本发明实施例的实现,所以在此不作具体限定。
本发明实施例,不仅仅有实施例一中的有益效果,而且在向链表中写入数据时,先判断该链表是否为固定映射链表,如果是,则直接向当前链表中写入数据,如果否,则向当前链表中写入数据后,还需要将动态映射页中的对应关系进行那个更新,由于只有随机映射链表才具有动态映射页,所以节省了内存空间。
实施例三
请参阅图4,为本发明实施例提供的第一种在随机映射链中写入数据的方法的流程图,该方法可以包括:
步骤S401:确定随机映射链的当前链表头中当前写操作需要写入数据对应的初始逻辑页对应的第一当前最新物理地址,判断第一当前最新物理地址是否是预设关键信息页的倍数,如果是,则进入步骤S402,如果否,则进入步骤S404;
关键信息页存储有该关键信息页所在物理页的物理页地址之前的每一有效物理页地址与所述每一有效物理页存储的数据对应的逻辑页地址的对应关系,有效物理页地址是指存储的数据是有效数据的物理页对应的物理页地址。
由于随机映射链表中物理页地址、逻辑页地址与物理块地址的对应关系为随机状态,因为有某些系统内存中并不能保存所有随机映射链内的物理页地址、逻辑页地址与物理块地址的对应关系即动态映射页,所以引入关键信息页,以便为了更加快速的加载动态映射页。
若本次写操作中没有写入数据,那么第一当前最新物理地址等于最新物理地址加一,如果本次写操作中已经写入了部分数据,那么第一当前最新物理地址是指本次写操作中前一次在当前链表头中最后被写入数据的物理页的物理地址加一。预设关键信息页的间隔值可以根据实际情况而定,例如物理页地址为32的倍数的物理页为关键信息页,则预设关键信息页的间隔值为31。
步骤S402:从第一当前最新物理地址对应的物理页开始,按照物理页地址由高至低依次遍历各个物理页中的地址存储区域,直至遍历至与第一当前最新物理地址最近的关键信息页;
由于关键信息页中存储有该关键信息页所在物理页的物理页地址之前所有物理页地址与其相应的逻辑页地址的对应关系,所以遍历至与第一当前最新物理地址最近的关键信息页就相当于遍历了所有的物理页,这样可以节省遍历物理页的时间。
步骤S403:将遍历的每一逻辑页地址与存储所述每一逻辑页地址对应的数据的物理页的物理页地址的对应关系,存储至物理页地址为第一当前最新物理地址的物理页中;
步骤S404:确定当前链表头在当前写操作需要写入数据的对应的初始逻辑页地址对应的第二当前最新物理地址,计算从所述第二当前最新物理地址至需要写入下一关键信息页时,所需的物理页页数NUM1;
如果是由步骤S401转向的步骤S404,那么第二当前最新物理地址等于第一当前最新物理地址,如果是由步骤S403转向的步骤S404,那么第二当前最新物理地址等于第一当前最新物理地址加一。
假设每一物理块中共有20个物理页,第二当前最新物理地址为5,预设关键信息页的间隔值为6,即物理页地址为7的倍数的物理页为关键信息页,当前写操作需要写入数据的逻辑页页数为5,与第二当前最新物理地址为5最近的关键信息页所在物理页地址为零,那么下一关键信息页所对应的物理页地址为7,所以NUM1=2。
步骤S405:判断所需的物理页页数NUM1是否不小于当前需要写入NAND闪存中的逻辑页页数NUM2,如果是,则进入步骤S406,如果否,则进入步骤S407;
步骤S406:从所述当前链表头中物理页地址为所述第二当前最新物理地址开始依次写入需要写入的数据,并进入步骤S408;
步骤S407:从所述当前链表头中物理页地址为所述第二当前最新物理地址开始依次写入所述当前需要写入NAND闪存中的NUM1个逻辑页对应的数据,并返回步骤S401;
仍以步骤S404中的举例进行说明,由于NUM2=5,NUM1=2,所以只能写入NUM1个逻辑页的数据。
步骤S408:根据本次写操作中每一逻辑页地址、所述每一逻辑页地址对应的逻辑页所在的物理页的物理页地址以及所述每一逻辑页地址对应的逻辑页所在的物理块的物理块地址的对应关系,对上述链表的原始动态映射页中的逻辑页地址、物理页地址和物理块地址的对应关系进行更新。
本发明实施例中,因为有某些系统内存中并不能保存所有随机映射链内的物理页地址、逻辑页地址与物理块地址的对应关系即动态映射页,所以引入关键信息页,以便为了更加快速的加载动态映射页。
实施例四
请参阅图5,为本发明实施例提供的第二种在随机映射链表中写入数据的方法的流程图,该步骤可以包括:
步骤S501:确定随机映射链表的当前链表头在当前写操作需要写入数据对应的初始逻辑页对应的第一当前最新物理地址,判断第一当前最新物理地址是否等于零,如果是,则进入步骤S504,如果否,则进入步骤S502;
步骤S502:判断第一当前最新物理地址是否是预设关键信息页的倍数,如果是,则进入步骤S503,如果否,则进入步骤S506;
步骤S503:判断物理页地址为第一当前最新物理地址的物理页与离其最近的关键信息页之间的物理页中存储的数据对应的逻辑页连续段的段数,是否超过预设逻辑页连续段的段数值,如果是,则进入步骤S504,如果否,则进入步骤S506;
逻辑页连续段是指物理地址由小到大顺序相邻的物理页中存储的数据对应的逻辑页的逻辑页地址也是由小到大顺序相邻,逻辑页连续段至少由一个物理页组成。假设两个相邻的关键信息页之间共有5个物理页,如果物理页1(表示物理页地址为1的物理页中,为了方便才这样写,后面的写法类似的意义相同)中存储逻辑页2(表示逻辑页地址2对应的数据,为了方便才这样写,后面写法类似的意义相同)、物理页2中存储逻辑页3、物理页3中存储物理页1、物理页4中存储逻辑页5以及物理页5中存储逻辑页4,那么逻辑页段的段数为4段,因为逻辑页2与逻辑页3是连续的,其他页都不是连续的。步骤S504:从第一当前最新物理地址对应的物理页依次往前遍历各个物理页的物理页地址与其对应的逻辑页地址的对应关系,直至遍历至与第一当前最新物理地址最近的关键信息页;
步骤S505:将遍历的每一逻辑页地址与所述每一逻辑页地址对应的逻辑页所在的物理页的物理页地址的对应关系存储至物理页地址为第一当前最新物理地址的物理页中;
关键信息页可以只包括数据存储区域,不用包括地址存储区域。
步骤S506:确定当前链表头在当前写操作需要写入数据的初始物理页的第二当前最新物理地址,计算从第二当前最新物理地址至需要写入下一关键信息页时,所需的物理页页数NUM1;
步骤S507:判断所需的物理页页数NUM1是否不小于当前需要写入NAND闪存中的逻辑页页数NUM2,如果是,则进入步骤S508,如果否,则进入步骤S509;
步骤S508:从当前链表头中物理页地址为第二当前最新物理地址开始依次写入需要写入的数据,并进入步骤S510;
步骤S509:从当前链表头中物理页地址为第二当前最新物理地址开始依次写入所述当前需要写入NAND闪存中的NUM1个逻辑页对应的数据,并返回步骤S501。
步骤S510:根据本次写操作中每一逻辑页地址、所述每一逻辑页地址对应的逻辑页所在的物理页的物理页地址以及所述每一逻辑页地址对应的逻辑页所在的物理块的物理块地址的对应关系,对上述链表的原始动态映射页中的逻辑页地址、物理页地址和物理块地址的对应关系进行更新。
本发明实施例中,必须将物理页地址为零的物理页作为关键信息页,若某一物理页地址为预设关键信息页的倍数,但是该物理页与离其最近的关键信息页之间的逻辑页连续段的段数比预设逻辑页连续段的段数值小,则说明该物理页与离其最近的关键信息页之间的逻辑页的连续性较好,所以不需要将该物理页最为关键信息页,可以直接在该物理页中写入数据,相当于节省了一个物理页,从而提高了物理页的使用率。上述各个实施例中的每一物理页中可以包含如下参数,可以将这些信息统称为spareoob信息,spareoob信息可以方便在读写数据或者开机时能更快的建立所有需要的支撑系统运行的信息:参数PageFlags,最高位表示是关键信息页还是普通的存储数据的物理页(假设0表示普通的存储数据的物理页,1表示关键信息页),低位表示该物理块在逻辑链上层数;参数GarbageTime,记录该物理块被放入垃圾队列的次数,被放入垃圾队列一次此值将被加一,该参数可以只存在物理页地址零对应的物理页中,并且该参数只在该物理块被放入垃圾队列时才被使用;参数BlkLogicAddr,物理地址为零的物理页中的该参数表示此物理块对应的逻辑地址,其它物理页中的该参数表示物理页对应的逻辑页地址;参数EraseTimeOrContinuePage:如果是物理页地址为零的物理页该参数表示该物理块被擦除的次数EraseTime,其它物理页中的该参数表示前面有多少个页是连续的ContinuePage;参数RSV,表示预留空间。
参数GarbageTime的作用,假设系统中允许的链表最多包括2个物理块,当链表A包括3个物理块时,需要将链表A中的数据搬移至新的空闲物理块中,新的空闲块组成的链表为链表B,并将原来链表A放入垃圾队列中,如果在数据搬移过程中掉电了,在上电后由于链表A中参数GarbageTime比链表B中的参数GarbageTime值大,所以链表B中的数据为最新的数据。
参数RSV是为了以后进行修改使用,由于有预留空间所以不必修改内部的数据结构,从而使NAND闪存有更好的兼容性。
每一个物理页中必须有参数BlkLogicAddr,其他的参数可以有也可以没有,可以有其中的一个或者任意几个的组合都不影响本发明实施例实现,所以每一物理页中到底有几个参数,这里不做具体限定。上述参数的名称是根据各个参数的含义用英文缩写定义的,但是并不限制于此。
可以将上述的参数封装在一个结构体中。
如图6所示,为物理块1与物理块2,物理块1中物理页5中的spareoob信息为:物理页5不是关键信息页而是普通的存储数据的物理页,物理页5所在的物理块被放入垃圾队列的次数为0,由于物理块1的前一物理块地址为END,所以物理块1是链表尾,连续页页数为5。物理块2中的物理0为关键信息页,关键信息页中其他参数的功能可以不用关心。
每一物理页中有了上述参数,在系统启动时,如果系统在上次掉电不是正常的掉电,那么可以从根据物理页中的spareoob信息还原上次掉电前的信息,读每一物理页中的spareoob信息,其实就是读取驱动的NAND,驱动会返回读写的成功以及失败的状态,如果返回成功状态,则当前读取的物理页所在的物理块是可以正常被读物数据的物理块即好块,如果返回失败状态,则说明当前读取的物理页所在物理块为坏块,即不能正常被读物数据的物理块,并标记该物理块是坏块,在下次读读取数据时,就不会读取这一物理块中的数据了,或者对坏块进行修复。
上述实施例详细说明了如何在NAND闪存写数据,对于本发明实施例中写入数据的方法可采用多种读取数据的方法,因此本发明还公开了几种读取数据的方法,下面给出具体的实施例进行详细说明。
实施例五
请参阅图7,为本发明实施例公开的第一种读取NAND闪存中数据的方法的流程图,该方法可以包括:
步骤S701:将本次读操作需要读取的数据对应的页码转换为逻辑地址与逻辑页地址;
步骤S702:确定所述逻辑地址对应的链表;
步骤S703:根据与所述链表对应的动态映射页,确定出所述需要读取的数据对应的物理块地址和物理页地址,读取所述物理块地址与物理页地址中存储的数据。
动态映射页中存储有链表中有效数据对应的逻辑页地址、所述有效数据对应的逻辑页地址对应的逻辑页所在的物理页的物理页地址以及所述有效数据对应的逻辑页地址对应的逻辑页所在的物理块的物理块地址的对应关系。
本发明实施例写入NAND闪存中数据的方法与实施例一中的方法一致,所以读取数据时,可以先获得需要读取数据对应的物理页地址以及物理块地址,这样就可以从相应的物理块地址与物理页地址读取数据了。实施例六
请参阅图8,为本发明实施例公开的第二种读取NAND闪存中数据的方法的流程图,该方法可以包括:
步骤S800:将需要读取的数据对应的页码转换为逻辑地址与逻辑页地址;
步骤S801:确定上述逻辑地址对应的链表;
步骤S802:根据与链表对应的动态映射页,确定出初始逻辑页对应的物理块地址与物理页地址;
步骤S803:根据需要读取的初始逻辑页地址与需要读取的逻辑页的总数,得到需要读取的结束逻辑页地址;
步骤S804:将物理连续页设置为零;
步骤S805:判断下一逻辑页与初始逻辑页是否在同一物理块中以及所述下一逻辑页对应的物理页地址是否比初始逻辑页对应的物理页地址大一,如果是,则进入步骤S807,如果否,则进入步骤S808;
步骤S805只是在比较下一逻辑页与初始逻辑页时,才执行其他时候不执行。
步骤S806:判断下一逻辑页与当前需要读取数据的逻辑页是否在同一物理块中以及所述下一逻辑页对应的物理页地址是否比当前需要读取数据的逻辑页对应的物理页地址大一,如果是,则进入步骤S807,如果否,则进入步骤S809;
本步骤是为了判断从初始逻辑页开始共有几个连续页,即参数ContinuePage的值。
步骤S807:将所述物理连续页加一,并判断所述下一逻辑页地址是否大于所述结束逻辑页地址,如果否,则所述下一逻辑页为当前需要读取数据的逻辑页,并返回步骤S806,如果是,则进入步骤S809;
步骤S808:将物理连续页设置为一;
步骤S809:从初始逻辑页开始读取所述物理连续页个逻辑页中的数据。
本发明实施例,如果读取的逻辑页数很多,可以先判断需要读取的逻辑页是否连续,可以一次读取ContinuePage个逻辑页的数值,这样就可以减少读取数据的时间。例如需要读取逻辑页0至逻辑页3中的数据,那么判断逻辑页0至逻辑页3中的数据是否连续,如果逻辑页0中的数据存储于物理页1中,逻辑页1中的数据存储与物理页2中,逻辑页2中的数据存储于物理页4中,逻辑页3中的数据存储与物理页3中,那么逻辑页0与逻辑页1是连续的。
实施例七
请参阅图9,为本发明实施例公开的一种将需要读取的数据对应的页码转换为物理块地址与物理页地址的方法流程图,该方法可以包括:
步骤S901:将需要读取的数据对应的页码转换为逻辑地址与逻辑页地址;
步骤S902:根据需要读取的初始逻辑页地址与需要读取的逻辑页的总数,得到需要读取的结束逻辑页地址;
步骤S903:判断所述逻辑地址对应的链表是否为固定映射链表,如果是,则进入步骤S904,如果否,则进入步骤S907;
链表包括至少一个物理块,固定映射链表是指链表中的所有物理块均为固定映射块,固定映射块是指每一物理页地址与写入所述每一物理页的数据对应的逻辑页地址相同的物理块。
步骤S904:判断初始逻辑页是否大于链表的当前链表头的最新物理地址,如果否,则进入步骤S905,如果是,则进入步骤S906;
最新物理地址是指当前链表头在上次写操作中最后被写入数据的物理页的物理页地址。
步骤S905:初始逻辑页对应的物理块地址为当前链表头的物理地址,初始逻辑页对应的物理页地址为初始逻辑页对应的逻辑页地址,结束。
由于链表为固定映射链,所以逻辑页地址与物理页地址是相同的,如果物理块中有90个物理页,物理页地址由0至99,逻辑页0对应的数据写在物理页0中,逻辑页1对应的数据写在物理页1中,以此类推,所以如果链表中如果有两个物理块,必定是链表尾被写满了,如果链表头也被写满数据,说明链表尾存储的数据已经是无效数据了,可以将链表尾舍弃,所以在一个固定映射链中最多有两个物理块。
步骤S906:初始逻辑页对应的物理块地址为链表的链表尾的物理地址,初始逻辑页对应的物理页地址为初始逻辑页对应的逻辑页地址,结束。
步骤S907:判断所述链表是否存在与所述链表对应的动态映射页,如果否,则进入步骤S908,如果是,则进入步骤S909;
步骤S908:将链表中每一有效物理页地址与所述每一有效物理页存储数据对应的逻辑页的逻辑页地址以及所述每一有效物理页所在的物理块的物理块地址的对应关系加载至与所述链表对应的动态映射页中;
有效物理页地址是指存储的数据为有效数据的物理页的物理页地址。
步骤S909:从动态映射页中获取初始逻辑页对应的物理块地址与物理页地址。
有可能需要读取的逻辑页对应的数据并没有写入NAND闪存中,这时在动态映射页中该逻辑页地址对应的物理页地址为0xff,物理块地址为0xff。当然也可以是其他数值,位数也不一定是16位。
为了进一步说明实施例六与实施例七,下面将写出一个具体的算法,由于编程语言有很多种,在此只写出一种但并不代表本发明实施例保护的范围仅限于此。
请参阅图10,为将实施例六与实施例七相结合的一个具体实现算法流程图。
图中各个变量的含义如下:Logpage表示要读的初始逻辑页地址,PageNum表示要读取的逻辑页总数,EndLogPage表示要读的结束逻辑页地址,PreBlock表示前一个需要读取的逻辑页所在的物理块的物理块地址,PreFirstPage表示前一个逻辑页对应的物理页地址,ContinuePage表示目前有多少个页是从PreFirstPage开始连续的。
步骤S1001:获得需要读取数据对应的页码所在的逻辑块的逻辑地址LogBlk和逻辑页的逻辑页地址LogPage;
步骤S1002:为变量赋值:EndLogPage=LogPage+PageNum,PreBlock=0xFFFF,PreFirstPage=0xFFFF,ContinuePage=0;
步骤S1003:根据逻辑地址LogBlk和逻辑页的逻辑页地址LogPage,获得对应的物理块地址与物理页地址,并将物理块地址保存至CurBlock中,将物理页地址保存至CurPage中;
步骤S1004:判断(PreBlock!=CurBlock||PreFirstPage+ContinuePage!=CurPage),如果是,则进入步骤S1005,如果否,则进入步骤S1011;
步骤S1005:判断PreBlock!=0xFFFF,如果是,则进入步骤S1006,如果否,则进入步骤S1007;
步骤S1006:从PreFirstPage到PreFirstPage+ContinuePage读ContinuePage个连续页,进入步骤S1009;
步骤S1007:判断ContinuePage!=0,如果是,则进入步骤S1008,如果否,则进入步骤S1009;
步骤S1008:该逻辑页的数据未写入物理页中,将0xff赋值给CurBlock以及CurPage;
步骤S1009:PreBlock=CurBlock,PreFirstPage=CurPage,ContinuePage=1;
步骤S1010:LogPage++;
步骤S1012:判断LogPage<EndLogPage,如果是,则返回步骤S1003,如果否,则进入步骤S1013;
步骤S1013:判断ContinuePage==0,如果否,则进入步骤S1014,如果是,则进入步骤S1015;
步骤S1014:从PreFirstPage到PreFirstPage+CuntinuePage读取ContinuePage个页,进入步骤S1015;
步骤S1011:ContinuePage++,进入步骤S1010;
步骤S1015:结束。
实施例八
理论上每个随机映射链都会有一个动态映射页,但是考虑到内存不够的情况,可以在内存中存储几个常用的链表对应的动态映射页,这时就需要判断内存中的各个动态映射页是否是经常使用的,如果在内存中并没有某个经常使用的链表对应的动态映射页,此时可以加载所述某个经常使用的链表对应的动态映射页至内存中,并将内存中不经常使用的动态映射页删除。如果内存足够大,可以将所有的链表对应的动态映射页存储至内存中。
请参阅图11,为本发明实施例公开的第一种加载动态映射页的方法的流程图,该方法可以包括:
步骤S1101:从链表的最新物理地址开始按照物理地址由大至小依次往前遍历各个物理页中的地址存储区域;
步骤S1102:判断遍历的当前物理页是否为关键信息页,如果是,则进入步骤S1103,如果否,则进入步骤S1104;
关键信息页存储有该关键信息页所在物理页地址之前的每一有效逻辑页地址与所述每一有效逻辑页地址对应的逻辑页所在的物理页的物理地址的对应关系。
步骤S1103:将当前物理页存储的数据加载至动态映射页中,加载动态映射页结束;
步骤S1104:将当前物理页的物理页地址与当前物理页存储的数据对应的逻辑页地址以及当期物理页所在的物理块地址的对应关系加载至动态映射页中,并获取需要遍历的下一物理页,返回步骤S1102。
在加载动态映射页时,通过关键信息页可以更快的加载动态映射页。
实施例九
请参阅图12,为本发明实施例公开的第二种加载动态映射页的方法的流程图,该方法可以包括:
步骤S1201:从链表的最新物理地址对应的物理页依次往前遍历各个物理页;
步骤S1202:判断遍历的当前物理页是否为关键信息页,如果是,则进入步骤S1203,如果否,则进入步骤S1204;
步骤S1203:将当前物理页存储的数据加载至动态映射页中,加载动态映射页结束;
步骤S1204:将当前物理页中存储数据对应的逻辑页地址与当前物理页地址和所述当前物理块所在物理块的物理块地址的对应关系加载至动态映射页中;
步骤S1205:确定从当前物理页开始逻辑页连续段的页数N,并将所述逻辑页连续段中各个逻辑页地址与存储所述逻辑页对应数据的物理页的物理页地址以及所述存储所述逻辑页对应数据的物理页所在物理块的物理块地址的对应关系加载至动态映射页中;
逻辑页连续段是指物理地址由小到大顺序相邻的物理页中存储的数据对应的逻辑页的逻辑页地址也是由小到大顺序相邻。
具体的,每一物理页中存储有参数EraseTimeOrContinuePage,如果是物理块中的第一个物理页那么该参数表示块的擦除次数,其它物理页中该参数表示前面有多少个页是连续的,例如物理页0中存储有逻辑页0对应的数据、物理页1中存储有逻辑页6对应的数据、物理页2中存储有逻辑页1对应的数据、物理页3中存储有逻辑页2对应的数据、物理页4中存储有逻辑页3中的数据、物理页5中存储有逻辑页5中的数据,那么物理页1中该参数等于0、物理页2中该参数等于0、物理页3中该参数等于1、物理页4中该参数等于2、物理页5中该参数等于0。所以根据该参数可知逻辑页连续段的页数N,如果N大于等于1,则说明前一物理页肯定不是关键信息页。
步骤S1206:当前物理页对应的物理页地址减去N+1,获得下一个需要遍历的物理页,并返回步骤S1202。
本发明实施例中,不仅仅具有实施例八的有益效果,而且由于让当前物理页对应的物理地址减去N+1,这样获得的物理页地址对应的物理页可能是关键信息页。减小了遍历次数,加快了读取速度。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。