闪存存储器中的索引管理的制作方法

文档序号:13941032阅读:225来源:国知局

本公开总体上涉及电子电路,并且更具体地涉及使用闪存存储器的电路。本公开更具体地涉及闪存存储器中的索引管理。



背景技术:

闪存存储器越来越多地用于微控制器中从而以非易失性方式存储数据。

闪存存储器中的数据存储由于所执行的操作的粒度而具有各种时间限制,由字(例如,由四个字节的字)来执行写入,而由几个字(从几十个字到几百个字)的页来执行擦除。

在某些应用中,希望确定所执行和存储的事务满足原子性标准。事务的原子性对应于确定存储在存储器中的数据有效地具有可处理的且未损坏的状态。这相当于确定该非易失性存储器中的数据处于事务之前的状态或处于相关事务之后的状态,但是它们并不处于中间状态。

事务原子性管理特别地用于这样的应用中,其中电路电源的中断或偶然事件或故意干扰的发生可能在使得数据在机密性或完整性方面不可能随后被处理或易受攻击的状态下生成数据的存储。例如,在微电路卡的领域中,希望确定在从已放置卡的读取器中有意地或偶然地不适时地拔出或撕裂卡的情况下,包含在该卡的闪存存储器中的数据是可靠的。在集成安全模块的电路中,不适时地拔出的等同效应对应于电路的断电。

管理闪存存储器中的操作还需要知道一条数据位于何处以及知道在何处写入新数据。实际上,扫描整个存储器是非常耗时的。



技术实现要素:

在实施例中,一种方法包括:使用存储器管理电路来控制将数据块写入非易失性存储器的数据帧的操作,该非易失性存储器被组织成页,其中,这些页被分成帧;以及使用该存储器管理电路来控制从该非易失性存储器的数据帧读取数据块的操作,其中,每个数据帧被配置成用于存储:至少一个数据块;以及至少一个第一元数据字,该至少一个第一元数据字包括与索引树中的至少一个数据块相关联的一个或多个索引值,索引值对应于该非易失性存储器中的数据帧的地址。在实施例中,对于每个索引级别,仅将源自前一个索引级别的值存储在该至少一个第一元数据字中。在一个实施例中,对于每个索引级别,仅将源自前一个索引级别的值和对应于当前数据帧的地址的值存储在该至少一个第一元数据字中。在实施例中,该非易失性存储器是闪存存储器,并且在包含该闪存存储器的电路的易失性存储器中处理一个或多个第一索引级别。在实施例中,该一个或多个第一索引级别的所有值被存储在每个页的元数据中。在实施例中,数据帧被顺序地写入页中。在实施例中,读取所需数据块包括:读取写入该非易失性存储器的最后一个数据帧;通过解译与这些数据帧的该至少一个数据块相关联的索引值,逐数据帧地回溯包含该所需数据块的数据帧。在实施例中,每个数据帧被配置成用于存储第二元数据字,该第二元数据字包括存储在该数据帧中的数据块的逻辑标识符。在实施例中,该第二元数据字包含表示至少基于该数据帧的数据块而计算的错误控制码的值。在实施例中,写入数据帧包括将值存储在该数据帧的第三元数据字中,其中,该值与要写入该数据帧的数据块的内容无关,并且对于给定的数据帧总是相同的。在实施例中,该第三元数据字对于该非易失性存储器的所有数据帧都具有固定值。在实施例中,每个页包括至少一个页元数据字,该至少一个页元数据字在写入页中时包含已写入页的数目的计数值,要被写入的页被选择为具有包含来自该非易失性存储器中的所有页中的已写入页的最高计数值的页元数据字的页。在实施例中,在将帧写入页之前,将该页元数据字写入该页。在实施例中,该方法包括由该存储器管理电路在该非易失性存储器的每次启动时验证最后一个写入的数据帧的原子性。

在实施例中,一种设备包括:非易失性存储器,该非易失性存储器被组织为页,这些页被分成帧;以及存储器管理电路,该存储器管理电路在操作中控制:将数据块写入该非易失性存储器的数据帧的操作;以及从该非易失性存储器的数据帧读取数据块的操作,其中,每个数据帧被配置成用于存储:至少一个数据块;以及至少一个第一元数据字,该至少一个第一元数据字包括与索引树中的至少一个数据块相关联的一个或多个索引值,索引值对应于该非易失性存储器中的数据帧的地址。在实施例中,该非易失性存储器是闪存存储器。在实施例中,对于每个索引级别,仅将源自前一个索引级别的值存储在该至少一个第一元数据字中。在实施例中,对于每个索引级别,仅将源自前一个索引级别的值和对应于当前数据帧的地址的值存储在该至少一个第一元数据字中。在实施例中,该设备包括:易失性存储器,其中,在该易失性存储器中处理一个或多个第一索引级别。在实施例中,该一个或多个第一索引级别的所有值被存储在该非易失性存储器的每个页的元数据中。在实施例中,数据帧被顺序地写入该非易失性存储器的页中。在实施例中,读取所需数据块包括:读取写入该非易失性存储器的最后一个数据帧;基于与相应数据帧的至少一个数据块相关联的索引值,以写入该非易失性存储器的最后一个数据帧开始,逐数据帧地回溯,以便标识包含该所需数据块的数据帧。在实施例中,每个数据帧被配置成用于存储第二元数据字,该第二元数据字包括存储在该数据帧中的数据块的逻辑标识符。在实施例中,该第二元数据字包含表示至少基于该数据帧的数据块而计算的错误控制码的值。在实施例中,写入数据帧包括将值存储在该数据帧的第三元数据字中,其中,该值与要写入该数据帧的数据块的内容无关,并且对于给定的数据帧总是相同的。在实施例中,该第三元数据字对于该非易失性存储器的所有数据帧都具有固定值。在实施例中,该非易失性存储器的每个页包含至少一个页元数据字,该至少一个页元数据字在写入页中时包含已写入页的数目的计数值,从用于写入操作的该非易失性存储器中的所有页中选择具有页元数据字的最高值的页。在实施例中,该存储器管理电路在操作中在该非易失性存储器每次启动时验证该非易失性存储器的最后写入的数据帧的原子性。

在实施例中,一种系统包括:一个或多个处理核,该一个或多个处理核在操作中处理数字数据;非易失性存储器,该非易失性存储器被组织为页,这些页被分成帧;以及存储器管理电路,该存储器管理电路在操作中控制:将数据块写入该非易失性存储器的数据帧的操作;以及从该非易失性存储器的数据帧读取数据块的操作,其中,每个数据帧被配置成用于存储:至少一个数据块;以及至少一个第一元数据字,该至少一个第一元数据字包括与索引树中的至少一个数据块相关联的一个或多个索引值,索引值对应于该非易失性存储器中的数据帧的地址。在实施例中,该非易失性存储器是闪存存储器。在实施例中,该一个或多个处理核在操作中处理事务数据。

在实施例中,一种非瞬态计算机可读介质,具有使一个或多个处理设备执行包括以下操作的方法:控制将数据块写入非易失性存储器的数据帧的操作,该非易失性存储器被组织成页,其中,这些页被分成帧;以及控制从该非易失性存储器的数据帧读取数据块的操作,其中,每个数据帧被配置成用于存储:至少一个数据块;以及至少一个第一元数据字,该至少一个第一元数据字包括与索引树中的至少一个数据块相关联的一个或多个索引值,索引值对应于该非易失性存储器中的数据帧的地址。在实施例中,对于每个索引级别,仅将源自前一个索引级别的值存储在该至少一个第一元数据字中。在实施例中,读取所需数据块包括:读取写入该非易失性存储器的最后一个数据帧;基于与写入该非易失性存储器的最后一个数据帧相关联的索引值来标识包含该所需数据块的数据帧。在实施例中,该方法包括在该非易失性存储器的每次启动时验证最后写入的数据帧的原子性。

闪存存储器中的数据存储管理需要改进,特别是为了保持暗示更新闪存存储器中的数据的某些事务的原子特性。

还需要改进对闪存存储器中的数据的访问。

实施例可以有助于解决已知的闪存存储器管理技术的全部或部分缺点。

实施例可以易于对闪存存储器中的数据的搜索。

实施例可以易于对闪存存储器中的事务的原子性的管理。

实施例提供了一种管理闪存存储器的方法,其中:

待存储的数据被组织在逻辑块中;

该存储器被分成页;

每个页被分成帧,每个帧能够包含至少一个数据块以及包含索引树中的数据块的全部或部分索引值的至少一个第一帧元数据块,索引值对应于帧的地址。

根据实施例,对于每个索引级别,仅存储源自前一个级别的值。

根据实施例,对于每个索引级别,仅存储源自前一个级别的除了对应于相关块的值之外的值。

根据实施例,在包含该闪存存储器的电路的易失性存储器中处理一个或多个第一索引级别。

根据实施例,该一个或多个第一索引级别的所有值被存储在每个页的元数据中。

根据实施例,将这些帧顺序地写入页中。

根据实施例,从数据块读取至少包括以下步骤:

读取写入该存储器的最后一帧;

通过解译这些帧的值,逐帧地回溯包含所需块的帧。

根据实施例,将逻辑块写入存储器与使用此逻辑块的标识符对第二帧元数据字进行编程一起进行。

根据实施例,该第二帧元数据字还包含表示至少从该帧的数据块来计算的错误控制码的值。

根据实施例,关于帧的写入,第三帧元数据字首先被写入与要写入的数据的内容无关的、并且对于给定的帧总是相同的值。

根据实施例,该第三元数据字对于存储器中的所有帧都具有固定值。

根据实施例,每个页包括至少一个页元数据字,其在写入页中时包含已写入页的数目的计数值,要被写入的页被选择为使其第一页数据字包含来自所有页中的已写入页的最大计数值。

根据实施例,在将第一帧写入页中之前,写入该第一页元数据字。

根据实施例,在每次启动时,存储器管理电路验证最后写入的帧的原子性。

实施例提供了根据在此公开的方法编程的闪存存储器。

实施例提供了一种包括闪存存储器的电子电路。

附图说明

图1以框的形式非常示意性地示出了电子电路的实施例;

图2示出了待存储在闪存存储器中的数据的逻辑组织的实施例;

图3示出了闪存存储器中的数据的物理组织的实施例;

图4示意性地示出了图3的存储器的帧结构的实施例;

图5非常示意性地示出了用于在闪存存储器中搜索数据的索引的结构的示例;

图6是示出将数据写入存储器的实施例的框图;

图7是示出在当前页已满时准备下一页用于写入操作的实施例的框图;

图8是示出从该存储器读取数据的实施例的框图;

图9是示出在页的级别的原子性恢复的实施例的框图;以及

图10是示出要擦除的页的选择的实施例的框图。

具体实施方式

在不同的附图中,除非上下文另有说明,否则相同的元件用相同的参考标号表示。

为了清楚起见,仅示出并且将详细描述对于理解将要描述的实施例有用的那些动作和元件。具体地,尚未详细描述在写入、读取和擦除操作期间闪存存储器的电子行为,所描述的实施例与常规闪存存储器技术兼容。此外,也没有被详细描述使用原子性管理的应用程序,所描述的实施例在这里也与常规应用程序兼容。

图1以框的形式非常示意性地示出了作为示例应用的将要描述的实施例类型的电子电路1的实施例。

电路1包括:

一个或多个处理单元11(pu),例如状态机、微处理器、可编程逻辑电路等;

一个或多个易失性存储区域12(ram)(例如ram或寄存器类型),用于在处理期间临时存储信息(指令、地址、数据);

一个或多个非易失性存储区域,包括用于持久存储信息的至少一个闪存型存储器2(flash),特别是当电路未被供电时;

耦合在电路1内部的不同元件之间的一个或多个数据、地址和/或控制总线14;以及

例如串行总线类型的与电路1外部通信的输入/输出接口15(i/o)。

电路1还可以集成近场通信类型(nfc)的非接触通信电路16(clf-无接触前端)。

此外,电路1可以根据应用集成由框17(fct)表示的其他功能,例如,密码处理器、其他接口、其他存储器等。

在配备有闪存存储器的电路中的事务的原子性的管理是特别的,因为闪存存储器根据操作类型不具有相同的处理粒度。具体地,在逐页执行擦除的同时,逐字地(一个字节或几个字节)执行写入。字的大小通常对应于接收串行数据的寄存器的大小,以将其并行传输到用于写入操作的存储器平面。页被定义为是能够被同时寻址以便被擦除的最小大小。通常,页当前在闪存存储器中包括64、128、256、512或1024字节。

闪存存储器被从任意指定为1的初始状态编程为状态0(单元的非导通状态)。这意味着这些存储器单元应当在高状态(擦除)中被初始化,并且为了存储数据片(在写入模式中),通过数据字对位状态采取动作(编程为0)或不采取动作(位状态为1)。

为了保证事务的原子性,数据片在闪存存储器中的存储只有在事务结束并且数据被称为稳定时才被认为是有效的。在实践中,当从非易失性存储器提取该数据时,原子性管理方法激活数据处理的指示符,并且随后组织该更新数据的存储,一旦处理结束,则该处理指示符切换状态。根据事务的性质,原子性可以涉及更大量或更小量的数据。

事务的原子性在银行类型事务(例如支付)的情况下特别重要,在这类事务中必须确定存储在闪存存储器中的信息(例如电子钱包的余额或购买授权的余额,或者验证事务的标识符)被可靠地存储。

通常,为了保证事务的原子性,用初始值进行更新并且随后用最终信息更新的原子性缓冲器被用于传输到主非易失性存储器中。

然而,在闪存存储器的情况下,由于其页粒度,难点是与逐字写入操作相比相对较长的擦除过程。具体地,需要指出已擦除页是稳定的,即它已被整体擦除。否则,在数据安全性中引入了弱点。此外,在需要利用被传送到新页的数据来擦除页的情况下,该传送可能导致存在于要擦除的页中的稳定数据变得不稳定。这更特别地出现在大页面(例如,具有几百字或更大量级的大小)中,因为大页面更可能包含被认为是稳定的且要被传送到新页的旧数据。

另一个难点在于知道一条信息在该存储器中的位置。实际上,通过执行(使用该存储器的应用程序的)程序而执行的逻辑寻址不同于该存储器中的物理寻址。现在,由于闪存存储器的写入和擦除粒度,出于空间的原因,不希望将地址转换表存储到实际闪存存储器中。然而,没有此表,则需要扫描(读取)整个存储器,直到找到所需的那条数据。另一种解决方案是在电路接通时从该存储器扫描(读取)一次以生成(计算)索引或查找表,然后将其存储在易失性存储器(ram)中。由于ram中的数据的易失性特性,应重新计算每次复位或通电时的表。这不仅对于每次启动都需要不可忽略的计算时间,而且所计算的表在ram中占据了相当大的空间。

在无接触式应用中,由于通信的逸度,必须非常迅速地执行事务,这取决于电路1可以与终端通信的时间。现在,由于授权编程所必需的擦除操作,通过使用闪存存储器缓冲器来管理事务的原子性花费时间。此外,管理对合适的数据的访问也花费时间。

根据将要描述的实施例,提供以特定方式组织数据到存储器中的存储。

图2示出了待存储在闪存存储器中的数据的逻辑组织的实施例。换句话说,此图示出了由处理单元11和图1的电路1的不同实体管理数据以将其存储到闪存存储器中的方式。下文中参考负责组织其寻址、写入、读取和擦除以及逻辑地址到物理地址的转换的存储器管理电路。这种管理电路或单元是根据所描述的方法的实现而编程的电路,并且可以是例如处理单元。

根据本实施例,表示闪存存储器的存储容量的数据的组合被看作块b1、b2等中的单个数据阵列2v,并且每个块bi包含相同数量的字w。在图2所示的示例中,假定每个数据块bi包含四个字w1、w2、w3和w4。字的大小对应于闪存存储器中的写入粒度,即在实践中从一个字节到几个字节(例如四个字节)。然而,这是任意的示例,并且任何其他数量的一个或多个字节可以形成字,并且任何其他数量的一个或多个字可以形成块。因此,该闪存存储器的逻辑划分不是逐页地执行,而是由其大小与页面大小无关的的块b来执行。

待存储到存储器2中的数据a包括任意数量的字节,与块的大小无关。从逻辑的观点来看,也就是说,对于处理单元11,数据由长度l(a)来定义,即由字节数来定义,并且其在块bi的阵列2v中的位置由偏移量o(a)来定义,即从阵列2v的开始的偏移量。

图3示出了闪存存储器中的数据的物理组织的实施例。

逻辑组织(图2)与数据存储器的物理组织之间的转换对于处理单元11以及访问该存储器的其他电路都是透明的。用于管理存储器2的单元通过使用索引或查找表将由不同实体提供的虚拟地址转换为物理地址。此外,为了管理原子性,该管理单元生成元数据,该元数据也存储在存储器2中。

为了符合擦除约束,在页p中物理地组织该存储器,表示擦除粒度。因此,该存储器被划分为具有相同大小的r页p。每页包括相同数量的字,形成写入(和读取)粒度。这些页可以被分为两种类别。

第一类别包括被分成n个帧fj的页p1,每帧包括多个数据字(组合dbj)和相同数量的帧元数据字fmdj(从一个到几个,例如三个)。例如,所有帧都包括相同数量的数据字。每个页pl还包括独立于帧的m个(从几个到几十个)页元数据字pmd1(k)。每个帧的数据字的数量可以对应于该存储器的虚拟组织的每个块db的数据字的数量的整数倍(至少是1)。因此,帧fj包含数据块dbj和帧元数据fmdj。在图3中,已经针对每个帧示出了块dbj,其后是元数据fmdj。然而,如下文将看到的,该元数据的一部分可以被写在每个帧fj的开始处。

其数量比第一类别的页pl的数量少得多的第二类别的页仅包含存储器元数据字mmdh。

如所展示的,第二类别包括单个页pr,并且第一类别因此包括r-1个页pl。

作为变体,仅提供第一类别的页。

根据示例实施例,页包含1024个字节,第一类别的r-1页p1,各包含25帧,每帧10个字,并且提供6个页元数据字pmd1。每帧fj包含八个数据字w的块dbj和三个帧元数据字fmdj。此外,提供存储器元数据字mmdh的单个页pr。

这是具体示例,并且可以提供其他粒度。所有字可以具有相同的大小,表示存储器中的写入粒度。具体地,可以提供大小(字数)可变的逻辑块bi,其然后能够在多个帧中分布到多个块dbj中。作为变体,元数据字具有不同的大小以获得空间,特别是如果数据的大小较小。

帧元数据fmdj包含固定值的至少一个字fconst(例如,单个字fmdj(1)),其可以是相同的,无论块dbj中包含的数据的值如何,以及包含写入实际块dbj中的(多个)虚拟块bi的(多个)编号((多个)标识符i)的至少一个字(例如单个字fmdj(2))。字fmdj(2)还包含块dbj的状态指示符fw(写入结束)和crc型错误控制码。帧元数据用于帧原子性,即,它们指示包含在该帧中的块dbj是否稳定。这两个帧元数据字fmdj(1)和fmdj(2)用于原子性管理。

帧元数据fmdj还包含其含有一个或多个索引值的至少一个字(例如字fmdj(3))。这些索引值使得能够从最后更新的帧回溯到所需的块。

图4示意性地示出了假设三个元数据字fmdj的帧fj的结构4的实施例。

根据此实施例,首先写入固定值fconst的元数据字fmdj(1),然后是元数据或索引字fmdj(3)、数据a的字,然后是元数据字fmdj(2)。作为变体,索引字fmdj(3)存储在数据a的字和元数据字fmdj(2)之间。包含在字fmdj(2)中的crc码例如可以是字fmdj(1)和fmdj(3)的crc以及块dbj的crc。由于使用字fmdj(1)的固定值,可以确定在帧的写入开始时没有不适时的拔出或攻击,例如在攻击期间尝试修改块dbj的内容。该值是固定的,即,对于给定帧是相同的,但是可以从一帧到另一帧变化。在实施例中,为了简化,该值对于所有存储器帧可以是相同的。

然后在读取操作期间使用元数据fmdj(3)更快速地找到数据,而不是在开始时计算ram中的完整查找表或者扫描整个闪存存储器。优点实际上取决于闪存存储器中存储的特性,以将其约束转换为优点。实际上,逐页地、逐帧地执行写入存储器使得能够从读取最后一帧和索引元数据fmdj(3)来回溯包含任何块的更新值的帧。对于每个帧,索引元数据fmdj(3)根据索引的大小(系统中的逻辑块的总数)表示一个或多个字。

图5非常示意性地示出了使其值形成元数据fmdj(3)的索引的结构的示例。如图所示,假设存在八个块b1到b8并且使用二进制索引来定义最后更新的块的相应位置。

每次将块bi写入帧中具有三个相关联的索引级别。

第一级索引i1包括一对值i1l和i1r,表示两个分别包含块b1至b4和b5至b8中的最后更新的块的帧的地址。因此,这两个帧地址中的一个是当前帧的地址。例如,假设该写入涉及块b4(i=4),值i1l对应于当前帧的地址。

第二级索引i2包括一对值i2l和i2r,表示两个分别包含包括块bi的两对块b1-b2(i2l(i1l))和b3-b4(i2r(i1l))或b5-b6(i2l(i1r))和b7-b8(i2r(i1r)中的最后更新的块的帧的地址。继续图4的示例,索引i2包含两个分别包含块b1、b2和b3以及b4中的最后更新的块的帧的地址。同样,这两个地址帧(在这里是值i2r)之一对应于当前帧的地址。

第三级索引i3包括一对值i3l和i3r,表示两个分别包含前一级(在这里是2)索引有关的每对块的两个块中的最后更新的块的帧的地址f(bi)。继续图5的示例,索引i3包含两个包含块b3至b4中的最后更新的块的帧的地址f(b3)和f(b4)。这两个地址帧之一(在这里是值fb(4))对应于当前帧的地址。

在读取更多时,通过简单地读取帧元数据fmdj(3),这样的组织使得能够逐帧地回溯包含所需块的帧。在三级索引的示例中,需要读取以找到该块的最大帧数是三。

通过标识最后写入的帧的地址并通过验证最后写入的帧的内容是有效的来开始。下文将讨论用于搜索最后写入的帧并验证其内容的实施例。然而,所描述的索引技术更普遍地应用于不一定包括验证原子性的其他闪存存储器存储应用。

对于块bi的搜索,从最后写入的帧读取帧元数据fmdj(3)。

检查与搜索到的块相对应的第一级i1的值(例如,对于块b4,值i1l)。如果这个值对应于当前地址,则检查第二级的值。否则,停止当前帧的检查,并且采用第一级值作为要读取的下一帧的地址,并且返回到检查第一级索引值。在这里,这个值必须对应于当前地址。因此,作为变体,可以直接进行第二级值的检查。

然后,如果与搜索到的块(在这里是i2r(i1l))相对应的读取帧的第二级值i2对应于当前地址,则检查第三级值。否则,停止当前帧的检查,并且采用第二级值作为要读取的下一帧的地址,并且返回到读取第一级索引值。在这里,第一级的值以及第二级的值必须对应于当前地址。因此,作为变体,可以直接进行到第三级值的检查。

最后,如果对应于搜索到的块(在这里是f(b4)或i3r)的读取帧的第三级值i3对应于当前地址,则从当前帧读取块bi。否则,采用第三级值作为包含搜索到的块bi的帧的地址。即使可以通过检查新读取帧的索引值来执行验证,原则上肯定它是正确的。

根据替代实施例,存储在每个索引级中的两个地址之一对应于当前帧的地址是有利的。因此可以避免对其进行存储。因此,每级仅存储一个索引值(更普遍地,小于索引树朝向下一级的分支的数量的一个值),即其对应于另一个块子组的地址(以块b4为例,仅存储值i1r、i2l(i1l)和f(b3))。这样有助于减小索引存储的大小,并且从而减小帧的大小。

尽管可以使用在索引所需的存储空间方面是最佳折衷的二进制树,但是这个原理也可以更普遍地应用于任何树的划分。(当前级别与下一级别之间的分支的)每个级别的值的数量对于所有级别不一定是相同的。这种选择取决于所需的索引值大小和所需的索引数量。对于给定数量的块,块数越大,则要读取以到达该块的最大帧数越大,但是帧的大小越小。每个级别的值的数量越大,则读取越快(更快地找到右侧块),但是帧的大小越大。

根据索引的替代实施例,一部分索引在ram中使用,并且一部分(一个或多个最后级别的)索引在如上所述的闪存存储器中使用。即使索引在ram中的存储强制存储所有的值,即整个级别,由于每个级别的值的数量随着级别增加而增加,因此可以选择将第一级别存储在ram中。例如,待存储具有二进制索引的1024个块,五个第一树级包含总共32个值,而五个下一级包含总共992个值。优点在于,这样减少了读取时间,因为这样减少了要从闪存存储器读取的帧的最大数量。

在这种情况下,这些第一级的所有值被存储在该闪存存储器的每个新页的元数据中。这样使得能够避免必须对在开始重建索引时对所有页进行分析。实际上,复制当前页的索引元数据然后分析(在当前页中)所编程的帧以恢复整个索引就足够了。

根据实施例,页元数据pmd1(图3)至少包含:

指示该页已经开始被写入并且其不再为空白的字pmd1(1);

可选地,指示该页已满的字pmd1(2);

指示下一页已被擦除(并因此为空白)的字pmd1(3);

指示该页已过时(即没有帧包含仍然有用的块,换句话说,该页中的所有块已经随后在其他页中被修改)的字pmd1(4);以及

包含页序编号(即已写入页的数量的计数器pwn的值)的字pmd1(5)。

根据这个示例的页元数据用于指示从一页到另一页的切换,并且允许在电路开始或重置时恢复原子性。这些字在页中不一定物理上按照这个顺序。

根据另一个实施例,除了指示该页已经被擦除的字pmd1(3)之外或代替字pmd1(3),该页元数据还包含指示已经应用于该页的擦除操作的数量的字pmd1(6)。

根据实施例,该页元数据包含一个或多个附加字pmd1(7)以存储一个或多个第一索引级别的索引表。

每次,当在读取模式下从一帧到另一帧回溯一个块时,将其传递到另一个页,从页元数据pmd1(7)读取第一级,并且将其存储在ram中,以通过从ram的读取来解译第一级来开始。

逻辑大小与该存储器的物理组织之间的联系是所有字具有相同的大小。记住,当一个字是空白(擦除)时,其所有位都处于第一状态(例如指定为高或1)。对字进行编程以在其中存储值包括选择应该切换状态并被写入的字的字节的位(例如,切换到低或0)。对标志位或指示符的编程包括将该字节的(多个)位编程到对应于低状态的状态。如上所讨论的,一旦字的位被写入或编程为状态0,就不能修改该字的内容,除非整个页都被擦除和重新编程。

将数据写入该存储器是在它们被接收时逐块地执行的,并且连续地写入每页中。因此,在相同逻辑块的连续写入(例如,计数器的值)的情况下,这个相同的数据块bi可能结束随着写入操作以不同的值被多次写入该存储器。这涉及原子性问题的解析度,因为从数据片a已经以第一值被写入一次开始,在随后的写入操作中,可以总是返回到在当前值的写入问题的情况下表示稳定状态的前一个值。

然而,在逻辑存储器2v一侧,同一数据片a“存储”在同一块bi(或相同块)中。因此,该逻辑存储器中块bi的标识符i(地址)使得能够找到包含数据a(包含数据a的连续值)的存储器2的(多个)物理块dbj。

为了简化,下文通过任意地假设所考虑的数据a占据同一块bi并且块dbj具有块bi的大小来讨论操作。然而,更普遍地描述的所有内容适用于数据a可以占据多个块或一部分块以及块bi和dbj的不同大小的实际情况。

图6是示出将数据a写入存储器2的实施例的框图。

基于虚拟阵列2v(图2)中的数据a的长度l(a)和偏移量o(a),该存储器管理电路确定(框51,i=f(l(a),o(a)包含数据的块dbi的标识符i。

然后(框52,选择1(max(pwn))),通过扫描(读取)页元数据的相应字pmd1(5)来选择具有最高数量的已写入页pwn的页p1。

然后(框53,选择j),标识在页p1中顺序可用的第一帧fj。例如通过连续扫描这些帧直到达到具有用于未编程的固定值fconst的字fmdj(1)的第一帧来执行这样的选择。作为变体,读取第二元数据字fmdj(2),并且选择具有处于状态1的写入结束fmdj指示符fw或具有未编程的块标识符i的第一帧。在这个示例中,假设在页的最后一帧写入结束时打开新页。因此,在步骤53必然找到可用帧。

作为变体,如果没有帧是空闲的,则这意味着该页是满的。然后执行新的页打开子程序。下面将结合图7讨论这个子程序。

一旦选择了帧fj,就通过将第一固定元数据字fmdj(1)写入帧fj(框54,fconst>fmdj(1))来开始。它实际上是第一个逻辑写入的字。在物理上,这些字在该帧中可以是不同的顺序。然后(框55,a>dbj),数据片a被写入块dbj,其后(框56,(i,fw,crc)>fmdj(2)),第二元数据字fmdj(2)被写有标识符i、写入结束指示符fw和该帧的第一个字(fmdj(1)和dbj)的crc。(多个)索引元数据字fmdj(3)也被写入,并且可以在字fmdj(2)之前被写入,使得在原子性验证中考虑该索引。

然后检查该页是否是满的,即是否存在可用于下一次写入操作的帧fj(框57,存在下一个j?)。若是(框57的输出y),则写入结束(框58,end)。在数据a可以表示多个块dbi的情况下,返回到步骤53以写入下一帧。在更普遍的这些帧具有可变的大小并且在该页结束处可用的空间不足以存储下一帧的情况下,留下空闲空间,或者该帧被分成两部分,一部分存储在当前页上,而另一部分存储在下一页中。

如果该页上没有可用帧(框57的输出n),即如果没有另外的可用帧,则为下一次写入操作准备下一页(框60,下一个l)。为了简化,考虑准备下一页的情况(以1递增的索引l),但是更普遍地可以设为将多个页链接在一起,以便加速多个块的写入速度,而没有中间擦除操作。在这种情况下,设为当页已满时跳过一页或多页。

图7是示出在当前页已满时准备下一页用于写入操作的实施例的框图。

通过关闭当前页(即通过对其页尾或全页元数据字pmd1(2)进行编程)来开始(框61,1>pmd1(2))。然后(框62,选择下一个l),选择可用的(即过时的)下一页p1。随后在对应的页元数据字pmd1(5)中对以1递增的已写入页的数量的值进行编程(框63,pwn+1>pmd1(5)),并且还对该页打开指示符进行编程(框64,1>pmd1(1))。

通过这种写入存储器2的过程,在读取模式中,可以找到每条数据的最后一个原子事务。

图8以框图的形式示出了来自存储器2的数据片a的原子读取的实施例。

基于虚拟阵列2v中的数据a的长度l(a)和偏移量o(a),该存储器管理电路确定(框71,i=f(l(a),o(a)包含数据的块bi的标识符i。如上所述,从最后写入的页的最后写入的帧而逐帧地执行从存储器进行读取(框72,在fmdj(2)中搜索i)。

对于每个读取帧,验证状态指示符fw(框73,fwok?),该状态指示符fw指示该帧写入是否已经结束而没有不适时地拔出,原则上指示该数据是否稳定。

如果该状态指示符无效(框73的输出n),则将这些帧一直扫描回到包含前一个版本的数据块dbj的帧(框72)。

如果该状态指示符有效(框73的输出y),则通过对存在于第一元数据字fmdj(1)和数据块dbj中的数据重新计算crc来验证错误代码(框74,crcok?)。

如果计算的代码与存储的代码完全相同(框74的输出y),则数据块dbj有效,并且该读取(框75,返回a=dbj)将块dbj的值提供为数据a,并且因此作为虚拟块bi的内容。

如果crc码未被确认(框74的输出n),则这意味着该数据不可靠。然后将该存储器向后扫描(框72)以找到该数据的前一次写入,这相当于搜索最后一个原子事务。

为了扫描回前一帧,基于最近页(最近写入)的元数据并基于写入这个最近帧的帧来恢复索引。

作为变体,当标识具有错误crc的帧时(框74的输出n),将帧被污染的指示符写入第二元数据字fmdj(2)中。这在下一次读取数据a时节省了一些时间,因为其避免在回溯下一次发生之前重新计算crc。

图9是示出在页的级别的原子性恢复的实施例的框图。

实际上,这个过程在电路的启动或复位时进行,这相当于在每次偶然的或有意的不适时地拔出或断电之后验证原子性。

通过选择(框81,选择1(max(pwn)))具有已写入页的数量的最大计数值的页来开始。然后,选择写入这页中的最后一帧(框82,选择j)。然后读取第二元数据字fmdj(2),并且验证写入指示符fw是正确的(被编程的)(框83,fwok?)。若是(框83的输出y),则不存在原子性问题,并且在到该闪存存储器的写入处理已经结束时发生了断电或复位。然后进行正常操作,即原子性验证过程结束(end)。作为变体,为了确保在写入结束时没有不适时地拔出并且保证字fmdj(2)的稳定性,在字fmdj(2)中重新编程相同的值。

若否(方框83的输出n),则这意味着在写入该闪存存储器期间发生了不适时的拔出(电源切断或复位)。根据实施例,然后使用页pr将页p1的所有有效帧传送到页pr(框84,传送dbj(p1)>dbj'(pr))。然后,擦除页p1(框85,擦除p1)。复制到页pr并且然后从页pr再次复制的不同步骤由页pr中的元数据字来验证,以确保在恢复过程期间不适时地拔出的情况下有效地继续启动过程,并且确保不会从不适时地拔出过程开始时重新开始而具有最终丢失页面p1中仍然有效的数据的风险。

根据实施例,页pr是专用存储器页。然后,执行临时存储在页pr中的数据到已擦除页pl的反向传送(框86,传送dbj'(pr)>dbj(p1))。然后,这些页元数据也被重写。最后,页pr被擦除(框87,擦除pr)以准备下一次使用。

根据另一个实施例,页pr是任何可用页。在这种情况下,在擦除之后不需要将数据传送到页pl。

在实施例中,图9的过程还包括验证该页元数据的原子性。为了实现这一点,在重新开始并且在最后写入的页上,验证存储在页元数据字pmd1(k)之一中的错误校正码。

在实施例中,在步骤84之前,已经写入在框82处选择的帧fj之后的所有页的元数据字pmd1(2)被写入为指示整页。因此,这些页不能在不被擦除的情况下被使用。

根据仅使用第一类页的变体,可以避免在检测到错误帧之后将可靠帧复制到新页中。实际上,在读取模式中无论如何都将不考虑关键帧,并且将读取前一个的可靠数据。然而,这样因为保持丢失的帧而在其可以承受的不适时地拔出的数量方面减少了存储器的容量。

可用(已擦除)页的数量至少为两个,以使能够对页进行擦除。当不存在另外的可用页(除了两个最小页之外)时,选择已写入页之一,例如已写入帧的数量为最小的页。然后通过验证其要擦除的页的帧和包含块bi的最后可靠状态的那些帧来扫描要擦除的页。如关于图6所述,所有这些块被传送(写入)到可用页之一中。因此,最多传送n个块(在实践中,至少存在包含过时数据的某些帧,使得这次传送产生这页中的可用帧)。一旦传送结束,原始页就被擦除。一旦已经执行擦除,就对已擦除页指示符pmd1(4)进行编程。

作为变体,设置大于(例如大于三或四的)最小页数以具有更多可用帧,以便存储更大数量的事务而无需擦除。

图10是示出要擦除的页的选择的另一个实施例的框图。

为了擦除页p1(擦除p1),如上所述,通过将其具有表示数据片的最后稳定值的内容的页面p1的所有数据块dbj传送到可用存储页面之一的块dbj'(p1')(框91,传送dbj(p1)>dbj'(p1'))来开始。在前一页的元数据字中存储页擦除操作的次数的计数器npe(框92,tempnpe),之后擦除页p1(框93,擦除p1)。一旦执行了擦除,就对元数据字pmd1(6)进行编程(框94,npe+1>pmd1(6))到以一递增的擦除操作次数的值。

根据本实施例,要擦除的页的选择不一定对应于具有已写入页的最小数量的页,而是对应于具有已经提交到较少次数的擦除操作的页中的已写入页的最小值的页。

本实施例的应用使得能够通过优化页数中的擦除操作的次数的均匀性来优化闪存存储器的寿命。实际上,如果没有原子性恢复处理,则具有已写入页最大数量的页将在已被擦除较少次数的那些页中。然而,由于在页的级别上应用原子性恢复处理而导致相同的已写入页数的值被传送到可用页中,所以这不一定对应,特别是在原子性恢复的大量实现的情况下。

应当注意,虽然此第二方面可以与第一方面组合,但是其也可以更普遍地在任何闪存存储器管理方法中实现。

实施例的另一个优点在于,在诸如关于图9所描述的页的级别上实现原子性恢复处理的情况下,存在该错误处于已写入页的数量级别的风险,在这种情况下,这页有风险,而没有实现擦除操作次数的计数,从而永远不会被擦除。

实施例可以有利地改进用于处理必须遵守原子性准则的操作的闪存存储器的管理。

实施例可以容易地回溯数据片的最后一个原子值。

实施例可以促进快速搜索包含搜索到的数据的页,而无需利用地址查找表在ram中占用太多的空间。

对于不希望在帧级验证原子性的情况,帧元数据可以仅包含索引信息。在这种情况下,原子性验证可以或可以不维持在页面级别。

已经描述了各种实施例。本领域技术人员将容易想到各种变化、修改和改进。此外,所描述的实施例的实际实现方式基于上文给出的功能指示并且通过使用通常其本身的电路在本领域技术人员的能力之内。特别地,该存储器寻址的组织和适于控制该存储器和这种寻址的信号的产生使用通常其本身的技术。

这样的改变、修改和改进旨在是本公开的一部分,并且旨在处于本公开的精神和范围内。因此,前面的描述仅仅是示例性的,而不是限制性的。本公开仅如在以下权利要求书及其等效物中所限定的那样进行限制。

一些实施例可以采取计算机程序产品的形式或包括计算机程序产品。例如,根据一个实施例,提供了一种包括适于执行上述方法或功能中的一个或多个方法或功能的计算机程序的计算机可读介质。该介质可以是物理存储介质,诸如例如只读存储器(rom)芯片,或诸如数字通用盘(dvd-rom)、光盘(cd-rom)、硬盘、存储器、网络或便携式媒体文件的磁盘,以由适当的驱动器或经由适当的连接来读取,包括编码为一个或多个条形码或存储在一个或多个这样的计算机可读介质上并且可由适当的读取器设备读取的其他相关代码。

此外,在一些实施例中,可以以其他方式来实现或提供一些或所有方法和/或功能,如至少部分地在固件和/或硬件中,包括但不限于一个或多个专用集成电路(asic)、数字信号处理器、分立电路、逻辑门、标准集成电路、控制器(例如,通过执行适当的指令,并且包括微控制器和/或嵌入式控制器)、现场可编程门阵列(fpga)、复杂可编程逻辑器件(cpld)等以及采用rfid技术的器件及其各种组合。

以上所描述的各实施例可以被组合以提供进一步的实施例。如果有必要,可以对实施例的各方面进行修改,以采用各专利、申请和公开的概念来提供更进一步的实施例。

鉴于以上详细说明,可以对实施例做出这些和其他改变。总之,在以下权利要求书中,所使用的术语不应当被解释为将权利要求书局限于本说明书和权利要求书中所公开的特定实施例,而是应当被解释为包括所有可能的实施例、连同这些权利要求有权获得的等效物的整个范围。因此,权利要求书并不受本公开的限制。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1