发明内容
为了克服已有NAND Flash存储器的管理方法的软件效率低、对物理块的使用频率无法规划、使用寿命低的不足,本发明提供一种软件综合效率高、实现物理块的均衡使用、延长存储器的使用寿命的NAND Flash存储器的动态管理方法。
本发明解决其技术问题所采用的技术方案是:
一种NAND Flash存储器的动态管理方法,所述动态管理方法包括以下步骤:
1)、初始化时检测NAND Flash存储器,排除所有的坏块;
2)、初始化时建立逻辑映射表,扫描NAND Flash存储器,将已经存在逻辑编号的物理块号添加到逻辑映射表的对应表项中,其余逻辑映射表表项保持空;
3)、初始化时建立空物理块表和表指针,扫描NAND Flash存储器,将没有逻辑编号的物理块的块号添加到空物理块表中,并且始终保持一定数量的空物理块作为备份,保证空物理块表不空;
4)、初始化时建立垃圾块表和表指针,扫描NAND Flash存储器,将标记为无效的物理块的块号添加到垃圾块表中;
5)、写空逻辑块时,从空物理块表中取一个空物理块添加到逻辑映射表表项中,再将数据写到刚找到的空物理块中,同时更新空物理块表,在空物理块表中减少一个空物理块;
6)、修改逻辑块数据时,读逻辑块对应的物理块数据到缓存做修改,然后从空物理块表中取一个空物理块添加到同一个逻辑映射表表项中,再将缓存数据写到新找到的空物理块中,旧物理块标记为无效放到垃圾块表中,同时更新空物理块表,在空物理块表中减少一个空物理块。
作为优选的一种方案:所述动态管理方法还包括以下步骤:
7)、采用冗余区的用户字节的特殊定义判别脏数据,即定义数据记录起始和结束标记,根据两个标记是否成对出现作出判断;脏数据标记成无效而被回收。
作为优选的另一种方案:定时或空闲时间回收垃圾块,回收时直接从垃圾块表中取无效物理块,然后擦除块;同时更新空物理块表,每回收一个垃圾块,在空物理块表增加一个空物理块。
进一步,如果垃圾块数量不是0,则垃圾块表指针指向垃圾块表中的第一个垃圾块;空物理块表指针指向空物理块表中的第一个空物理块。
再进一步,始终保持一定数量的空物理块作为备份,以保证空物理块表不空,逻辑映射表能保持滚动。
本发明的技术构思为:通过设置空物理块表和垃圾块表,采用查表的方法解决动态滚动过程中的速度问题并实现垃圾块的回收。
本发明的算法是在初始化时建立一个空逻辑映射表,然后扫描器件读取每个物理块的逻辑编号,此时有两种情况:
①对于空白NAND Flash,即第一次对该闪存操作,所有物理块都没有逻辑号,读到的逻辑号均为空,则暂不对物理块分配逻辑号,逻辑映射表保持空。
②对于已经使用的NAND Flash,读取每个物理块的逻辑编号,将有逻辑编号的块添加到逻辑映射表中,而对空物理块暂时不分配逻辑号。
对应上述两种情况,系统每操作一个逻辑块,则取一个空物理块对其分配逻辑号,添加到逻辑映射表,逻辑映射表随着系统的运行逐渐填充。在修改逻辑块数据时废弃且回收旧的物理块,寻找一个新的物理块再回写。本发明在使用中按机会均等的原则寻找空物理块来分配逻辑号,每次操作都会改变逻辑映射表,这样采用的是一个动态逻辑映射表,表中的物理块是动态变化的,器件内的空物理块使用几率相同,从而达到均衡磨损的目的。
本发明的有益效果主要表现在:1、软件综合效率高;2、实现物理块的均衡使用、延长存储器的使用寿命;3、软硬件开销小、能够在成本、软件效率与使用寿命之间做良好的平衡;4、特别适合在嵌入式系统中使用。
具体实施方式
下面结合附图对本发明作进一步描述。
参照图1~图5,一种NAND Flash存储器的动态管理方法,包括以下步骤:
1)、初始化时检测NAND Flash存储器,排除所有的坏块;
2)、初始化时建立空逻辑映射表,扫描NAND Flash存储器,将已经存在逻辑编号的物理块号添加到逻辑映射表的对应表项中,其余逻辑映射表表项保持空;
3)、初始化时建立空物理块表和表指针,扫描NAND Flash存储器,将没有逻辑编号的物理块的块号添加到空物理块表中;
4)、初始化时建立垃圾块表和表指针,扫描NAND Flash存储器,将标记为无效的物理块的块号添加到垃圾块表中;
5)、写空逻辑块时,从空物理块表中取一个空物理块添加到逻辑块表项中,再将数据写到新物理块中;
6)、修改逻辑块数据时,读逻辑块对应的物理块数据到缓存做修改,然后从空物理块表中取一个空物理块添加到同一个逻辑块表项中,再将缓存数据写到新物理块中,旧物理块标记为无效放到垃圾块表中;
7)、采用冗余区的用户字节的特殊定义判别脏数据,即定义数据记录起始和结束标记,根据两个标记是否成对出现作出判断;脏数据标记成无效而被回收。
采用定时或空闲时间回收垃圾块,回收时直接从垃圾块表中取无效物理块,然后擦除块;同时更新空物理块表,每回收一个垃圾块,在空物理块表增加一个空物理块。
如果垃圾块数量不是0,则垃圾块表指针指向垃圾块表中的第一个垃圾块;空物理块表指针指向空物理块表中的第一个空物理块。
始终保持一定数量的空物理块作为备份,以保证空物理块表不空,逻辑映射表能保持滚动。
本实施例的具体工作过程为:
1.定义冗余字节:如表1,字节2作START标记,在NAND Flash中每次写一页数据的起始时刻记录,字节3作END标记,结束时刻记录,这样可以核对记录数据的完整性,判别掉电产生的脏数据;字节4作INVALID标记,写入失败或该块数据废弃则做记录成为垃圾块,等回收擦除后成为空数据块;字节5标记损坏的块;字节6、7存放块的逻辑编号。表1中字节0~3是自定义字节,其余字节按标准定义。
表1是冗余区字节定义表:
字节编号 |
数值 |
功能 |
说明 |
0~1 |
XXXX |
数据记录时间 |
标记每一个块数据的写入时间 |
2 |
0xF0 |
数据记录起始标记(START) |
用于脏数据的处理 |
3 |
0x0F |
数据记录结束标记(END) |
用于脏数据的处理 |
4 |
0 |
数据无效标记(INVALID) |
标准定义 |
5 |
非0xFF |
坏块标记(BAD) |
标准定义 |
6~7 |
|
块的逻辑编号1 |
标准定义 |
8~10 |
|
后256字节ECC校验和 |
标准定义 |
11~12 |
|
块的逻辑编号2 |
标准定义 |
13~15 |
|
前256字节ECC校验和 |
标准定义 |
表1
2.定义表和参数:
(1)定义逻辑映射表,初始值等于空(0xFFFF);
(2)定义空物理块表,表中存放空物理块的块号,初始值等于空(0xFFFF);
(3)定义垃圾块表,表中存放垃圾块的块号,初始值等于空(0xFFFF);
(4)定义空物理块数量,初始值等于0;
(5)定义垃圾块数量,初始值等于0;
(6)定义空物理块表指针,初始位置指向空物理块表的第一个表项;
(7)定义垃圾块表指针,初始位置指向垃圾块表的第一个表项;
(8)定义物理块号指针,初始位置指向NAND Flash的第一个物理块;
3.建立逻辑映射表:初始化时扫描NAND Flash,排除坏块、垃圾块及脏数据块后,读取每个物理块的逻辑编号,将有逻辑编号的块添加到逻辑映射表中,而对空物理块暂时不分配逻辑号。
4.建立空物理块表:初始化时建立空物理块表。如图1,首先读物理块号指针指向的NAND Flash物理块的冗余字节,排除坏块、垃圾块及脏数据块后,判断物理块的逻辑编号:如果逻辑编号空则找到一个空物理块,把该块号赋给空物理块表中从空物理块表指针指向的位置向后计算的第一个空表项,并且空物理块数量增1;如果逻辑编号非空,则物理块号指针增1指向下一个物理块继续寻找,重复执行上述过程,直到循环一周完成NAND Flash器件的扫描。
操作完成后空物理块表建立或更新,空物理块表指针指向第一个可用空物理块,物理块号指针指向下一次扫描位置。
5.建立垃圾块表:初始化时建立垃圾块表,该过程可以和空物理块表的建立合并在一起实施。排除坏块后,首先读物理块号指针指向的NAND Flash物理块的冗余字节4,如果是INVALID标记,则找到一个垃圾块,把该块号赋给垃圾块表中从垃圾块表指针指向的位置向后计算的第一个空表项,并且垃圾块数量增1;如果物理块非INVALID块,则物理块号指针增1指向下一个物理块继续寻找,重复执行上述过程,直到循环一周完成NAND Flash器件的扫描。
6.写空逻辑块的操作:如图2,对逻辑块执行写操作时,如果该逻辑块在逻辑映射表中的表项空,则直接到空物理块表中将空物理块表指针指向的空物理块号取出写到要操作的逻辑映射表的表项中,空物理表的表项写成空标记,同时空物理块表指针增1,指向下一个位置,空物理块数量减1,然后将逻辑块号标记到刚找到的空物理块的冗余区,之后写该物理块,结束操作过程;如果逻辑块执行写操作时该逻辑块在逻辑映射表中的表项非空,则相当于修改一个逻辑块,则进入第7步——修改数据及更新垃圾块表。
7.修改数据及更新垃圾块表:如图3,对逻辑块的数据进行修改时先将该逻辑块对应的物理块中所有的数据读到缓存区,修改完缓存区的数据后,执行图2的过程找一个空物理块,将缓存区数据回写到新找到的空物理块中,然后将旧的物理块标注为无效,并将该块号加入垃圾块表的垃圾块起始指针指向的位置向后计算的第一个空表项,垃圾块数量加1。该步骤在数据修改的同时完成垃圾块表的填充。
8.回收垃圾块及更新空物理块表:垃圾回收时直接对垃圾块表操作,每回收一个无效块空物理块表中相应增加一个空块。如图4,首先判断垃圾块表中垃圾块的数量,如果是0则没有垃圾块,结束;如果垃圾块数量不是0,则在垃圾块表中从垃圾块表指针指向的表项位置读取一个无效物理块编号,并将该表项写成空0xFFFF,然后擦除无效的物理块,下一步将该物理块号添加到空物理块表中从空物理块表指针指向的位置向后计算的第一个空表项,并且空物理块数量增1,而垃圾块起始指针加1,指向下一位置,同时垃圾块数量减1。重复执行上述过程直到垃圾块数量为0,回收结束。
9.脏数据的判别:NANDFlash在嵌入式设备中使用时由于突然掉电等原因将丢失数据,产生脏数据块。本算法能够判别脏数据并做相应的处理。
脏数据的判别利用冗余区字节2和3实现。按照表1的定义,字节2是数据记录起始标记,在开始向某一页连续写数据时,先将字节2标记为START,然后再开始一页数据的写入,并完成ECC的校验和标注,最后再将冗余区字节3标记为END,表示完成操作。如果在写页数据的过程中,由于某种原因引起系统操作停止,冗余区字节3将没有记录结束标记,此时的数据将被认为是脏数据。所以在软件中只要读取冗余字节2和3的值,就可以实现脏数据的判别。判别并处理之后可以将该块标注为INVALID而被回收。
脏数据的产生可能引起文件格式损坏,本算法由于先写后擦,根据标记的时间可以简单判断并恢复旧的数据,避免该问题。