具有可擦除块单元的存储器和定位具有指针信息地块的联结指针链转让专利

申请号 : CN200680048804.2

文献号 : CN101346704B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 维克托·M·G·艾科特尼古拉斯·兰伯特

申请人 : NXP股份有限公司

摘要 :

一种具有主存储器(10)的设备,所述主存储器包括多个存储单元的物理块。所述存储器(10),例如闪存,支持每次至少一个物理块的擦除。最终指向诸如逻辑地址到物理地址地映射表的指针链(72、75)存储在主存储器中,每个指针(72、75)存储在块(70、74)的各自部分中,每个在链中的指向各自块(74)的非最终指针(72)包括在链中的下一个指针。在主存储器(10)的启动时,使用来自主存储器的指针,跟随所述指针链来定位指向信息。在正常操作时,优选地使用存储在RAM中的直接指针。

权利要求 :

1.一种操作主存储器(10)的设备,包括:

非易失主存储器(10),包括多个物理块,所述多个物理块具有多个存储单元,所述主存储器(10)支持每次擦除至少一个物理块;

映射控制电路(14)配置用于维护存储在各个块(70、74)中的指针链(72、75),指针链中指向各个块(74)的每个非最终指针(72)包括指针链中的下一指针,所述映射控制电路(14)还配置用于维护存储在至少另一块(6)中的指向信息,指针链中指向所述另一块(76)的最终指针(75)包括指向信息,所述映射控制电路(14)配置用于至少在设备启动时,通过使用来自主存储器的指针,跟随所述的指针链,来定位所述指向信息;

其中所述映射控制电路(14)配置用于多次擦除所述另一块(76),并将更新的指向信息写入到所述另一块(76),而无需更改指针(72、75),随后使用替代块代替所述另一块(76)来存储指向信息,并更改最终指针以指向所述替代块。

2.根据权利要求1所述的设备,其中所述映射控制电路(14)配置用于以另一替代块代替存储最终指针(75)的相应块(74),并更改指向存储最终指针的块(74)的非最终指针(72)以指向所述另一替代块,以比更改所述最终指针(75)低的频率更改所述非最终指针(72)。

3.根据权利要求1所述的设备,其中所述映射控制电路(14)配置用于依赖于指向信息更新的次数来动态地调整指针链的长度。

4.根据权利要求1所述的设备,其中所述映射控制电路(14)配置用于将每个指向相互不同单元的特定指针(75)的连续版本写入针对特定指针的至少一个特定块(74)中,所述映射控制电路(14)配置用于至少在设备启动时,通过在所述至少一个特定块(74)中搜索特定指针的最新版本,来恢复所述特定指针(75)的最新版本。

5.根据权利要求4所述的设备,其中所述映射控制电路(14)配置用于保留空闲块(94),当针对特定指针(75)的至少一个特定块(74)被填满时,将特定指针的新版本写入所述空闲块(94),随后擦除针对特定指针(75)的至少一个特定块(74),所述映射控制电路(14)配置用于在启动时,当所述映射控制电路(14)检测到针对特定指针(75)的至少一个特定块(74)为满或空时,在空闲块(94)中搜索特定指针(75)的最新版本。

6.根据权利要求5所述的设备,其中所述映射控制电路(14)配置用于将指向针对特定指针(75)的至少一个特定块(74)和空闲块(94)的指针一起存储在相应块(70)中。

7.根据权利要求5所述的设备,其中所述映射控制电路(14)配置用于使用所述空闲块(94)作为针对多个同时有效的指针的各个块所共用的空闲块。

8.根据权利要求1所述的设备,其中所述映射控制电路(14)配置用于维护指针树(72、72a、92、105a、105b),指针树中的最终指针(105a、b)指向包含指向信息的各个块,所述指针链是指针树的一部分,指针树中的非最终指针(72)指向共享块(74),将从指针树中的一个节点发出的不同分支的指针一起存储在共享块(74)中。

9.根据权利要求8所述的设备,其中所述映射控制电路(14)配置用于在主存储器(10)的共享块(74)中写入特定指针(105a、105b)的连续版本,其中按照依赖于特定指针(74)更新顺序的动态选择次序,将针对各分支的特定指针(105a、b)写入所述共享块(74)中的相互不同的单元,所述映射控制电路(14)配置用于至少在启动时,通过在共享块(74)中搜索特定指针(105a、105b)的最新版本,获得每个分支的特定指针(105a、b)的最新版本。

10.根据权利要求9所述的设备,其中所述映射控制电路(14)配置用于保留空闲块(94),当各个块(74)被填满时,将一个特定指针的新版本写入所述空闲块,将其它分支的指针(105a、105b)的最新版本复制到所述空闲块(94)中,并随后擦除共享块(74),所述映射控制电路(14)配置用于至少在启动时,当映射控制电路(14)检测到共享块(74)为满时,在空闲块(94)中搜索各分支的指针。

11.根据权利要求10所述的设备,所述映射控制电路(14)配置用于至少在启动时和当任何一个存储特定指针(105a、b)的块(74)为满时,测试信息是否存储在空闲块(94)中,如果是,使用来自空闲块(94)的信息代替来自己被填满的块(74)的信息。

12.根据权利要求1所述的设备,其中所述主存储器(10)是闪存。

13.根据权利要求1所述的设备,包括RAM存储器,所述映射控制电路(14)配置用于将直接指向包含指向信息的块(76)的直接指针存储在RAM存储器中,且在启动后的操作中,使用所述直接指针来定位指向信息。

14.一种操作主存储器(10)的方法,所述主存储器(10)包括多个物理块,所述多个物理块具有多个存储单元,所述主存储器(10)支持每次擦除至少一个物理块,所述方法包括:存储指针(72、75)的指针链,每个指针(72、75)存储在相应块(70、74)中,指针链中的每个非最终指针(72)指向包含指针链中的下一指针的相应块(74);

在至少另一块(76)中存储指向信息,指针链中的最终指针指向所述另一块(76);

在开始使用主存储器(10)时,通过跟随所述指针链,来定位所述指向信息;所述方法还包括:

多次擦除所述另一块(76),并将更新的指向信息写入到所述另一块(76),而无需更改指针(72、75),随后使用替代块代替所述另一块(76)来存储指向信息,并更改最终指针以指向所述替代块。

说明书 :

具有可擦除块单元的存储器和定位具有指针信息地块的联

结指针链

技术领域

[0001] 本发明涉及存储器件及其制造方法。

背景技术

[0002] 美国专利No 6,711,663公开了一种闪存器件。数据能从闪存器件中读取,或多或少从任意半导体存储器件。写入数据更为复杂。典型地,写入包括擦除存储器单元的块,然后在已擦除的块中编程数据页。典型地,可以仅能对整个块集体地执行擦除,由此在此情况中形成擦除单元。编程通常可以通过限定所谓的页在更小的单元完成。
[0003] 闪存器件具有遭受磨损的问题。在用坏数据块之前,只能对所述数据块进行有限次数的擦除和编程,之后数据块将不能可靠地使用。如果将特定地址的闪存器件的块比其它块更经常地擦除和编程,这些块的使用寿命将限制闪存器件的使用寿命。
[0004] 通过使用物理地址映射的时变逻辑已经解决了此问题。可以将所述映射用于使地用于存取闪存的逻辑地址能够在不同时间指的是闪存的不同物理块中的单元。因此,能够将需要频繁擦除和编程的逻辑地址每次映射到不同物理块中,以避免每当擦除和编程逻辑块时,不得不擦除和编程相同物理块(此处使用的“逻辑块”指在物理块中映射到完整的可映射地址集的地址集,和可选地和宽松地,映射到在这些单元中存储的数据的地址集)。
[0005] 对于物理映射的有效逻辑需要映射表,所述映射表包括根据与它们相对应的逻辑地址存储的物理地址。原则上,当进行物理地址到逻辑地址的映射改变时,必须每次更新这种映射表。通常,用于闪存的这种映射表存储在RAM存储器中。在上电时,所述映射表根据存储在闪存中的“标签”重建,对于不同物理存储区(例如,块),所述“标签”表示其当前逻辑地址。
[0006] 美国专利No 6,711,663描述了存储在闪存本身中的映射表的使用。美国专利No6,711,663使用按段组织的映射。将存储器组织为多个块的段。为每个段提供映射表,所述映射表把用于段的逻辑地址翻译成段中的物理地址。选择段的尺寸,使得每个映射表的尺寸与存储器页相对应,也就是闪存的编程单元。
[0007] 美国专利No 6,711,663在每个段中设置“存储器更新块”,用于存储所述段的映射表的连续版本。使用存储器更新块的最后编程页作为映射表。每次当段的映射表变化时,将更新的映射表编程在存储器更新块的下一页中。在每个变化后,将使用新的页来存储映射表,直至将存储器更新块的所有页都编程为止。当存储器表的下一更新在将所有页编程后发生时,擦除存储器更新块,并且将新的存储器表写进已擦除的块的第一页中。
[0008] 所述方法具有优点:在上电时,不需要时间根据标签来重建映射表。相反,可以从闪存中直接恢复映射表。
[0009] 然而,由于频繁的更新,存储映射表的块可能遭受增多的磨损。

发明内容

[0010] 其中,本发明的目的是提供一种具有存储器的装置,所述设备存储映射表,并且避免由于映射表的更新导致的不受限制的磨损。
[0011] 提供根据权利要求1的设备。其中映射控制电路在主存储器(例如闪存)的块的各个部分存储指针的链。在链中的每个非最终指针指向各个块,该各个块包含在链中的下一指针。映射控制电路在主存储器中也存储指向信息。在链中的最终指针指向包含指向信息的块。初始的指针优选地存储在预先设定的块中。通过这种方法,映射控制电路能够通过下述链在动态选择的块中定位指向信息。
[0012] 在一个实施例中,在多次更新块中的指向信息后,映射控制电路代替包含指向信息的块。然后,更新最终指针以指向代替块。因此,当写指向信息的新版本时,直到代替包含指向信息的块,才需要更新最终指针,因此遭受较小的磨损。在一个实施例中,其中使用更长的链,在多次更新后,也可代替包含沿着链的指针。在这种情况,沿链的上游,代替频率能变得更低,以使在链的根部能避免过多的磨损。在另一实施例中,例如,如果发生多于阈值数量的更新,通过扩充链,链的长度为动态变化以保持在需要的范围内到链的根部的更新的数量。
[0013] 在另一实施例中,使用指针树,所述链为树的一部分。因此,树中的节点可通过多个指针分支到多个后继者。
[0014] 在另一实施中,将每个指针的连续的版本写到各个用于指针的块中的相互不同的单元。在该实施例中,映射控制电路通过搜索用于最新版本的块恢复特定指针的最新版本。通过这种方法,每次当指针变化时,不需要擦除块,这减小磨损,同时仅需要在块中有限的搜索,或在启动时,用于块的一些替代。在又一实施例中,当用于指针的原始块为满时,保留备用块以写指针的新的版本。随后,擦除用于指针的原始块。这避免了由于中断导致的指针的丢失。在启动时,映射控制扩充用于指针的搜索到备用块,至少当映射控制电路检测用于特定指针的块为满时。在另一实施例中,将指向原始块和备用块的另外的指针一起存储在主存储器的块中。
[0015] 在另一实施例中,备用块可用于不同指针的多个不同块共享。在这种情况,每次当将指针写到备用块时,用于指针的原始块随后可用作所有指针的备用块。
[0016] 在另一实施例中,链为指针树的一部分。在这种情况,在树中,来自相同节点用于不同分支的另外的指针可指向原始块和备用块,以至于能很快地识别这些块能。来自节点的另外的指针也可指向用于不同指针的块和它们共享的备用块。在另一实施例中,将这些来自相同节点的另外的指针一起存储在相同的块中。
[0017] 在另一实施例中,链为树的一部分,并且树中的不同最终指针指向包含指向信息的各个块。因此,能够容易地找到在多于一个块上重新分配的指向信息。
[0018] 在另一实施例中,指向来自相同节点的不同分支的指针的连续的版本,以取决于指针更新的顺序的动态选择的次序,作为新的版本到达而存储。在启动时,映射控制电路通过搜索块恢复用于每个分支的指针的最新版本。通过这种方法,需要用于存储指针的块的数量能保持很小。在又一实施例中,可设置备用块,当先前使用的块为满时,将指针的新版本写到来自节点的分支。在这种情况,将用于来自该节点的其它分支的指针的版本复制到备用块和先前使用的块。在启动时,当映射控制电路检测各个块为满时,映射控制电路通过备用块搜索用于分支的指针。

附图说明

[0019] 根据附图中所示示范实施例的描述,这些和其它目的及有益方面将显而易见。
[0020] 图1为具有存储器的设备;
[0021] 图2为执行写入操作的流程图;
[0022] 图3为上电流程图;
[0023] 图4a-d为具有指针的连续版本的存储器的块;
[0024] 图5为具有不同映射表段指针的存储器的块;
[0025] 图6为具有不同映射表段指针的存储器的块;
[0026] 图7a-c为具有指针链的存储器的块;
[0027] 图8a-c为具有指针树的存储器的块;
[0028] 图9a-b为具有指针链的存储器的块;
[0029] 图10a-b为具有指针链的存储器的块;
[0030] 图11为空闲列表的使用;
[0031] 图12a-b为空闲列表的使用。

具体实施方式

[0032] 图1为具有存储器的设备。所述设备包括闪存10、映射表存储器12、映射控制电路14、处理器16和多路器18a、b。作为示例,映射控制电路14可以实现为用计算机程序编程的可编程电路,所述计算机程序使得所述映射控制电路执行映射控制的功能。处理器16具有与映射控制电路14的控制连接。处理器16和映射控制电路14的数据输入-输出与闪存10的数据输入-输出相连。映射控制电路14和处理器16具有用于块地址部分(可选地也包括页地址部分)的地址输出和剩余地址部分。来自处理器16和映射控制电路14的块地址部分输出和剩余地址部分输出经由多路器18a、b的相应多路器与闪存10的块地址输入和剩余地址输入相连。来自处理器16的地址输出经由映射表存储器12与多路器18b相连。映射控制电路14具有与映射表存储器12和多路器18a、b相连的控制输出。
[0033] 闪存10是这种类型,它允许每次存储单元的至少一个块的擦除操作。因此,将擦除单位称为块。能一次一页地对存储单元进行编程。典型地,每个块包括多个页。
[0034] 在正常的读取操作中,处理器16向存取存储单元输出读取地址。所述地址包括块地址部分和剩余地址部分。通过映射表存储器12将读取地址的块地址部分翻译成物理块地址,并且提供给闪存10。典型地,翻译包括使用逻辑块地址作为用于映射表存储器12的地址以恢复相应的物理地址。无需翻译,将剩余地址部分提供给闪存10。在更先进的实施例中,读取地址翻译可以包括地址的页地址部分和块地址部分组合的翻译。
[0035] 图2表示写入操作的流程图。在第一步骤21中,处理器16向映射控制电路14发出用于写入操作的请求以及应该应用于写入操作的逻辑块地址。在第二步骤22中,映射控制电路14选择将用于写入的物理块。在更先进的实施例中,映射控制电路14选择将用于写入的物理块和物理页。所选择的块和页应该为未用于另一逻辑块地址的已擦除的块,或者在先进的实施例中,应该为未使用的已擦除页。可选地,如果还未擦除那个块,映射控制电路14使得闪存10擦除所述未使用的块。如果没有擦除任一个未使用的块,在任何情况下这些都将执行。
[0036] 映射控制电路14向处理器16请求写入的逻辑块(或页)分配所选择的物理块(或页)。在第三步骤23中,映射控制电路14构造用于将逻辑地址映射到物理地址的新映射表,以说明新近分配的块(或页)。在实施例中,映射控制电路14更新在映射表存储器12中的映射表,并使得闪存对用于在物理块(或页)的存储单元中的逻辑块(或页)的新数据进行编程。
[0037] 在第四步骤24中,映射控制电路14识别块集合(a set of blocks)的最初一个,分配所述块用于存储包括至少一个已编程页的映射表。
[0038] 然后,映射控制电路14在所述已分配块的所述最初块中搜索连续地第一个未使用页或页集合。在第五步骤25中,映射控制电路14测试是否找到了所述页或页集合。如果找到,映射控制电路14执行第六步骤26,在已经找到的页或多个页中编程新的映射表。如果映射控制电路14在所述块集合的最初块中找到未使用的页,映射控制电路14分支到第七步骤27,其中映射控制电路14选择分配用于存储映射表的块集合的下一个块集合。在第八步骤28中,映射控制电路14在所述已分配块集合的下一个块集合中的连续地第一个未使用页或页集合中编程新的映射表。在第九步骤29中,映射控制电路14控制闪存10擦除已分配块集合的初始块集合。
[0039] 图3为设备的上电流程图。在第一步骤31中,映射控制电路14识别块集合的最初一个,所述块集合分配用于存储包括至少一个已编程页的映射表。然后,映射控制电路14在所述已分配块的最初一个中搜索连续地最后使用的页或页集合。在第二步骤32中,映射控制电路14从最后使用的页将映射表复制到映射表存储器12中。在第三步骤33中,映射控制电路14开始系统的正常操作。
[0040] 应当注意,在第九步骤29中擦除所述块的最初一个之前,在第八步28骤中,映射控制电路14将新的映射表编程到闪存10中。如果此过程由于某种原因(例如去除了(一部分)系统的电源)而中断,则存在将执行第八步骤28而没有执行第九步骤29的风险。映射控制电路14配置用于通过检测分配用于存储映射表的块中之一是满的并且这些已分配块的至少一个其它块不是空的,来在上电时进行检测。如果是这样,优选地,映射控制电路14在上电时没有完全充满的已分配块之一中使用连续地最后使用的页或页集合,并且使得闪存10擦除已充满的已分配块。可替代地,映射控制电路14可以使用已完全分配块的随后使用的页或页集合。在这种情况,可能错过新近编程的数据,但是如果图2的过程更早中断,无论如何就是这种情况。
[0041] 图4a-c为分配用于存储映射表的块集合中的页的使用的三个阶段。在每幅图中,示出了两个块40、42的相同集合。用阴影表示已经用映射表编程的页。用无阴影表示已擦除的(空闲)块。在实施例中,对每页中的标记比特进行编程以表示页是空闲的还是已编程的。可替代地,空闲块可通过测试在块中的所有数据是否为已擦除状态(例如,逻辑比特值1)而检测,可选地如果有ECC(在块中使用纠错码),就通过测试ECC是否表示错误而检测。可替代地,如果将标签和数据一起写入,通过测试现有的正确标签的存在而检测。
[0042] 举例来说,将这些页显示为向下增加的地址,以使得最高的所示页具有最低的地址。
[0043] 在第一阶段(图4a)中,使用映射表对第一块40的部分页进行编程。当块40、42处于此状态时,映射控制电路14在上电时将使用的非空闲块40中的最低所示的已编程页。当处理器16要求写入时,映射控制电路14将选择在非空闲块40中的最高所示的空闲页,用于对新的映射表进行编程。
[0044] 在第二阶段(图4b)中,使用映射表对第一块40的所有页进行编程,并且第二块42为空闲的。在这种情况,映射控制电路14在上电时进行,与如图4a中的情况相同。当处理器16要求写入时,映射控制电路14在第二块中选择第一个空闲页,用于对新的映射表进行编程。在对新的映射表进行编程之后,映射控制电路14擦除满的块,这将导致如图4c所示的第三阶段。
[0045] 在第三阶段(图4c)中,第一块40为空闲的,并且已经对第二块42的一部分进行编程。当块40、42处于该状态时,这些块的作用与图4a中的相反。
[0046] 图4d表示由于供电电源的过早断开,可能在第二阶段(图4b)之后而出现的状态。一个块40是满的,并且其它块42为非空闲的。如果映射控制电路14在上电时遇到这种状态,映射控制电路14将擦除满的块,并且使用来自未满的块42的映射表。
[0047] 在替代实施例中,映射控制电路14写入伴随映射表的版本号,每次当写入表(或根据预定顺序改变)时,版本号增长。在此实施例中,可以通过选择具有最前面版本号的映射表识别映射表的有效版本。在又一实施例中,映射控制电路14可将带有版本号的更新写入中间块的任何一个中,例如如果其它块是满的,写完之后擦除其它块。
[0048] 在另一实施例中,在写入新的块以协助在上电时选择正确的块之前,映射控制电路可以配置用于在满的块中设置“脏”标志。在这种情况,映射控制电路14首先试图使用来自未标记为脏块的最新的映射表。如果此块为空闲的(由于错误),映射控制电路14将求助于脏块。
[0049] 版本号可循环变化。版本号可与在块中具有映射表的页的位置一起使用,以代替为搜索正确块的目的而测试满的和空闲的块。在这种情况,短循环,比如四个不同版本号可以满足要求。虽然有实施例已经示出其中整数的映射表适应一个块,但应意识到这不是必需的。当映射表的尺寸使得整数的映射表不能填满块时,映射控制电路14可从一个块溢出到其它块来写入最新的映射表。在这种情况,如果在溢出的映射表之后没有存储另外的映射表,映射控制电路14在启动时使用所示溢出映射表,并且映射控制电路14不会擦除第一块直至它在下一块中写满映射表为止。
[0050] 至此,假设存储了完整闪存的映射表。在另一实施例中,多个映射表配置用于逻辑地址的各自段(范围)。
[0051] 在又一实施例中,映射控制电路14为从分配用于存储映射表的块集合中的各个独立可选择的页中的各自范围编程和载入地址表。在又一实施例中,映射控制电路14配置用于使对映射表应用到闪存10的页的段的标识进行编程,其中闪存10的页中存储有映射表。在上电时,映射控制电路14搜索以分配的块,以找到包含各自段的标识的最后顺序的页。优选地,映射控制电路14将这些页复制到映射表存储器12中,用于在地址翻译期间使用。
[0052] 当处理器16需要写入新的页时,映射控制电路14像以前那样产生的新的映射表,但是仅对于段中的逻辑地址,所述段包括处理器16需要写入的逻辑地址。相应地,映射控制电路14仅把用于所述段的新映射表加入块集合的映射表中,所述块集合分配用于存储映射表。举例来说,使用图4a、b中不同形式的阴影表示用于不同段的映射表。
[0053] 图5为在当分配的块为满时在写入期间发生的情况。在这种情况,映射控制电路14将用于已更新段的新映射表写入到块集合中空闲块42中,所述块集合分配用于存储映射表。此外,在一些实施例中,映射控制电路14将用于其它段的当前映射表复制到所述块的空闲块42中。这由图中的箭头示意性地示出,尽管代替从闪存10复制,所述映射表的内容当然也可以从映射表存储器12中复制。然后映射控制电路14使闪存10来擦除满块40。
这使在上电时,映射控制电路14能够表示包含有效映射表的块。
[0054] 如果错误地未擦除旧的块40,映射控制电路14检测到满块40与非空闲块42结合一起的,并且在上电时擦除满块。优选地,映射控制电路14首先验证用于在非满块42中存储所有段的映射表。如果没有,映射控制电路14首先在满块40中搜索用于未复制段的顺序上最新的映射表,并且在擦除满块40前,将这些映射表复制到非满块42。
[0055] 作为替代,当首先将新的映射表写入空闲块42时,未复制用于其它段的映射表,并且未擦除满块40。在这种情况,在上电时映射控制电路14仍然能够恢复块,与错误断开时的情况一样。能够将满块40的擦除延迟直至其它块42变满为止,因为在上电时,映射控制电路14仍能通过检测哪个块未满来检测哪个块是最后写入的块。在此替代中,只有当未满的块变满时,映射控制电路14需要擦除满块40。优选地,在这种情况,映射控制电路14首先复制用于还没有在未满块42中存储映射表页的那些段的映射表,如果有的话。也就是,在加入所述还没有在未满块42中编程的映射表后,可延迟擦除,直至非满块42具有正好足够的空间来以留出空闲的页为止。
[0056] 在另一实施例中,分配用于存储映射表的块集合包括多于两个块。这是有益的,例如,如果存储在块(例如:映射表)中的数据太大,使得它们能从一个块溢出到另一块中。在这种情况,例如可以按照预定顺序中使用所分配的块。如果是这样,优选地首先擦除至少集合中的最新更新的块,重新用来存储映射表。在启动期间,映射控制电路14定位空闲块,并且使用所述空闲块来确定所述序列的开始/结束,并且根据所述映射控制电路定位存储数据的最新版本。
[0057] 图6表示了其中将不同块用于不同段的实施例。在这种情况,设置四个块60作为多个段,并且将备用块63配置用于块60之一变满的情况。在操作中,当映射控制电路14处理写入请求时,映射控制电路14将用于通过写入请求而改变的段的新映射表编程到包含用于所述段的前一个映射表的块中。如果用于所述段的块是满的,映射控制电路14将新的映射表编程到空闲块62中。然后,备用块成为用于所述段的块,然后映射控制电路14擦除用于所述段的旧块。在一个实施例中,将所述段的标识编程到新块中,可替代地当写入所述页时,可以在块的每一页中编程所述标识。
[0058] 在上电时,映射控制电路14测试每个已分配的块60、62,以确定将所述块用于哪一段。然后,将来自所述块的最新的映射表用作所述段的映射表。如果由于供电中断,存在两个包含段的数据的已分配块60、62,映射控制电路14从那些块中选择未满的块,擦除其他块,然后使用来自未满的块的顺序上最新的映射表。
[0059] 在一个实施例中,映射表存储器12包括并行地用于所有段的表,使得存储器映射表可以立刻翻译任何逻辑地址。在此实施例中,映射控制电路14将用于所有段的映射表载入映射表存储器12中。在替代实施例中,映射表存储器12存储仅用于段的有限子集的映射表,例如同时仅用于一段。在此实施例中,当在映射表未在映射表存储器12中的段中接收逻辑地址时,映射控制电路14使用来自已分配的块60、62或40、42的映射表,用另一个段的映射表代替一个段的映射表。
[0060] 虽然实施例表明其中用于段的整数数量的映射表适合于,应当理解的是这不是必需的。当用于段的映射表的尺寸使整数数量用于段的映射表不能填满块时,映射控制电路14可写入用于最后段的映射表,在图5的情况中所述最后段从一个块溢出到其它的块。在这种情况,如果没有将另外的映射表存储在溢出映射表的后面,映射控制电路14在启动时使用所述溢出的映射表,并且映射控制电路14不会擦除第一块直至在下一块中写满映射表为止。在图6的情况中,用于所述段的满的映射表优选地写入到新近分配的块,因此立刻释放先前分配的块。
[0061] 在一个实施例中,将预定的块集合分配用于存储映射表。在此实施例中,预定的块集合位于预定的地址,使得能够将映射控制电路14设计用于参考在所述预定地址中的块。然而,这可以具有已分配的块将更快地磨损的缺点。作为替代,可以分配变化的块或多个块以存储映射表,并且可以将支持RAM的存储器配置用于存储指向已分配的块或多个块的指针。
[0062] 在可替代实施例中,可以将连接的列表结构用于限定块集合,所述块集合分配用来存储映射表。如图7a所示。其中示意性地示出了整个闪存71,分割成块。将在闪存中的预定物理地址的基础块70(例如,地址零)用来存储一个或多个基础指针。示出了所述基础块的放大部分70a以及基础指针未知72。来自所述位置的基础指针指示存储另外指针的另一个块74。示出了所述另一个块的放大部分74a和具有指针的基础指针位置75,所述指针指向分配用于存储映射表的块76。
[0063] 在上电期间,映射控制电路14首先从基础块70载入指针72,使用所述指针来选址其它块74,映射控制电路14从所述其它块将指针载入分配用于存储映射表的块76。映射控制电路14保存所述指针作为随后的使用,并且使用所述指针从分配用于存储映射表的块76将当前的映射表载入映射表存储器12中。这可通过例如前述方法中的任何一个来做到。
[0064] 而且,此结构这样的具有以下益处:可以将不同物理块分配作为块76以存储映射表,以便避免比其它的块更频繁地擦除相同的块。每次已分配块76变化时,将新指针75写入指向已分配块76的块74中。优选地,至少可代替的块(已分配块76和中间块74)中每个均存储计数值,所述计数值表示已经擦除的次数,使得当所述计数值超过阈值时,可以将映射控制电路14配置用于用不同的块代替相关的块。例如每次在将擦除块之后写入时,计数值可以增长1。
[0065] 类似地,在一定时间的过程中,可以将不同物理块用作中间块74,以便避免在存储新的指针值之前,过于频繁地擦除相同的块。每次中间块74变化时,将新的指针72写入指向中间块74的基础块70中。应当注意到,中间块74的变化不如已分配块76的变化频繁。在一个示例中,每次擦除已分配块76 N1次(例如N1=8)之后,选择不同物理块用于已分配块76。因此中间块74仅需要每N2次更新一次,其中擦除已的块(例如,N2=100000,或更一般地,比块的可擦除且仍能用来存储数据的最大次数少的整数数量)。当将与中间块
74对应的物理块擦除N2次时,它依次被代替。因此,这样的代替发生在擦除已分配块76的N1*N2次之后。因此,对于中间块74会发生较慢的磨损,甚至对于基础块70也会发生较慢的磨损。
[0066] 可替代地,没有中间块74可使用,基础块70中的指针72立刻指向已分配块76。这提供了闪存的更有效的使用和映射表更快的恢复。然而增加了基础块的磨损。应当注意到,在一段时间后,不得不擦除具有指针值的块,这不可避免地导致增加的磨损。为减小这种磨损,在基础块70和已分配的块之间使用在中间块74中的中间指针。
[0067] 作为另一替代,可使用中间块的链,除了指向已分配块76的最新的块,在基础块70中的指针72指向链中的第一块,每个下一块指向链中的下一块。这样,能够减少基础块的磨损。中间块越来自于已分配块,所述块越不需要更新。因此,具有预定物理地址的基础块70可以与使它磨损的频繁的更新相隔离。
[0068] 可使用固定预定长度的链。替代地,也可使用动态自适应长度的链。在这种情况,优选地,在所述链中的最新的中间块存储指示,所述指示指向已分配的块(或与所述链的末端相距预定距离的块指示沿所述链的预定距离的块存储该指针)。在实施例中,当映射控制电路14检测到在阈值以上的更新频率时(例如,已经擦除基础块70的次数超过阈值T),映射控制电路增加链的长度。因此,链的长度能根据使用的类型来调整以避免基础块70的太多磨损。在一个实施例中,使用链长度的延长以避免多于阈值次数地更新基础块70。例如,当已经更新基础块70阈值数目的次数(T=100000)时,这可以通过例如在链中增加额外的中间块来实现,例如,在最后一次擦除基础块70后,将指针写入基础块70中的新块,并且将指针写入新的中间块中的下一中间块。如果已经擦除新的中间块阈值数量的次数,这能通过新的中间块用作部分基础块来重复,等等。
[0069] 在另一实施例中,多个块分配用来存储映射表或部分映射表。例如,能够将这应用到实施例,其中在擦除旧的已分配的块中的旧的映射表之前,将新的映射表存储到新分配的块中。可替代地,例如,可应用到实施例,其中用于逻辑块地址的各自段的映射表存储在各自的块中。
[0070] 图7b描述了此实施例。在此实施例中,基础块70包括指向各自中间块74、78的第一和第二指针72a、b,它们的每个依次包括指向各自分配块76、79的指针75、75a。在此实施例中,在上电过程中,映射控制电路14首先从基础块70载入指针72、72a,然后使用这些指针来选址其它块74、78,并且将指针载入已分配的块76、79,用于存储映射表。映射控制电路14保存这些指针供后续使用,并且使用所述指针来从分配用于存储映射表的块76将当前的映射表或或当前映射表的段载入到到映射表存储器12。例如,这可使用上述方法中的任何一个做到。
[0071] 当开始使用另一块代替已分配块76、79中的一个来存储映射表时,映射控制电路14在中间块74、78指向所代替的已分配块76、79的哪一个中间块中改变指针。优选地,在改变指针之前,映射控制电路14在新的分配块中存储新的映射表(或映射表的段)。
[0072] 虽然显示了其中两个指针72、72a被存储在基础块中的结构,应该意识到,替换是可能的。例如,代替两个指针,可以存储指向单个中间块的单个指针,所述中间块存储指向已分配块76、79的两个指针。这具有需要更少的块的益处,但其导致更多的磨损,因为其需要更多的擦除操作。作为另一实施例,当使用多于两个的分配块76、79时,可存储多于两个的指针(在基础块70或中间块74、78中)。作为替代,当在将具有相互预定物理关系的块(例如,连续的物理地址)用于中间块74、78或用于已分配块76、79时,可将单个指针用到中间块74、78中的一个或用于一个已分配块76、79。
[0073] 在前面的例子中,示出了只有有效指针存储在每个块中,这意味着每次当在所述块中的指针值变化时,映射控制电路14擦除和重新写入基础块70和中间块74、78(或代替中间块74、78)。替代地,映射控制电路14可以配置用于将每个新的指针值写入到基础块70或具有指针的中间块74、78中的新的页,不需擦除先前存储的指针。
[0074] 图7c表示了用于连续的指针72、75的连续页的使用。包括指针值的页通过阴影表示。在每种情况,最低的阴影页(具有包括指针值的最高地址的页)包括有效指针值。更高的页(具有更低的地址)包括更旧的(无效的)指针值。在可替代实施例中,映射控制电路14写入伴随指针的版本号,每次当写入(或另外根据预定序列改变)表时,版本号增长。在此实施例中,映射表的有效版本能通过选择具有最靠前版本号的映射表来识别。
[0075] 在启动期间,映射控制电路14例如通过搜索具有按照某种预定顺序的页紧接着空页的指针的页,从无效指针中区分有效(最新存储)的指针。例如,所述预定顺序可以是物理地址的顺序。例如,搜索可为二进位的搜索(首先测试块中部的页是否为空,然后测试第一或第二半页中部的页,分别得到第一被测试的页是否为空,等等,直至已经在相邻的两边测试被测试的页)。此实施例具有需要较少频率的擦除操作的益处,以在启动中更长的搜寻时间为代价。
[0076] 在替代实施例中,映射控制电路14写入伴随指针的版本号,每次当写入新的指针时(或根据预定顺序改变时),版本号增加。在此实施例中,指针的有效版本能通过选择具有最靠前的版本号的指针识别。在另一实施例中,映射控制电路14可将带有版本号的更新写入到中间块的任何一个,例如,如果其它块为满,在写入后擦除其它块。
[0077] 版本号可循环变化。版本号与在块中具有指针的页的单元一起使用,代替为了找到正确块的目的而测试满的和空的块。在这种情况,短周期的、比如四个不同版本号可以满足。
[0078] 在另一实施例中,可以将映射控制电路配置用于在启动时写入新的中间块以助于正确块的选择之前,在满的中间块中设置“脏”标签。在这种情况,映射控制电路首先试图使用未标记为脏的中间块。如果此块为空(由于错误),映射控制电路14将求助于空块。
[0079] 在其中并行使用多个有效指针的实施例中(如图7b中的例子),可以一起存储指针值和它们在多个并行指针值中的等级标识(identification of their rank)。在这种情况,在启动过程中,映射控制电路14为每个等级标识搜索有效的(最新存储的)指针值,所述指针的值为在预定顺序中比相同等级标识的其它指针的值位于更靠前的单元。
[0080] 当映射控制电路14已经使用了用于存储指针值的所有页,并且必须写入新的指针值时,映射控制电路14擦除块,并且从顶部重新开始。图8a-c表示了其中将多个块用于指针值的替代实施例。在基础块70中的指针72、82指的是第一中间块74和第二中间块84。开始,如图8a所示,每次一个指针值变化时,将变化的指针的值75写入第一中间块74中的新页,并且第二中间块84仍保持空。当第一中间块74为满时,映射控制电路14将下一变化的指针值75写入第二中间块84的第一页,如图8b所示,然后,擦除如图8c所示的指针值的旧的块。
[0081] 以这种方式,由于能容易地恢复由于更新中断造成的错误。在上电期间,映射控制电路14测试第一中间块74是否为满,如果为满,测试来自第二中间块84的一个或多个指针是否可用。如果是,映射控制电路14使用来自第二中间块84的最新的指针。如果不是,映射控制电路14使用来自第一中间块74的最后指针值。如果第一中间块为空,映射控制电路14使用来自第二中间块84的最后指针值。
[0082] 应当注意,指向第二中间块84的指针值的加入和旧的第二中间块的擦除可遍布在时间中(延迟擦除,例如直至将多个指针值写入第二中间块84中),由于可以将映射控制电路14配置用于通过测试中间块是否为满,在启动时来确定决定包括正确指针值的中间块;如果块为非空,使用来自其它中间块的最后指针的值,否则,使用来自先前中间块的最后指针值。
[0083] 该技术也可应用到基础块70。例如,当使用基础块70的所有页时,映射控制电路14将下一指针值写入在预定辅助的基础块(例如,具有块地址1的块)的第一页,然后擦除基础块70。例如,在第二中间块84的变化的情况,映射控制电路向指向旧的中间块的指针值82之后的第二中间块84(如果必要)添加指针值,将指针值写入到第二中间块84的第一页中。
[0084] 图9a表示了其中并行地使用多于一个有效指针值的例子,例如如图7b中的情况。并行指针值与各自等级相对应(例如,对应用于连续逻辑地址范围的映射表的连续段的等级:将并行地指针标注为第一和第二指针)。分配各自的中间块以用于各自等级的指针值的存储,将识别分配的等级的信息(例如对应于等级的数字)存储在每个包括指针值的中间块中。
[0085] 有效的并行指针是各自存储在各自中间块74、78中的最新占用的单元中。将额外的指针92存储在基础块70中,其指向额外的中间块94。当其它的中间块74、78都不为满时,所述额外的中间块94保存为空。在这种情况,映射控制电路14将新的指针值写入中间块74、78中的连续的页中。当中间块74、78中的一个为满,并且必须加入新的指针值时,映射控制电路14将新的指针的值写入额外的中间块94。此外,映射控制电路14将指针的等级的指示写入额外的块94。如图9b所示,然后映射控制电路14擦除填充的中间块。现在,该擦除的块作为额外的中间块的部分:当中间块又为满,当指针的值必须加入时,映射控制电路14将指针值写入现有的空块,并且擦除填充的块。
[0086] 在启动时,映射控制电路14从基础块70载入指针,并且确定指向用于每个等级的中间块的指针。如果两个所述中间块与相同的等级相对应,然后映射控制电路14选择所述中间块的一个,所述块为非满或空以将指针载入分配的块,如果另一个中间块为满,在擦除它。如果用于等级的一个块为满,并且另一个为空,映射控制电路14使用来自满的块的上一次写入的指针的值。
[0087] 图10a、b为实施例,其中将不同等级的指针值105a、105b一起存储在相同的块中,每个都包括它的等级的标识。在此实施例中,映射控制电路14向相同的中间块74中加入用于所有等级的新的指针值,直至所述块变满为止。当必须写入用于等级的下一新的指针的值时,映射控制电路14将用于所述等级的新的指针值写入额外的块94,并且将其它用于等级或多个等级的有效指针的值或多个值复制到额外的块94。然后,映射控制电路14擦除填充的块。在启动时,映射控制电路14使用基础块70中的指针值以确定中间块,并且搜索非空和非满的中间块,如果这不导致用于所有等级的指针的值使用来自所述块的上一次写的指针的值;如果这是满的,映射控制电路14载入来自其它块的用于所有剩余的等级的最后写的指针值。
[0088] 应该意识到,在实施例中的任何一个中,其中不得不从多于一个的可能块中选择有效指针值,映射控制电路14可以配置用于使用任何机制,例如如果非空的其它块是可用的时使用满的块的擦除、使用版本号、使用脏标识等等来确定将被使用的块。同样,如果发生不一致,映射控制电路14可以标识最新的可靠版本。例如,如果映射控制电路确定指针指的是无效的映射表(例如,空的映射表或将不同逻辑地址映射到相同物理地址的表),映射控制电路可求助于指针的更早的版本。当确保映射控制电路14在完成用于信息的替代之前不擦除信息时,这导致最佳的可能的错误校正。
[0089] 在又一实施例中,减少更新的数量。这通过和映射表一起存储一“空闲”块的表单来完成,所述表单描述当更新映射表时应该进入映射表中的块。因此,如果逻辑地址映射到第一块的物理地址,并且在第一块中的数据的后续更新中,映射控制电路14选择通过第二块(例如,避免第一块的更多磨损)替代所述第一块,映射控制电路14从空闲列表中选择的第二块,并且在第二块中存储逻辑地址的指示(例如,“标签”)。在这种情况,映射控制电路14省略写新的映射表。替代地,在随后的启动中,映射控制电路14使用与旧的地址映射表一起存储的空闲的列表,来确定是否将在空闲的列表上任何块用于更新。如果是,映射控制电路14根据所述块中的逻辑地址的指示推断映射表的校正。只有当空闲块的列表上的所有块都被使用时,需要存储新版本的映射表。
[0090] 图11为在此实施例中使用的来自具有映射表信息的存储器的块10。所述块包括映射表的连续的版本112a-c,每个由具有空闲块的地址的“空闲的列表”114a-c伴随。将映射表112c的最新版本及其伴随的空闲列表114c定义为当前的版本。在操作时,当其地址出现在映射表12c的当前版本中的物理块不得不使用替换的块更新时,映射控制电路14使用来自关联的空闲列表114c的第一可用地址,并且将更新写入通过由第一可用地址选址的块。此外,映射控制电路14将标签写入所述新的块,所述新的块辨识更新所应用的逻辑块地址。在新的块中的更新完成后,映射控制电路14擦除仍出现在当前的映射表112c中的旧的块。
[0091] 优选地,映射控制电路14相应地更新在映射表存储器12中的映射表。当映射控制电路14检测到在当前空闲列表114c中的所有块都被用来更新时,映射控制电路14将映射表的新版本和被擦除的旧的块的列表写入旧的空闲列表114c后的块110中(或写入用于映射表数据的另一块中)。优选地,每个空闲的列表包括多个块的地址。在这种情况,一旦将旧的空闲列表耗尽时,优选地写映射表的新的版本和空闲列表。
[0092] 在启动时,映射控制电路14恢复空闲列表114c的当前版本,例如,通过搜索块110中的最后非空页。然后,映射控制电路14参考由所述空闲列表114c上的地址选址的页,并且决定是否将数据写入这些页。如果是,映射控制电路14根据标签确定哪种校正必须应用到映射表的当前版本。因此,确定一个或多个校正,每个表示逻辑块的地址和具有用于所述逻辑块的更新的数据的物理块的地址。在一个实施例中,映射控制电路14从块110复制映射表112c的当前版本到映射表存储器12中,并且应用校正到映射表存储器12中的映射表。在另一实施例中,映射控制电路14在映射表存储器12中存储校正的列表,并且当其从块110载入时,将这些应用到整个映射表。
[0093] 优选地,映射控制电路14按照这些块的地址出现在空闲的列表114c中的顺序使用来自用于更新的空闲列表114c的块。在这种情况,在启动时,映射控制电路14优选地按照这些块的地址出现在空闲的列表中的顺序,测试用于更新的空闲列表114c上的块,并且一旦确定一个块未被更新时,就停止测试。这加速了启动,但是即使不使用此顺序,当仅有部分块出现在空闲的列表114c上时,启动也相当快。
[0094] 优选地,一旦已经完全写入块的更新版本,将擦除每个出现在当前映射表112c中的旧的块。因此没有数据丢失。然而,可延迟擦除直至正好在写映射表的新版本和空闲的列表(优选地,其中所有的擦除块出现)之前。而且,虽然描述了其中映射表112a-c和空闲的列表114a-c被接连地存储的一个实施例,应该意识到,映射表和空闲的列表之间的联合能以其它方法实现,例如通过包括具有两个的版本号,其中能任意地存储映射表和空闲列表。而且,映射表和关联的空闲列表能存储在不同的块中,例如,以提供联合相同的顺序。
[0095] 应该意识到此技术可以与所有前述实施例联合应用,或其单独应用。例如,可使用多个块可来存储空闲的列表和关联的映射表的版本,仅仅在将新版本写入新块后擦除满的块,以使在启动时能够通过搜索发现最新的版本。
[0096] 作为另一示例,可使用段的映射表,在这种情况中,需要存储用于更新的段的新版本。在这种情况,各自空闲的列表能用于各自段,使用所述段的空闲列表执行用于段的块的更新。但是,优选地,使用用于所有段的公共空闲列表,使用用于所有段的相同的共享的空闲的列表执行用于任何段的块的更新。这减少了需要存储的映射表的更新的数量。应当注意到在这种情况,优选地,在指向各自段的块地址上没有任何限制,这意味着在用于段的映射表中,需要比当每个段映射到与各自的物理块集合时稍长的地址,所述物理块集对于确定的地址位具有相同的地址。
[0097] 而且,当使用段时,在一实施例中,映射表存储器12仅对段的部分(例如,对仅一段)缓存映射表部分。这使得使用小的映射表存储器12成为可能。在这种情况,优选地,用于所有段的校正连同缓存的映射表一起存储在映射表存储器12中。在这种情况,当需要时,映射控制电路14从闪存的块中向映射表存储器中载入用于新的段的映射表,并在映射表存储器12中应用存储的校正。在又一实施例中,在从闪存10中载入用于段的映射表前,映射控制电路14可以配置用于试图使用校正映射逻辑地址。这增加了存取速度。
[0098] 作为又一示例,指针链可被用来标识块110(或块集合),其中存储有映射表和空闲的列表。这样,可以交换块110(或用于一起或分别存储映射表和空闲的列表的块集合),而不存在磨损的问题。
[0099] 空闲的列表的使用也可应用到指针链。在一实施例中,在链中指向中间块的指针与指向块的空闲的列表相关联,所述块将被用作新的中间块。当新的中间块产生时,使用标识在空闲的列表的块,并且将新的指针的值写到所述块。此外,将一些信息存储在此块中作为有效块(例如,通过包括版本号),并且未更新在基础块中指向中间块的指针。只有当空闲的列表耗尽时,更新基础块,以及到新的中间块的指针值和空闲的列表。
[0100] 虽然所示实施例,其中整数数量的映射表加上空闲的列表适合一个块,应该意识到这不是必需的。当映射表加上空闲的列表的尺寸以使一个块不能被整数数目映射表加上空闲列表所填满时,映射控制电路14可从一个块溢出到另一块写入最后的映射表加上空闲的列表。在这种情况,如果没有更多的映射表加上空闲的列表存储在溢出的映射表后,映射控制电路14在启动时使用溢出的映射表加上空闲的列表,并且映射控制电路14直到它在下一块中写一满的映射表加上的空闲的列表才擦除第一块。
[0101] 图12a为其中没有立刻完全更新块的实施例。显示了存储用于逻辑块的的原始完整的数据集合的第一块120。显示了存储用于逻辑块的更新数据123的第二块122。
[0102] 在实施例中,映射控制电路14配置用于响应命令来更新部分逻辑块,所述逻辑块例如从空闲的列表114c中通过选择空块映射到第一块120。所述空闲块成为第二块122。映射控制电路14仅将块的数据123的更新部分写入第二块122。当映射控制电路14接收这种的后续命令时,对于相同逻辑块中的单元,所述单元与先前更新的单元不重合,映射控制电路14将新的更新数据写入第二块122。映射控制电路14对于后续命令重复它。
[0103] 如果在后续命令中的更新的确重叠,映射控制电路14复制第一块120的剩余(还未更新)单元到第二块122。映射控制电路14也将信息写入第二块122,这表明已完成第二块122。此后,第二块接管第一块120的部分,并且映射控制电路14(例如,从空闲的列表114c中)选择新的块以作为存储更新的第二块。随后,擦除原始的第一块120。
[0104] 任何时候,例如当没有空闲块可用时,映射控制电路14可将第一块120的剩余(还未更新)单元复制到第二块122。然后,映射控制电路14也将信息写入到第二块122,这表示第二块已完成。此后,映射控制电路使用第二块122担任第一块120的作用,然后,擦除原始的第一块120。在实施例中,当装置关机时,映射控制电路14也执行此操作。
[0105] 在读取期间,如果映射控制电路14接收来自逻辑块的读取命令,映射控制电路14确定第一和第二块120、122是否可用于逻辑块有效;如果是,决定读取操作是否涉及来自第二块122用于更新的单元的更新数据,或来自第一块120用于未更新值的原始数据。在前者中,映射控制电路14指导读取操作到第二块122,在后者中,映射控制电路指导读取操作到第一块。
[0106] 优选地,映射控制电路14在映射表存储器12中存储另外的校正,更新表示块的部分(或多个部分),用来识别在读操作中的更新数据123。例如,当已经写入更新时,所述另外的校正存储在映射表存储器12中。
[0107] 在实施例中,映射控制电路14在启动时,使用空闲的列表114c恢复更新。在此实施例中,映射控制电路14在列在空闲列表114c上的一个或更多的块上执行测试,以得到所述块是否包括数据和用于表示逻辑块的标签。如果是,映射控制电路14执行测试,以得到所述块是否包括表示块已经完成的信息。如果是,映射控制电路14使用所述块,来代替在映射表112c中用于逻辑块指示的块。如果映射控制电路14找到包括数据但未完成的块,映射控制电路14使用所述块作为第二块122,并且所述块在映射表122c中以与第一块的相同的逻辑块列出。在实施例中,映射控制电路14生成在这种情况下的另外校正,并且在映射表存储器中存储所述另外校正。
[0108] 图12b示出实施例,其中,除更新数据123之外,复制的数据也存储用于在更新数据123之前的地址。这简化了用于读取的另外校正:到更新数据123的末端的数据能从第二块122读出,并且跟随更新数据123的数据需要从第一块120读。这对于闪存10是特别有用的,在其中只能依次写块。在这种情况,在写操作中,映射控制电路14首先从第一块120复制一直到更新数据的数据到第二块122,然后将更新的数据123写到第二块122。
[0109] 在另一实施例中,映射控制电路14测试另外的写命令,以确定写入命令是否是到用于第一块120和第二块122使用的逻辑地址。如果是,映射控制电路14测试是否写命令被指导在更新数据后的块的单元中。如果是,映射控制电路14从第一块120复制数据到第二块122,从更新数据123的末端到另外写命令的地址的起始,然后在第二块122中写入另外的写命令的数据。如果新的写命令的单元在部分被写的第二块之前或与之重叠,映射控制电路14选择空闲块作为第三块124,并且在从第二块122数据的复制之前,将用于新写命令的数据写入所述第三块124中。
[0110] 在实施例中,映射控制电路14保持第一、第二和第三块120、122、124在使用中。当另外的写操作发生在相同逻辑块,甚至可使用更多块。在此实施例中,映射控制电路14依靠读地址,完成来自所述块120、122、124中一个的读操作。相应地,映射控制电路14可存储表明所述块120、122、124的每个的另外的校正,以及一直到存储最新数据的块中的单元。而且在任何时候(例如,当没有更多空闲的块可得到时),存储器映射控制电路14可清除所有的校正,以填补最小填充的块124(采用最新块122之前的下一部分,等等),并且在所述已完成的第三块124中存储信息。然后,映射控制电路14能擦除其它块120、122,并且将更新的存储器映射表和空闲的列表写入闪存10。
[0111] 在启动时,映射控制电路14搜索列出在空闲列表123上的块,以确定所述块是否包括数据。如果用于逻辑块的块包括已完成的标识,映射控制电路14对于所述逻辑块使用所述块,以代替在映射表中列出的块。如果映射控制电路14发现一个或更多来自空闲列表的块包含用于相同逻辑块的数据,但是所述块中的任何一个都没有标识它是完成的,映射控制电路14建造参考已找到的块122、124的进一步校正信息。
[0112] 原则上,当映射控制电路14接收写命令时,多于一个额外的块122、124用于逻辑块时,所述写入对在每个额外的块122、124中的最新更新的单元后的单元中的数据进行更新。映射控制电路14可以选择在哪里写入更新。在最旧的(最满的)额外块中写具有这种益处,在较新的块中将更多的空间留下用作更新,这减小了对额外的块的需要。然而,也可使用在较新的额外的块中的写,这具有这样的效果:在最新的块中的更新数据可延伸到在较旧的块中之外。在这种情况,映射控制电路14优选地擦除更旧的块。优选地,映射控制电路14也在块中写入信息,以表明在此情况中的更新的顺序,以用于在启动中形成另外的校止。
[0113] 如这里使用的,将链中的指针和映射表中的物理块的地址以及空闲的列表中的块地址定义为指向信息,以用来识别被指定各自功能的物理块的各自块。所述功能的典型例子是对于逻辑块地址作为块的功能的块,提供指针的块以及提供空闲列表的块。
[0114] 例如,映射控制电路14作为可编程的处理电路实现,通过使用这里描述的块以指令的程序编程。可替代地,可实现部分或全部映射控制电路14以专门用于执行所述功能的电路。
[0115] 虽然显示的是其中使用指向单个块的指向信息,并且使用单个块存储指向信息(作为擦除单元的块)的实施例,应该意识到,代替的指向信息,可以使用指向这种擦除单元的组的信息,和/或使用单元的组来存储连续的有效指针值。
[0116] 虽然示出了实施例,其中将(另外)校正的列表存储在映射表存储器12中,它最好为RAM存储器,例如SRAM或DRAM,应当理解,可替代地,可以设置额外的RAN存储器(未示出),与更新控制电路14耦合,以存储校正的列表。同样,其它信息,例如从随后的指针链得到的最后指针,可以将在写后续更新等中使用的非空块的标识存储在映射表存储器12或这样的额外的RAM存储器中,以使仅在启动时,并且可选地,在稍后的一些例外时间点,例如,在重置信号或错误信号的接受以后,需要通过闪存10搜索整个信息。
[0117] 虽然具体实施例已经表明其中(另外的)校正的列表存储在映射表存储器12中,它优选地为RAM存储器,例如SRAM或DRAM,应当理解,可替代地,可设置耦合到更新的控制电路14的额外的RAM存储器(未示出),以存储校正的列表。类似地,其它信息,比如通过下述指针链得到的最终指针,在写入随后的更新中使用的非空块的识别等等可存储在映射表存储器12或这样额外的RAM存储器中,以使仅需要在启动时和可选地,在后来一些例外的时间点(例如,在接收到重置信号或错误信号后)执行通过闪存10搜索该信息。
[0118] 可意识到,一些物理块可在时间过程中成为不能用的,例如在将这些块擦除多于一定数量的次数后,由于磨损,或由于出现在块中的其它错误。当上述情况发生时,映射控制电路14避免使用所述块。一旦块被放弃,所述块从映射表和空闲的列表移除。可选地,映射控制电路14保持代表映射控制电路14将不再在闪存10中使用的物理块地址的“坏的列表”的信息。当一个块被放弃时,将所述块加入“坏的列表”,但并不需要在闪存10中的空闲的列表或映射表中立刻更新。可延迟稍后的更新直至空闲的列表耗尽。在启动时,映射控制电路14测试坏的列表,得到是否在空闲的列表或映射表中参考的块也在坏的列表上,并且如果是,映射控制电路14按照所述块未在这些列表上的方式执行。