专利名称:一种NandFlash缓冲管理方法
技术领域:
本发明涉及一种NandFlash緩冲管理方法,特别是一种利用散列链表数组 和多个緩存单元配合管理NandFlash緩冲的方法。
背景技术:
NandFlash作为 一种常用的非易失性闪存已被广泛地应用在各种数码产品 中。系统对NandFlash的访问速度是影响整个产品性能的重要因素,NandFlash 的结构是以块为单位的,每个块包含固定大小的页,每个页包括固定大小的比 特值。
系统对NandFlash访问的常用方法有两种
直接访问,即没有系统緩存单元,直接的驱动NandFlash进行读写。这种 做法虽然简单,易于实现,但缺点明显。由于NandFlash修改某个比特时,只 能从1修改为0,即便是对一个比特的修改也需要将该比特所在整个块擦除, 再重新写入。所以在这种方式中,往块A中写入数据的流程如图1所示,先申 请一个块大小的连续内存空间緩存,将要写入到块A中的数据对应的写入到緩 存中,对块A执行块擦除操作,然后将緩存写回到块A。不难看出这种方法效 率很低。
另 一个方法是系统申请一个块大小的连续内存空间緩存,并保留与緩存中 数据对应的块号A,执行读出写入块B的某些数据的操作。具体来说,系统首 先判断待读出或写入的块B的块号与緩存中的块号A是否相同,如果相同则直 接在緩存中读出数据,如果A与B不相同,则将块緩存中的数据写回到块号A 所对应的物理块上,并将块B中的数据读出写入到多爰存中,此过程分别如图2、 图3所示。在此种方法中,无论读写操作,系统都先访问緩存,判断緩存内容 是否为需要的数据,如果是则直接使用緩存中的数据,如果不是则将緩存中的 数据写回其对应的物理块中再将块B的内容写入緩存。
这样的操作虽然减少了反复擦除NandFlash块的操作,但是如果遇到系统 频繁访问NandFlash,并且访问区域分布于不同的块上,这样筒单的读写方法不 能满足需求。
发明内容
有鉴于此,本发明的目的在于提供一种NandFlash緩冲管理方法,能较好 的提高緩存的访问效率,力口快系统对NandFlash的访问速度,提高系统的整体 性能。
为了达到上述目的,本发明一种NandFlash緩冲管理方法,包括 在内存中建立一个与NandFlash物理块地址——对应的《连表数组; 在内存中开辟多个緩存单元用于緩存NandFlash中的数据;和 根据所述链表数组与多个緩存单元配合对NandFlash进行读写操作。 进一步地,所述多个緩存单元由一个链表头采用双向链表的形式链接成数
据链表;所述链表数組包括链表索引数组,用于在链表数组中定位对应的
NandFlash物理地址,链表数组中的数据所对应的NandFlash物理地址与同 一个
NandFlash物理地址在链表数组中相应的元素对应。
进一步地,在读写操作中,将写入数据的緩存单元通过指针链入NandFlash
物理地址对应的链表凄t组中,^"改该写入数据的緩存单元的单元修改标记,所
述单元修改标记用于标识该緩存单元是否被修改过。
进一步地,根据最近最少使用原则将写入数据的緩存单元移动到链表头后
面紧挨链表头的位置。
进一步地,在读写过程中,将緩存单元内的数据与该数据在NandFlansh上
对应的物理块关联,当緩存单元内数据被修改且有新的数据需要写入该緩存单
元中的时候,将该緩存单元中的旧有数据写回其对应的物理块中。 进一步地,所述方法在读NandFlash操作的过程包括 步骤101, 计算出待读出NandFlash数据所在物理块的物理地址在链表数
组中链表索引数組的位置;
步骤102,根据链表索引数组的位置查找判断链表数组中是否包含所述待
读出数据,如果不包含则执行步骤103;
步骤103,判断数据链表是否包括空闲緩存单元,如果不包含则执行步骤
104;
步骤104, 取链表头前面一个緩存单元为目标緩存单元,执行步骤105;
步骤105,判断所述目标緩存单元的单元修改标记是否为修改过,如果修 改过将该緩存单元中的旧有数据写回其对应的NandFlash物理块中,执行步骤 106,否则直接执行步骤106;
步骤106, 从所述物理块中将待读出数据读入到所述目标緩存单元中,同 时修改目标緩存单元的单元修改标记为没有修改过并执行步骤107;
步骤107, 将所述目标緩存单元链接到数据链表头的后紧邻链表头的位 置,执行步骤108;
步骤108, 计算出待读出NandFlash数据所对应的物理块在链表数组中的 链表索引数组的位置,将目标緩存单元链入到计算出的链表索引数组所对应的 链表的末尾并执行步骤110;
步骤110, 从目标緩存单元中读出数据到指定的位置。
进一步地,在步骤102中,如果包含所述待读出数据,则执行步骤109;
步骤109,将该緩沖区在双向数据链表中的位置移动到链表头的后一个。
进一步地,在步骤103中,如果包括空闲緩存单元,则将空闲緩存单元设 为目标緩存单元并执行步骤107。
进一步地,所述方法在写NandFlash操:作的过程包括
步骤201, 计算出待写入NandFlash数据所在物理块的物理地址在链表数 组中链表索引数组的位置;
步骤202,根据链表索引数组的位置查找判断链表数组中是否包含所述待 读出数据,如果不包含则执行步骤203;
步骤203,判断数据链表是否包括空闲緩存单元,如果不包含则执行步骤
204;
步骤204, 取链表头前面一个緩存单元为目标緩存单元,执行步骤205;
步骤205,判断所述目标緩存单元的单元修改标记是否为修改过,如果修 改过将该緩存单元中的旧有数据写回其对应的NandFlash物理块中,执行步骤 206,否则直接执行步骤206;
步骤206, 从所述物理块中将待写入数据读入到所述目标緩存单元中,同
时修改目标緩存单元的单元修改标记为没有修改过并执行步骤207;
步骤207, 将所述目标緩存单元链接到数据链表头的后紧邻链表头的位 置,执行步骤208;
步骤208, 计算出待写入NandFlash数据所对应的物理块在链表数组中的 #索引数组的位置,将目标緩存单元链入到计算出的链表索引数组所对应的 链表的末尾并执行步骤210;
步骤210, 将待写入数据写入目标緩存单元中,修改目标緩存单元的单元 修改标记为修改过。
进一步地,在步骤202中,如果包含所述待读出数据,则执行步骤209;
步骤209,将该緩沖区在双向数据链表中的位置移动到链表头的后一个。
进一步地,在步骤203中,如果包括空闲緩存单元,则将空闲緩存单元设 为目标緩存单元并执行步骤207。
进一步地,所述链表索引数组位置的计算采用哈希算法,所述链表数组为 散列链表数组。
进一步地,所述方法在系统的初始化阶段包括以下步骤
分配若干緩存单元;
对每个緩存单元分配管理结构体并初始化另其指向各自的緩存单元;
分配链表索引数组并初始化,令其指向NULL;和
分配数据链表头,将所有緩存单元链入到双向数据链表中。
进一步地,所述内存中开辟緩存单元的大小为NandFlash—个或多个块的
大小,或者一个或多个页的的大小,或者一个或多个字节的大小。 进一步地,所述存储单元的大小和数量根据需要随时调整。 本发明通过采用多个緩存提高了读写效率,同时引入链表数组并且采用双
链表嵌套,提高了对緩存单元的访问效率。在数据链表中采用最近最少使用的
方法,提高了数据链表的访问效率。同时緩存单元采用更小的页或者字节长度
作为緩存单元的大小,使读写更加灵活。
图1是现有技术中简单的块写入操作流程图; 图2是现有技术中基于系统缓存的读操作示意图3是现有技术中基于系统緩存的写"t喿作示意图4为本发明一个具体的实施例中对系统初始化的流程图5为本发明 一个具体实施例中对NandFlash緩沖管理方法框图6为本发明一个具体实施例中对NandFlash进行读操作的流程图;和
图7为本发明一个具体实施例中对NandFlash进行写操作的流程图
具体实施例方式
为使本发明的目的、技术方案和优点表达得更加清楚明白,下面结合附图 及具体实施例对本发明再作进一步详细的i兌明。
本发明目的在于采用多緩存与链表数组相互嵌套提高读写效率,其步骤包
括
步骤1 ,在内存中建立一个与NandFlash物理块地址——对应的链表数组; 所述链表数组是一个包括链表索引数组的散列链表数组,其通过哈希算法 将NandFlash地址与链表数组地址——对应,在查找链表数组的时候首先通过 哈希算法算出待操作NandFlash物理块在链表索《1数组中的位置,根据链表索 引数组中的位置,具体算出链表^t组中详细的位置。
所述哈希算法为本领域技术人员的常用技术手l殳,在此不作赘述。
步骤2,在内存中开辟多个緩存单元用于緩存NandFlash中的数据;
步骤3,根据所述链表数组与多个緩存单元配合对NandFlash进行读写操作。
所述多个緩存单元由一个链表头将全部緩存单元釆用双向链表的方式串接
起来組成数据链表。下面详细介绍如何利用本发明对NandFlash进行读写操作。
在进行读写操作前,系统首先对NandFlash进行初始化,初始化的步骤如
图4所示。
步骤a,分配若干緩存单元;
步骤b,对每个緩存单元分配管理结构体并初始化另其指向各自的緩存单
元;
所述管理结构体定义方法如下 typedef struct tag_DiskBufHead {
intmodifyFlag; /*緩存单元修改标记,为0表示没有被
修改过,即緩存单元中内容与物理块上面的数据一致;为l表示緩存单元中数 据曾经被修改过,即緩存单元内容与物理块内容不一致*/
int block; /*对应的物理块编号,表明緩存单元存储的
是那个物理块中的数据*/
char*buf; /*緩存单元指针,緩存单元大小*/
struct tag_DiskBufHead *pFreePrev; /*数据链表前项517
struct tag_DiskBufHead *pFreeNext; /*数据链表后项*/
struct tag—DiskBufHead *pHashNext;/*链表数组后项*/ } TDiskBufHead, *PTDiskBufHead;
管理结构体中包括了
緩存单元的修改标记,为0表示没有被修改过,即緩存单元中内容与物理 块上面的数据一致;为1表示緩存单元中数据曾经被修改过,即緩存单元内容 与物理块内容不一致;
对应物理块编号,表明緩存单元存储的是哪个物理块中的数据,当緩存单 元中存储的内容发生变化时,所述对应物理块编号要相应修改;
緩存单元指针,指明緩存单元大小,緩存单元大小可以为一个或多个块, 可以为一个或多个页,甚至一个或多个字节。
对于修改緩存单元大小和数量的方法,只需要修改上述緩存单元分配结构 体中对应参数值进行修改即可。比如修改叶uf变量,可以改变緩存单元的大小。 緩存单元的大小和数量并不一定要在系统初始化的时候修改,在系统运行中也 可以随时改变。
步骤c,分配链表索引数组并初始化,令其指向NULL;
在初始化阶段,链表索引数组为空。
步骤d,分配数据链表头,将所有緩存单元链入到双向数据链表中。 初始化后,系统中的链表索引数组为空,所有緩存单元中没有数据。 为了使本发明更清楚,现在将NandFlash物理块、链表数组、链表索引数 组、数据链表之间的关系详细介绍一下。请参看图5所示,图5为NandFlash
緩沖管理方法框图。图中是系统运行一段时间之后的状态图。
图中所有的緩存单元都已经被写满了数据,每一个緩存单元中都记录着一
块NandFlash物理块中的内容,所有的緩存单元由链表头链接成双向数据链表, 并且遵循最近最少使用的原则,将当前使用的緩存单元链接到链表头后面紧邻 链表头的位置。如果待读写数据中的内容没有出现在数据链表中,则将链表头 前面的緩存单元提取使用,并在使用后将其链入链表头后紧邻链表头的位置。
当前使用的緩存单元在链接到链表头后面的同时,链接到NandFlash物理 地址对应的链表数组末尾。所述对应链表数组为根据NandFlash物理地址计算 出的链表索引数组所对应的链表数组。
当对NandFlash的待处理物理块进行读操作时,请参看图6所示,图6为 本发明一个具体实施例中对NandFlash进行读操作的流程图。
步骤101, 计算出待读出NandFlash数据所在物理块的物理地址在链表数 组中链表索引数组的位置;
步骤102,根据链表索引数组的位置查找判断链表数组中是否包含所述待 读出数据,如果包含则执行步骤109,否则执行步骤103;
步骤103,判断数据链表是否包括空闲緩存单元,如果包含则将空闲緩存 单元设为目标緩存单元并执行步骤107,否则执行步骤104;
步骤104, 取链表头前面一个緩存单元为目标緩存单元,执行步骤105;
步骤105,判断所述目标緩存单元的单元修改标记是否为修改过,如果修 改过将该緩存单元中的旧有数据写回其对应的NandFlash物理块中,执行步骤 106,否则直接执行步骤106;
步骤106, 从所述物理块中将待读出数据读入到所述目标緩存单元中,同 时修改目标緩存单元的单元修改标记为没有修改过并执行步骤107;
步骤107, 将所述目标緩存单元链接到数据链表头的后紧邻链表头的位 置,执行步骤108;
步骤108, 计算出待读出NandFlash数据所对应的物理块在链表数组中的 链表索引数组的位置,将目标緩存单元链入到计算出的链表索引数组所对应的 链表的末尾并执行步骤110;
步骤109,将该緩冲区在双向数据链表中的位置移动到链表头的后一个;
步骤110, 从目标緩存单元中读出数据到指定的位置。
当对NandFlash的待处理物理块进行写操作时,请参看图7所示,图7为 本发明一个具体实施例中对NandFlash进行写操作的流程图。
步骤201 , 计算出待写入NandFlash数据所在物理块的物理地址在链表数 组中链表索引数组的位置;
步骤202,根据链表索引数组的位置查找判断链表数组中是否包含所述待 读出数据,如果包含则执行步骤209,否则执行步骤203;
步骤203,判断数据链表是否包括空闲緩存单元,如果包含则将空闲緩存 单元设为目标緩存单元并执行步骤207,否则执行步骤204;
步骤204, 取链表头前面一个緩存单元为目标緩存单元,执行步骤205;
步骤205,判断所述目标緩存单元的单元修改标记是否为修改过,如果修 改过将该緩存单元中的旧有数据写回其对应的NandFlash物理块中,执行步骤 206,否则直接执行步骤206;
步骤206, 从所述物理块中将待写入数据读入到所述目标緩存单元中,同 时修改目标緩存单元的单元修改标记为没有修改过并执行步骤207;
步骤207, 将所述目标緩存单元链接到数据链表头的后紧邻链表头的位 置,执行步骤208;
步骤208, 计算出待写入NandFlash数据所对应的物理块在链表数组中的 链表索引数组的位置,将目标緩存单元链入到计算出的链表索引数组所对应的 链表的末尾并执行步骤210;
步骤209,将该緩沖区在双向数据链表中的位置移动到链表头的后一个;
步骤210, 将待写入数据写入目标緩存单元中,修改目标緩存单元的单元 修改标记为^务改过。
这样便完成了一次读或写操作。对于緩冲单元的选取采用比块更小的页或 者字节为单位,方便了上层的使用。
本发明采用链表数组和数据链表配合的方法,大大提高了 NandFlash的读 写效率,采用链表数组又省去了遍历数据链表的操作,可以快速进行定位,对 于频繁读写操作或者大緩存和大NandFlash物理空间来说效率提高更加明显。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发
明的精神和原则之内,所作的任何修改、等同替换等,均应包含在本发明的保 护范围之内。
权利要求
1. 一种NandFlash缓冲管理方法,包括在内存中建立一个与NandFlash物理块地址一一对应的链表数组;在内存中开辟多个缓存单元用于缓存NandFlash中的数据;和根据所述链表数组与多个缓存单元配合对NandFlash进行读写操作。
2. 根据权利要求1所述的方法,其特征在于,所述多个緩存单元由一个4连 表头采用双向链表的形式链接成数据链表;所述链表数组包括链表索引数组, 用于在链表数组中定位对应的NandFlash物理地址,链表数组中的数据所对应 的NandFlash物理地址与同一个NandFlash物理地址在链表数组中相应的元素 对应。
3. 根据权利要求2所述的方法,其特征在于,在读写操作中,将写入数据 的緩存单元通过指针链入NandFlash物理地址对应的链表数组中,修改该写入 数据的緩存单元的单元修改标记,所述单元修改标记用于标识该緩存单元是否 被修改过。
4. 根据权利要求3所述的方法,其特征在于,根据最近最少使用原则将写 入数据的緩存单元移动到链表头后面紧挨链表头的位置。
5. 根据权利要求3所述的方法,其特征在于,在读写过程中,将緩存单元 内的数据与该数据在NandFlansh上对应的物理块关联,当緩存单元内数据被修改且有新的数据需要写入该緩存单元中的时候,将该緩存单元中的旧有数据写 回其对应的物理块中。
6. 根据权利要求3所述的方法,其特征在于,所述方法在读NandFlash操 作的过程包括步骤101, 计算出待读出NandFlash数据所在物理块的物理地址在链表数 组中链表索引数组的位置;步骤102,根据链表索引数组的位置查找判断链表数组中是否包含所述待 读出数据,如果不包含则执行步骤103;步骤103,判断数据链表是否包括空闲緩存单元,如果不包含则执行步骤104;步骤104, 取链表头前面一个緩存单元为目标緩存单元,执行步骤105; 步骤105,判断所述目标緩存单元的单元修改标记是否为修改过,如果修 改过将该緩存单元中的旧有数据写回其对应的NandFlash物理块中,执行步骤 106,否则直接执行步骤106;步骤106, 从所述物理块中将待读出数据读入到所述目标緩存单元中,同 时修改目标緩存单元的单元修改标记为没有修改过并执行步骤107;步骤107, 将所述目标緩存单元链接到数据链表头的后紧邻链表头的位 置,执行步骤108;步骤108, 计算出待读出NandFlash数据所对应的物理块在链表数组中的 链表索引数组的位置,将目标緩存单元链入到计算出的链表索引数组所对应的 链表的末尾并执行步骤110;步骤110, 从目标緩存单元中读出数据到指定的位置。
7. 根据权利要求6所述的方法,其特征在于,在步骤102中,如果包含所 述待读出数据,则执行步骤109;步骤109,将该緩沖区在双向数据链表中的位置移动到链表头的后一个。
8. 根据权利要求6所述的方法,其特征在于,在步骤103中,如果包括空 闲緩存单元,则将空闲緩存单元设为目标緩存单元并执行步骤107。
9. 据权利要求3所述的方法,其特征在于,所述方法在写NandFlash操作 的过程包括步骤201, 计算出待写入NandFlash数据所在物理块的物理地址在链表数 组中链表索引数组的位置;步骤202,根据链表索引数组的位置查找判断链表数组中是否包含所述待 读出数据,如果不包含则执行步骤203;步骤203,判断数据链表是否包括空闲緩存单元,如果不包含则执行步骤204;步骤204, 取链表头前面一个緩存单元为目标緩存单元,执行步骤205;步骤205,判断所述目标緩存单元的单元修改标记是否为修改过,如果修 改过将该緩存单元中的旧有数据写回其对应的NandFlash物理块中,执行步骤 206,否则直接执行步骤206;步骤206, 从所述物理块中将待写入数据读入到所述目标緩存单元中,同 时修改目标緩存单元的单元修改标记为没有修改过并执行步骤207;步骤207, 将所述目标緩存单元链接到数据链表头的后紧邻链表头的位 置,执行步骤208;步骤208, 计算出待写入NandFlash数据所对应的物理块在链表数组中的 链表索引数组的位置,将目标緩存单元链入到计算出的链表索引数组所对应的 链表的末尾并执行步骤210;步骤210, 将待写入数据写入目标緩存单元中,修改目标緩存单元的单元 修改标记为+务改过。
10. 根据权利要求9所述的方法,其特征在于,在步骤202中,如果包含 所述待读出数据,则执行步骤209;步骤209,将该緩冲区在双向数据链表中的位置移动到链表头的后一个。
11. 根据权利要求9所述的方法,其特征在于,在步骤203中,如果包括 空闲緩存单元,则将空闲緩存单元设为目标緩存单元并执行步骤207。
12. 据权利要求6-11之一所述的方法,其特征在于,所述链表索引数组位 置的计算采用哈希算法,所述链表数组为散列链表数组。
13. 据权利要求2所述的方法,其特征在于,所述方法在系统的初始化阶 段包括以下步骤分配若干緩存单元;对每个緩存单元分配管理结构体并初始化另其指向各自的緩存单元; 分配链表索引数组并初始化,令其指向NULL;和 分配数据链表头,将所有緩存单元链入到双向数据链表中。
14. 根据权利要求1所述的方法,其特征在于,所述内存中开辟緩存单元 的大小为NandFlash—个或多个块的大小,或者一个或多个页的的大小,或者 一个或多个字节的大小。
15. 根据权利要求1所述的方法,其特征在于,所述存储单元的大小和数 量根据需要随时调整。
全文摘要
本发明涉及一种NandFlash缓冲管理方法通过采用多个缓存提高了读写效率,引入链表数组并且采用双链表嵌套,提高了对缓存单元的访问效率,在数据链表中采用最近最少使用的方法,提高了数据链表的访问效率。
文档编号G06F12/08GK101393537SQ20081022250
公开日2009年3月25日 申请日期2008年9月18日 优先权日2008年9月18日
发明者李栋梁, 游明琦, 国 艾 申请人:北京中星微电子有限公司