具体实施方式
快闪存储器系统概述
参看图1-8描述当前快闪存储器系统及其与主机装置的典型操作。在这种系统中可实施本发明的各方面。图1的主机系统1将数据存储到快闪存储器2中并从快闪存储器2中检索数据。尽管快闪存储器可内嵌在主机内,但存储器2图示为采用较普遍的卡的形式,其通过机械和电连接器的匹配部分3和4而可移除地连接到主机。当前存在市售的许多不同的快闪存储卡,实例为CompactFlash(CF)、多媒体卡(MMC)、安全数字(SD)、miniSD、存储棒、智能媒体和TransFlash卡。尽管这些卡的每一者具有根据其标准化规格的独特的机械和/或电接口,但每一者中包含的快闪存储器非常类似。这些卡全部可从作为本申请案的受让人的SanDisk公司购得。SanDisk还在其Cruzer商标下提供一系列快闪驱动器,其是小封装中的手持式存储器系统,且具有用于通过插入主机的USB插口中而与主机连接的通用串行总线(USB)插头。这些存储卡和快闪驱动器的每一者包含控制器,所述控制器与主机介接并控制其内部的快闪存储器的操作。
使用此类存储卡和快闪驱动器的主机系统多种多样。其包含个人计算机(PC)、膝上型和其它便携式计算机、蜂窝式电话、个人数字助理(PDA)、数字静态相机、数字电影摄影机和便携式音频播放器。主机通常包含用于一种或一种以上类型的存储卡或快闪驱动器的内置插口,但一些主机需要可在其中插入存储卡的适配器。
图1的主机系统1可视为具有两个主要部分,就存储器2来说,由电路与软件的组合构成。它们是应用程序部分5和与存储器2介接的驱动器部分6。举例来说,在个人计算机中,应用程序部分5可包含运行文字处理、图形、控制或其它通用的应用程序软件的处理器。在相机、蜂窝式电话或主要专用于执行单个组的功能的其它主机系统中,应用程序部分5包含操作相机以拍摄和存储图片、操作蜂窝式电话以拨打和接听电话等的软件。
图1的存储器系统2包含快闪驱动器7和电路8,其均与和卡连接的主机介接以便来回传递数据并控制存储器7。控制器8通常在数据编程和读取期间在主机1所使用的数据的逻辑地址与存储器7的物理地址之间进行转换。
参看图2,描述可用作图1的非易失性存储器2的典型快闪存储器系统的电路。系统控制器通常实施在单个集成电路芯片11上,所述芯片11通过系统总线13与一个或一个以上集成电路存储器芯片并联连接,图2中展示了单个此类存储器芯片15。所说明的特定总线13包含用于携带数据的单独组导体17、用于存储器地址的组19,和用于控制及状态信号的组21。或者,可在这三个功能之间分时共享单组导体。此外,可使用系统总线的其它配置,例如2004年8月9日申请的题为“Ring Bus Structure and It′s Use inFlash Memory Systems”的第10/915,039号美国专利申请案中所描述的环形总线。
典型控制器芯片11具有其自身的内部总线23,所述内部总线23通过接口电路25与系统总线13介接。通常连接到总线的主要功能件是处理器27(例如,微处理器或微控制器)、含有代码以初始化(“启动”)系统的只读存储器(ROM)29、主要用于缓冲存储器与主机之间传递的数据的随机存取存储器(RAM)31,和为通过存储器与主机之间的控制器的数据计算并检验误差校正码(ECC)的电路33。控制器总线23通过电路35与主 机系统介接,在图2的系统包含在存储卡内的情况下,所述介接通过作为连接器4的一部分的卡的外部接触件37来完成。时钟39与控制器11的其它组件的每一者连接并由所述组件的每一者利用。
存储器芯片15以及与系统总线13连接的任何其它存储器芯片通常含有组织成多个子阵列或平面的存储器单元的阵列,为了简单起见说明了两个此类平面41和43,但可改为使用例如四个或八个此类平面的更多平面。或者,芯片15的存储器单元阵列可不划分为平面。然而,当如此划分时,每一平面具有其自身的可彼此独立操作的列控制电路45和47。电路45和47从系统总线13的地址部分19接收其各自的存储器单元阵列的地址,并对所述地址进行解码以寻址各自位线49和51中的特定一者或一者以上。响应于地址总线19上接收的地址而通过行控制电路55对字线53进行寻址。源电压控制电路57和59也与各个平面连接,p阱电压控制电路61和63也是如此。如果存储器芯片15具有单个阵列的存储器单元,且如果系统中存在两个或两个以上此类芯片,那么每一芯片的阵列可与上述多平面芯片内的平面或子阵列类似地操作。
数据通过与系统总线13的数据部分17连接的各个数据输入/输出电路65和67而传递到平面41和43中以及从平面41和43传出。电路65和67用于通过经由各自的列控制电路45和47连接到平面的线69和71,将数据编程到其各自平面的存储器单元中以及从存储器单元读取数据。
尽管控制器11控制存储器芯片15的操作以对数据进行编程、读取数据、擦除并处理各种内务处理问题,但每一存储器芯片还含有某一控制电路,其执行来自控制器11的命令以执行此类功能。接口电路73连接到系统总线13的控制和状态部分21。来自控制器的命令提供到状态机75,状态机75接着提供对其它电路的特定控制以便执行这些命令。如图2所示,控制线77-81将状态机75与这些其它电路连接。来自状态机75的状态信息通过线83而传送到接口73以便通过总线部分21传输到控制器11。
存储器单元阵列41和43的NAND结构当前是优选的,但也可改为使用例如NOR的其它结构。NAND快闪存储器的实例及其作为存储器系统的一部分的操作可参考第5,570,315、5,774,397、6,046,935、6,373,746、6,456,528、6,522,580、6,771,536和6,781,877号美国专利,以及第2003/0147278号美国专利申请公开案。
示范性NAND阵列由图3的电路图说明,其是图2的存储器系统的存储器单元阵列41的一部分。提供大量全局位线,为了阐释的简单起见,图2仅展示四个此类线91-94。许多串联连接的存储器单元串97-104连接在这些位线中的一者与参考电位之间。使用存 储器单元串99作为代表,多个电荷存储存储器单元107-110与串的任一端处的选择晶体管111和112串联连接。当致使串的选择晶体管传导时,串连接在其位线与参考电位之间。接着一次编程或读取所述串内的一个存储器单元。
图3的字线115-118分别延伸越国存储器单元的许多串的每一者中的一个存储器单元的电荷存储元件,且栅极119和120控制串的每一端处的选择晶体管的状态。使共享共用字线和控制栅极线115-120的存储器单元串形成一起擦除的存储器单元的区块123。此单元区块含有物理上可一次擦除的最小数目的单元。一次对沿着字线115-118的一者的一行存储器单元进行编程。通常,以规定的次序对NAND阵列的行进行编程,在此情况下以沿着字线118的最接近串的连接到接地或另一共用电位的末端的行开始。接着对沿着字线117的所述行存储器单元进行编程,依此类推,贯穿区块123。最后对沿着字线115的行进行编程。
第二区块125是类似的,其存储器单元串连接到与第一区块123中的串相同的全局位线,但具有不同的一组字线和控制栅极线。字线和控制栅极线通过行控制电路55而驱动到其适当操作电压。如果系统中存在一个以上平面或子阵列,例如图2的平面1和2,那么一个存储器结构使用在其间延伸的共用字线。或者,可存在共享共用字线的两个以上平面或子阵列。在其它存储器结构中,单独驱动各个平面或子阵列的字线。
如上文引用的NAND专利和公开申请案的若干者中所述,可操作存储器系统以在每一电荷存储元件或区域中存储两个以上可检测的电荷电平,借此在每一者中存储一个以上数据位。存储器单元的电荷存储元件最通常地是传导浮动栅极,但或者可以是非传导介电电荷俘获材料,如第2003/0109093号美国专利申请公开案中所述。
图4概念上说明在以下进一步描述中用作实例的快闪存储器单元阵列7(图1)的组织。存储器单元的四个平面或子阵列131-134可在单个集成存储器单元芯片上,在两个芯片上(每个芯片上两个平面)或在四个单独芯片上。特定布置对于下文的论述并不重要。当然,系统中可存在其它数目的平面(例如,1、2、8、16或更多)。平面分别划分为图4中由矩形展示的存储器单元的区块,例如位于各个平面131-134中的区块137、138、139和140。每一平面中可存在数十或数百个区块。如上文所提及,存储器单元的区块是擦除单位,即物理上可一起擦除的最小数目的存储器单元。然而,为了获得提高的并行性,区块以较大元区块单位操作。来自每一平面的一个区块逻辑上链接在一起以形成元区块。图示四个区块137-140形成一个元区块141。元区块内的所有单元通常一起擦除。用于形成元区块的区块无需限于其各自平面内的相同相对位置,如由区块145- 148组成的第二元区块143中所示。尽管通常优选的情况是使元区块延伸越过所有平面,但为了获得较高系统性能,存储器系统可以动态地形成不同平面中的一个、两个或三个区块中的任一者或全部的元区块的能力操作。这允许元区块的大小与在一个编程操作中可用于存储的数据的量更紧密地匹配。
各个区块为了操作目的又划分为存储器单元页,如图5所说明。举例来说,区块131-134的每一者的存储器单元各划分为八页P0-P7。或者,每一区块内可存在16、32或更多的存储器单元页。页是区块内的数据编程和读取的单位,其含有一次编程的最少量的数据。在图3的NAND结构中,页由区块内沿着字线的存储器单元形成。然而,为了提高存储器系统操作并行性,两个或两个以上区块内的这些页可逻辑上链接为元页。图5中说明元页151,其由来自四个区块131-134的每一者的一个物理页形成。举例来说,元页151包含四个区块的每一者中的页P2,但元页的页无需在区块的每一者内必定具有同一相对位置。尽管优选的情况是在所有四个平面上并行编程和读取最大量的数据,但为了获得较高系统性能,也可操作存储器系统以形成不同平面中的单独区块中的一个、两个或三个页中的任一者或全部的元页。这允许编程和读取操作与可便利地并行处理的数据的量适应性地匹配,并减少元页的一部分仍未用数据编程的情况。
如图5所说明,由多个平面的物理页形成的元页含有沿着那些多个平面的字线行的存储器单元。不是同时编程一个字线行中的所有单元,而是更一般的是在两个或两个以上交错的群组中对其进行交替编程,每一群组存储数据页(单个区块中)或数据元页(跨越多个区块)。通过一次编程交替的存储器单元,无需为每一位线提供包含数据寄存器和读出放大器的外围电路的单元,而是所述外围电路的单元在邻近位线之间分时共享。这节约了外围电路所需的衬底空间的量,并允许以增加的密度沿着行压缩存储器单元。另外,优选沿着行同时编程每一单元以便使可从给定存储器系统获得的并行性最大化。
参看图3,最便利地通过沿着NAND串的至少一个末端提供两行选择晶体管(未图示)而不是所示的单行来实现沿着行同时将数据编程到每隔一个存储器单元中。接着,一行的选择晶体管响应于一个控制信号将区块内的每隔一个串连接到其各自的位线,且另一行的选择晶体管响应于另一控制信号将居间的每隔一个串连接到其各自的位线。因此,将两页数据写入到存储器单元的每一行中。
每一逻辑页中的数据的量通常是整数个的一个或一个以上数据扇区,按照惯例,每一扇区含有512字节的数据。图6展示页或元页的数据的两个扇区153和155的逻辑数据页。每一扇区通常含有所存储的用户或系统数据的512字节的部分157,和用于与部 分157中的数据有关或者与其所存储在的物理页或区块有关的开销数据的另一数目的字节159。开销数据的字节数目通常为16字节,从而使扇区153和155的每一者总共528字节。开销部分159可含有编程期间从数据部分157计算出的ECC、其逻辑地址、区块已被擦除和重新编程的次数的经验计数、一个或一个以上控制旗标、操作电压电平和/或类似信息,加上从此开销数据159计算出的ECC。或者,开销数据159或其一部分可存储在其它区块中的不同页中。
随着存储器的并行性增加,元区块的数据存储容量增加,且数据页和元页的大小也因此增加。数据页因而可含有两个以上的数据扇区。一个数据页中有两个扇区且每元页两个数据页,所以一个元页中存在四个扇区。因此,每一元页存储2048字节的数据。这是较高程度的并行性,且可随着行中存储器单元的数目增加而更进一步地增加。由于这个原因,扩展快闪存储器的宽度以便增加页和元页中数据的量。
商业上可利用的上文指出的物理上较小的可重新编程非易失性存储卡和快闪驱动器的数据存储容量为512兆字节(MB)、1千兆字节(GB)、2 GB和4GB,且可能更高。图7说明主机与这种大容量存储器系统之间的最普通的接口。主机处理由主机所执行的应用程序软件或固件程序产生或使用的数据文件。文字处理数据文件是一实例,且计算机辅助设计(CAD)软件的绘图文件是另一实例,其主要出现于例如PC、膝上型计算机等一般计算机主机中。pdf格式的文档也是此类文件。静态数字视频相机为存储在存储卡上的每一图片产生数据文件。蜂窝式电话利用来自内部存储卡上的文件(例如电话目录)的数据。PDA存储并使用若干不同的文件,例如地址文件、日历文件等。在任何此类应用程序中,存储卡也可含有操作主机的软件。
图7中说明主机与存储器系统之间的共用逻辑接口。连续的逻辑地址空间161足够大以便为可能存储在存储器系统中的所有数据提供地址。主机地址空间通常划分为增量的数据簇。每一簇可在给定主机系统中经设计以含有若干数据扇区,典型的是大约4与64个之间的扇区。标准扇区含有512字节的数据。
图7的实例中展示已创建三个文件1、2和3。在主机系统上运行的应用程序将每一文件创建为一组有序的数据并通过唯一名称或其它参考对其进行识别。主机将尚未分配给其它文件的足够的可用逻辑地址空间分派给文件1。图示文件1已被分派有连续范围的可用逻辑地址。通常还出于特定目的而分配地址范围(例如,用于主机操作软件的特定范围),接着,即使当主机将逻辑地址分派给数据时未利用这些地址,也避免用所述地址范围存储数据。
当主机随后创建文件2时,主机类似地分派逻辑地址空间161内的两个不同的连续地址范围,如图7所示。无需向文件分派连续逻辑地址,而是所述文件可以是已分配给其它文件的地址范围之间的地址的片段。接着,这一实例展示,向主机创建的又一文件3分配主机地址空间的先前未分配给文件1和2及其它数据的其它部分。
主机通过维持文件分配表(FAT)来跟踪存储器逻辑地址空间,FAT中维持着主机分派给各个主机文件的逻辑地址。FAT表通常存储在非易失性存储器中以及主机存储器中,且当存储新的文件、删除其它文件、修改文件等时由主机频繁更新。举例来说,当删除主机文件时,主机接着通过更新FAT表以显示先前分配给被删除文件的逻辑地址现可用于其它数据文件而将所述逻辑地址解除分配。
主机不关注存储器系统控制器选择用来存储文件的物理位置。典型的主机仅了解其逻辑地址空间和其已分配给其各个文件的逻辑地址。另一方面,存储器系统通过典型的主机/卡接口仅了解数据已被写入到的逻辑地址空间部分,但不了解分配给特定主机文件的逻辑地址乃至主机文件的数目。存储器系统控制器将主机为存储或检索数据而提供的逻辑地址转换成存储主机数据的快闪存储器单元阵列内的唯一物理地址。方框163表示这些逻辑-物理地址转换的工作表,其由存储器系统控制器维持。
存储器系统控制器经编程而以使系统的性能维持在高水平的方式将数据文件存储在存储器阵列165的区块和元区块内。此说明中使用四个平面或子阵列。优选地以系统所允许的最大程度的并行性跨越由来自平面的每一者的区块形成的整个元区块编程和读取数据。通常分配至少一个元区块167作为用于存储由存储器控制器使用的操作固件和数据的保留区块。可分配另一元区块169或多个元区块以用于存储主机操作软件、主机FAT表等。大多数物理存储空间保持用于存储数据文件。然而,存储器控制器不了解主机在其各个文件对象之间如何分配了所接收的数据。存储器控制器通常通过与主机交互而了解的只是主机写入到特定逻辑地址的数据存储在由控制器的逻辑-物理地址表163维持的相应的物理地址中。
在典型的存储器系统中,提供在存储地址空间161内存储所述量的数据所必需的几个额外区块的存储容量。可提供这些额外区块中的一者或一者以上作为冗余区块以替代在存储器的寿命期间可能变得有缺陷的其它区块。通常可出于各种原因而改变包含在各个元区块内的区块的逻辑分组,所述原因包含用冗余区块替代最初分派给元区块的有缺陷的区块。通常在已擦除区块集区中维持一个或一个以上额外区块(例如,元区块171)。当主机将数据写入到存储器系统时,控制器将由主机分配的逻辑地址转换为已擦除区块 集区中的元区块内的物理地址。接着擦除未用于将数据存储在逻辑地址空间161内的其它元区块,并将其指定为在后续数据写入操作期间使用的已擦除区块集区。
随着原始存储的数据变得过时,存储在特定主机逻辑地址处的数据被新数据频繁地重写。存储器系统控制器作为响应将新数据写入在已擦除区块中,并接着针对那些逻辑地址改变逻辑-物理地址表以识别那些逻辑地址处的数据被存储到的新的物理区块。接着擦除含有那些逻辑地址处的原始数据的区块,并使其可用于存储新数据。如果在写入开始时来自擦除区块集区的预擦除区块中不存在足够的存储容量,那么此种擦除通常必须在可完成当前数据写入操作之前发生。这可能不利地影响系统数据编程速度。存储器控制器通常只有在主机将新数据写入到给定逻辑地址时才知道主机已致使其同一逻辑地址处的数据过时。因此,存储器的许多区块可暂时存储这种无效数据。
区块和元区块的大小增加以便有效地使用集成电路存储器芯片的面积。这导致较大比例的单个数据写入存储的数据的量小于元区块的存储容量,且在许多情况下甚至小于区块的存储容量。由于存储器系统控制器通常将新数据引导到已擦除集区元区块中,所以这可能导致元区块的若干部分变得未填充。如果新数据是存储在另一元区块中的一些数据的更新,那么来自所述另一元区块的具有与新数据元页的逻辑地址连续的逻辑地址的剩余有效元页也理想地以逻辑地址次序被复制到新的元区块中。旧的元区块可保持其它有效数据元页。这随着时间而导致致使单个元区块的某些元页的数据过时且无效,并由写入到不同元区块的具有相同逻辑地址的新数据代替。
为了维持足够的物理存储器空间来存储整个逻辑地址空间161上的数据,周期性地压缩或合并(垃圾收集)此类数据。还需要将数据扇区尽可能地以与其逻辑地址相同的次序维持在元区块内,因为这使得对连续逻辑地址中的数据的读取更加有效。因此,通常以此额外目标来执行数据压缩和垃圾收集。第6,763,424号美国专利中描述了接收部分区块数据更新时管理存储器的一些方面和元区块的使用。
数据压缩通常涉及从元区块读取所有有效数据元页并将其写入到新区块,在此过程中忽略具有无效数据的元页。具有有效数据的元页也优选地以与存储在其中的数据的逻辑地址次序匹配的物理地址次序布置。新的元区块中被占据的元页的数目将小于旧的元区块中被占据的元页的数目,因为不将含有无效数据的元页复制到新的元区块。接着擦除旧的区块并使其可用于存储新数据。接着可使用通过合并获得的容量的额外元页来存储其它数据。
垃圾收集期间,从两个或两个以上元区块收集具有连续或接近连续的逻辑地址的有 效数据的元页,并将其重写到另一元区块中,所述另一元区块通常是已擦除区块集区中的一个元区块。当从原始的两个或两个以上元区块复制了所有有效的数据元页时,可将其擦除以供将来使用。
数据合并和垃圾收集花费时间并可能影响存储器系统的性能,尤其当数据合并或垃圾收集需要在可执行来自主机的命令之前发生时。此种操作通常由存储器系统控制器调度以尽可能在后台发生,但执行这些操作的需要可能促使控制器必须给予主机占用状态信号直到完成这一操作为止。可延迟主机命令的执行的实例是,已擦除区块集区中没有足够的预擦除元区块来存储主机希望写入到存储器中的所有数据,且需要首先进行数据合并或垃圾收集来清除有效数据的一个或一个以上元区块,接着可擦除所述元区块。因此,已将注意力导向管理对存储器的控制以便使此类中断最小化。以下美国专利申请案中描述了许多此类技术:2003年12月30日申请的第10/749,831号,题为“Managementof Non-Volatile Memory Systems Having Large Erase Blocks”;2003年12月30日申请的第10/750,155号,题为“Non-Volatile Memory and Method with Block Management System”;2004年8月13日申请的第10/917,888号,题为“Non-Volatile Memory and Method withMemory Planes Alignment”;2004年8月13日申请的第10/917,867号;2004年8月13日申请的10/917,889号,题为“Non-Volatile Memory and Method with Phased ProgramFailure Handling”;和2004年8月13日申请的第10/917,725号,题为“Non-Volatile Memoryand Method with Control Data Management”。
有效地控制具有非常大的擦除区块的存储器阵列的操作的一个挑战是,使给定写入操作期间存储的数据扇区的数目与存储器区块的容量和边界匹配且对准。一种方法是,以少于最大数目的区块来配置用于存储来自主机的新数据的元区块,所使用的区块的数目是存储少于填满整个元区块的量的数据量所必需的。2003年12月30日申请的题为“Adaptive Metablocks”的第10/749,189号美国专利申请案中描述了适应性元区块的用途。2004年5月7目申请的第10/841,118号和2004年12月16日申请的题为“Data RunProgramming”的第11/016,271号专利申请案中描述了数据区块之间的边界与元区块之间的物理边界的配合。
存储器控制器也可使用来自FAT表的数据(其由主机存储在非易失性存储器中)来更有效地操作存储器系统。一个此类用途是,了解何时主机已通过将数据的逻辑地址解除分配而将所述数据识别为过时的。了解此情况允许存储器控制器在其通常将由于主机将新数据写入到那些逻辑地址而了解此类无效数据之前调度对含有此类无效数据的区块 的擦除。2004年7月21日申请的题为“Method and Apparatus for Maintaining Data onNon-Volatile Memory Systems”的第10/897,049号美国专利申请案中描述了这一情况。其它技术包含监控主机将新数据写入到存储器的模式以便推断出给定的写入操作是否为单个文件,或者如果是多个文件,则推断出文件之间的边界位于何处。2004年12月23日申请的题为“FATAnalysis for Optimized Sequential Cluster Management”的第11/022,369号美国专利申请案描述了这种类型的技术的用途。
为了有效地操作存储器系统,控制器需要尽可能多地了解关于主机分派给其各个文件的数据的逻辑地址的信息。因而,控制器可将数据文件存储在单个元区块或一群组的元区块内,而不是在文件边界未知时将数据文件散布在较大数目的元区块之间。结果是,数据合并和垃圾收集操作的次数和复杂性减小。因此存储器系统的性能改进。但是,如上所述,当主机/存储器接口包含逻辑地址空间161(图7)时,存储器控制器难以了解关于主机数据文件结构的较多信息。
参看图8,以不同方式说明图7已展示的典型逻辑地址主机/存储器接口。主机向主机所产生的数据文件分配逻辑地址。存储器系统接着查看这些逻辑地址,并将其映射成实际存储数据的存储器单元的区块的物理地址。
示范性的基于文件的接口实施例的描述
主机与用于存储大量数据的存储器系统之间的改进的接口消除了对逻辑地址空间的使用。主机改为通过唯一文件ID(或其它唯一参考)和文件内的数据单位(例如,字节)的偏移地址而逻辑上寻址每一文件。将此文件地址直接给予存储器系统控制器,所述存储器系统控制器接着保存其自身的关于每一主机文件的数据物理上存储在何处的表。这种新的接口可与和上文参看图2-6描述的相同的存储器系统一起实施。与上文描述的内容的主要差异是所述存储器系统与主机系统通信的方式。
图9中说明这种基于文件的接口,其将与图7的逻辑地址接口进行比较。将图9的文件1、2和3的每一者的标识以及文件内数据的偏移量直接传递到存储器控制器。此逻辑地址信息接着由存储器控制器函数173转换成存储器165的元区块和元页的物理地址。
图10也说明基于文件的接口,其将与图8的逻辑地址接口进行比较。图10中不存在图8的逻辑地址空间和主机维持的FAT表。事实上,通过文件编号和文件内数据的偏移量向存储器系统识别主机所产生的数据文件。存储器系统接着将文件直接映射到存储器单元阵列的物理区块。
参看图11,说明本文描述的示范性大容量存储系统的功能层。“直接文件存储后端系 统”主要是本描述内容的主题。其在存储器系统的操作内,且通过“直接文件接口”和“基于文件的前端系统”在基于文件的接口信道上与主机系统通信。例如通过文件名来唯一地识别每一主机文件。通过文件所特有的线性地址空间内的偏移地址来识别文件内的数据。不需要为存储器系统界定逻辑地址空间。
命令
来自主机系统的一组直接文件接口命令支持存储器系统的操作。图12A-12E中给出一组示范性的此类命令。这里仅简要概述这些命令,用于本描述内容的其余部分中的参考。图12A列举用于促使根据所界定的协议在主机与存储器系统之间传递数据的主机命令。将在文件内处于特定偏移量(<偏移量>)的指定文件(<文件ID>)内的数据写入到存储器系统,或从存储器系统读取所述数据。在传输“写入”、“插入”或“更新”命令之后将数据从主机传输到存储器系统,且存储器系统通过将数据写入在其存储器阵列中而作出响应。主机传输“读取”命令会促使存储器系统通过将指定文件的数据发送到主机而作出响应。如果存储器系统维持识别文件的额外数据可存储的下一存储位置的指针,那么数据偏移量无需与写入命令一起被发送。然而,如果“写入”命令包含已写入的文件内的偏移地址,那么存储器装置可将所述偏移地址解译为更新在所述偏移地址处开始的文件数据的命令,借此不需要单独的“更新”命令。对于“读取”命令,如果将读取整个文件,那么主机不需要指定数据偏移量。响应于主机系统传输任何其它命令而终止对这些图12A数据命令中的一者的执行。
另一数据命令是“移除”命令。不同于图12A的其它数据命令,“移除”命令之后并不传输数据。其作用是促使存储器系统将指定的偏移量1与偏移量2之间的数据标记为过时的。接着在其中存在过时数据的文件或区块的下一数据压缩或垃圾收集期间移除这些数据。
图12B列举管理存储器系统内的文件的主机命令。当主机即将在存储器系统中写入新的文件的数据时,其首先发布“打开”命令,且存储器系统通过打开新的文件而作出响应。通常将指定可同时保持打开的文件的数目。当主机关闭文件时,“关闭”命令告知存储器系统可重新引导其用于维持打开文件的资源。存储器系统通常将立即调度此文件进行垃圾收集。利用所描述的直接文件接口,主要基于文件而在逻辑上管理和执行垃圾收集,而不是对于各个存储器单元区块在物理上管理和执行。“之后关闭”(Close_after)命令给予存储器系统提前通知:文件即将关闭。文件“删除”命令促使存储器系统立即根据指定的优先权规则调度擦除含有来自被删除文件的数据的存储器单元区块。“擦除” 命令指定立即从存储器中擦除所指定文件的数据。
“删除”与“擦除”命令之间的主要差异是给予擦除所指定的文件数据的优先权。主机可使用“擦除”命令在尽可能早的时间从存储器中移除安全或敏感的数据,而“删除”命令促使以较低优先权擦除此类数据。在将存储器系统断电时使用“擦除”命令会在从主机上移除存储器装置之前移除敏感数据,且因此防止在存储器装置的后续使用期间将所述数据散布到其它用户或主机系统。这两个命令均优选在后台执行,即不会减慢主要数据命令的执行(图12A)。在任何情况下,从主机接收到另一命令通常将促使存储器控制器终止任何后台操作。
图12C中列举与存储器系统内的目录有关的主机命令。每一目录命令包含命令所涉及的目录的标识(<目录ID>)。尽管存储器系统控制器维持目录,但关于目录的命令和目录的命名由主机系统提供。存储器控制器以主机供应的目录命名依照存储在存储器系统中的固件来执行这些命令。
<文件ID>参数可以是文件的路径全名或文件的某一简写识别符,本文引用为文件-句柄(file_handle)。联合某些命令将文件路径名提供到图11的直接文件接口。这允许当文件首次打开时在文件目录中创建完全明确的条目,并允许当打开现有文件时访问文件目录中正确的现有条目。文件路径名语法可遵照DOS文件系统所使用的标准。路径名描述目录的层级和目录的最低级内的文件。路径片段可由“\”定界。加上前缀“\”的路径与根目录有关。未加上前缀“\”的路径与当前目录有关。“..”的片段路径指示当前目录的父目录。
或者,可通过文件_句柄参数来识别打开的文件,所述文件_句柄参数由存储装置在首次创建文件时分派。存储装置接着可在每当主机打开文件时将简写文件命名传送到主机。主机接着可将文件_句柄与打开的文件的“写入”、“插入”、“更新”、“读取”、“关闭”和“之后关闭”命令一起使用。如果使用路径全名,那么主机对文件的访问通常将较快,因为无需导航通过文件目录的层级。当通过使用“打开”命令而首次打开文件时,通常使用路径全名,因为存储器系统很可能尚未向所述文件分派文件_句柄。但如果文件_句柄已经可用的话,那么可使用文件_句柄。对于图12A和12B的利用文件ID的剩余的“删除”和“擦除”命令,优选地使用完整的文件路径名,以防主机供应不正确的文件_句柄。主机较难因疏忽而产生与现有的但非既定的文件之一匹配的不正确的路径名。
图12C的目录命令类似地与其所涉及的目录的<目录ID>标识一起由图11的直接文件接口接收。路径全名是与目录命令一起接收的优选的目录ID。
文件_句柄是由大容量存储装置响应于“打开”命令而在到达主机的直接文件接口处返回的简写形式的识别符。便利的是将文件_句柄界定为存在于文件的目录条目中的FIT的指针。此指针界定文件的逻辑FIT区块编号和所述区块内的逻辑文件编号。将此用作文件_句柄允许不必首先在文件目录中搜索文件即可访问文件FIT条目。举例来说,如果存储器装置可具有多达64个FIT区块,且每一FIT区块可索引多达64个文件,那么具有文件_句柄1107的文件使其在FIT中的数据群组条目的指针设置成FIT区块11中的逻辑文件7。文件_句柄由存储器系统控制器在响应于“打开”命令创建文件的目录和FIT条目时产生,且响应于“关闭”命令而变得无效。
图12D给出管理主机与存储器系统之间的接口的状态的主机命令。“闲置”命令告知存储器系统其可执行先前已调度的例如数据擦除和垃圾收集的内部操作。响应于接收到“待用”命令,存储器系统将停止执行例如垃圾收集和数据擦除的后台操作。“停机”命令给予存储器控制器关于即将发生的电力丢失的提前警告,这允许完成待决的存储器操作,包含将数据从易失性控制器缓冲器写入到非易失性快闪存储器中。
图12E所示的“大小”命令通常将由主机在“写入”命令之前发布。作为响应,存储器系统向主机报告可用于待写入的另外的文件数据的容量。这可基于可用的未编程物理容量减去管理所界定的文件数据容量的存储所需的物理容量来计算。
当主机发布“状态”命令时(图12E),存储器装置将以其当前状态作出响应。此响应可采用向主机提供关于存储器装置的信息的各个特定项目的具有不同的位的字段的二进制字的形式。举例来说,一个二位字段可报告装置是否被占用,且如果是,那么依据存储器装置正忙于进行的操作而提供一个以上占用状态。一个占用状态可指示存储器装置正执行用于传递数据的主机写入或读取命令,即前台操作。第二占用状态指示可用于告知主机存储器系统正执行后台内务处理操作,例如数据压缩或垃圾收集。主机可决定是否一直等到此第二占用结束为止然后将另一命令发送到存储器装置。如果在完成内务处理操作之前发送了另一命令,那么存储器装置将结束内务处理操作并执行所述命令。
主机可将第二装置占用与“闲置”命令结合使用以允许在存储器装置内发生内务处理操作。在主机发送很可能形成装置进行内务处理操作的需要的一命令或一系列命令之后,主机可发送“闲置”命令。如随后所描述,存储器装置可经编程以通过起始内务处理操作来响应“闲置”命令,并同时开始上述第二占用。举例来说,“删除”命令形成根据下文论述的算法执行垃圾收集的需要。在已发布一系列“删除”命令之后来自主机的“闲置”命令接着使装置有时间执行垃圾收集,所述垃圾收集对于存储器装置能够响应 后续的主机“写入”命令可能是必要的。另外,可能需要在接收下一“写入”命令之后但在可执行所述“写入”命令之前执行垃圾收集,借此显著减慢所述命令的执行。
写入数据
当将新的数据文件编程到存储器中时,以区块中的第一物理位置开始并按照顺序依次继续通过区块的位置而将数据写入到存储器单元的已擦除区块中。数据以从主机接收的次序被编程,而不管所述数据在文件内的偏移量的次序如何。编程继续进行直到已将文件的所有数据写入到存储器中为止。如果文件中数据的量超过单个存储器区块的容量,那么当第一区块已满时,编程在第二已擦除区块中继续进行。以与第一存储器区块相同的方式从第一位置依次对第二存储器区块进行编程,直到存储了文件的所有数据或第二区块已满为止。可用文件的任何剩余数据对第三或额外区块进行编程。存储单个文件的数据的多个区块或元区块无需在物理上或逻辑上是连续的。为了便于解释,除非另有规定,否则希望本文使用的术语“区块”表示擦除的区块单位或多个区块“元区块”,这取决于特定系统中是否正使用元区块。
参看图13A,说明将数据文件写入到存储器系统。在此实例中,数据文件181大于存储器系统的一个区块或元区块183的存储容量,183的存储容量展示为在实线垂直线之间延伸。因此,还将数据文件181的部分184写入到第二区块185中。这些存储器单元区块展示为物理上连续的,但其无需如此。来自文件181的数据在其以流的形式从主机被接收时被写入,直到文件的所有数据已写入到存储器中为止。在图13A的实例中,数据181是在图12A的“写入”命令之后从主机接收的文件的初始数据。
存储器系统管理和跟踪所存储的数据的优选方式是使用可变大小的数据群组。也就是说,将文件的数据存储为可以所界定的次序链接在一起以形成完整的文件的多个数据群组。然而,优选地,文件内的数据群组的次序由存储器系统控制器通过使用文件索引表(FIT)来维持。当写入来自主机的数据流时,只要文件数据的逻辑偏移地址中或存储有所述数据的物理空间中存在不连续性,就开始新的数据群组。这种物理不连续性的实例是当文件的数据填满一个区块并开始写入到另一区块中时的情况。图13A中说明这一情况,其中第一数据群组填满第一区块183,将文件的剩余部分184作为第二数据群组存储在第二区块185中。第一数据群组可由(F0,D0)表示,其中F0是数据文件的开始的逻辑偏移量,且D0是存储器内文件开始的物理位置。第二数据群组表示为(F1,D1),其中F1是存储在第二区块185的开始处的数据的逻辑文件偏移量,且D1是存储有所述数据的物理位置。
通过主机-存储器接口传递的数据的量可依据数据的字节数目、数据的扇区数目或以某一其它粒度来表达。当通过当前逻辑地址接口与大容量存储器系统通信时,主机最经常以字节粒度界定其文件的数据,但接着将字节分组为各有512字节的扇区或分组为各有多个扇区的簇。通常这样做以便简化存储器系统的操作。尽管本文描述的基于文件的主机-存储器接口可使用某一其它数据单位,但原始主机文件字节粒度通常是优选的。也就是说,优选地依据字节(最小的适当的数据单位)而不是通过扇区、簇等来表达数据偏移量、长度等。这允许以本文描述的技术更有效地使用快闪存储器存储装置的容量。
在一般的现有逻辑地址接口中,主机还指定正写入的数据的长度。这也可利用本文描述的基于文件的接口来进行,但由于这对于“写入”命令(图12A)的执行来说不是必要的,所以优选的是主机不提供正写入的数据的长度。
以图13A所说明的方式写入到存储器中的新的文件接着在FIT中以所述次序表示为数据群组的索引条目(F0,D0)、(F1,D1)的序列。也就是说,每当主机系统希望访问特定文件时,主机将其文件ID或其它标识发送到存储器系统,存储器系统接着访问其FIT以识别组成所述文件的数据群组。各个数据群组的长度<长度>也可包含在其各自的条目中,以便于存储器系统的操作。当使用时,存储器控制器计算并存储数据群组的长度。
只要主机使图13A的文件维持打开状态,优选地还维持物理写入指针P以界定用于写入从主机接收的所述文件的任何另外的数据的位置。在物理存储器中文件末端处写入所述文件的任何新的数据,而不管新数据在文件内的逻辑位置如何。存储器系统允许多个文件同时保持打开,例如4或5个此类文件,并为其每一者维持写入指针P。不同文件的写入指针指向不同存储器区块中的位置。如果当已存在关于打开文件的数目的存储器系统限制时主机系统希望打开新的文件,那么首先关闭已打开文件中的一者并接着打开新的文件。已关闭文件之后,不再需要为所述文件维持写入指针P。
图13B说明主机(也通过使用“写入”命令(图12A))将数据附加到图13A的先前写入但仍打开的文件的末端。展示主机系统将数据187添加到文件的末端,也将其在所述文件的数据的末端处写入在第二区块185中。所附加数据变成数据群组(F1,D1)的一部分,所述数据群组(F1,D1)因此现含有更多数据,因为现有数据群组184与所附加数据189之间既不存在逻辑地址不连续性也不存在物理地址不连续性。因此,整个文件在FIT中仍然表示为索引条目(F0,D0)、(F1,D1)的序列。指针P的地址也变化为所存储的附加数据的末端的地址。
图13C中展示将数据191的区块插入到图13A的先前写入的文件中的实例。尽管主 机将数据191插入文件中,但存储器系统将所插入的数据附加在先前写入的文件数据的末端处的位置193处。当正将数据插入打开的文件中时不必以文件的数据的逻辑次序重写所述文件的数据,但这可能稍后在主机关闭文件之后在后台进行。由于所插入的数据完全存储在第二存储器区块185中,所以其形成单个新群组(F1,D3)。但进行此插入导致图13A的先前数据群组(F0,D0)被划分为两个群组,一个是插入之前的(F0,D0)且一个是插入之后的(F2,D1)。这是因为,每当存在数据的逻辑不连续性时(例如发生在插入的开始F1时和插入的结束F2时),均需要形成新的数据群组。群组(F3,D2)是物理地址D2作为第二区块185的开始的结果。尽管群组(F1,D3)与(F3,D2)存储在同一存储器区块中但其维持分离,因为存储在其中的数据的偏移量存在不连续性。接着在存储器系统FIT中以所述次序通过数据群组索引条目(F0,D0)、(F1,D3)、(F2,D1)、(F3,D2)来表示具有插入的原始文件。从图13A、13B和13C的实例中应注意,可写入新的或现有文件的新数据,而不使存储器中的任何数据过时。也就是说,执行“写入”和“插入”命令(图12A)不会导致致使任何其它数据无效或过时。
图13D说明另一实例,其中使用“更新”命令(图12A)以图13A所示的方式更新最初写入的数据的某一部分。展示更新数据文件的部分195。不是通过更新而重写存储器系统中的整个文件,而是将文件的已更新部分197附加到先前写入的数据。先前写入的数据的部分199现为过时的。尽管通常需要合并已更新的文件以便释放由过时数据占据的空间,但这通常不在主机使文件维持打开时进行,而是可在关闭文件之后在后台进行。更新之后,在存储器系统FIT中以所述次序通过数据群组索引条目(F0,D0)、(F1,D3)、(F2,D1)、(F3,D2)来表示文件。图13A的单个数据群组(F0,D0)再次划分为图13D中的片段,一个在已更新部分之前且一个在已更新部分之后。
为了进一步说明可变长度数据群组的使用,图14A-14E依次展示涉及同一文件的若干写入操作的序列。首先使用“写入”命令(图12A)将原始文件数据W1写入到存储器系统的两个区块中,如图14A所示。接着通过两个数据群组来界定所述文件,第一群组开始于物理存储器区块的开始处,且第二群组在物理存储器区块边界之后需要。接着,通过以下数据群组的索引条目的序列来描述图14A的文件:(F0,D0)、(F1,D1)。
图14B中,通过使用“更新”命令(图12A)更新图14A中写入的文件数据。将已更新的文件数据U1紧跟着先前群组(F1,D1)之后写入,使已更新数据的先前版本变得过时。图14A的先前群组(F0,D0)缩短为图14B的经修正群组(F0,D0),且先前群组(F1,D1)缩短为群组(F4,D2)。将已更新数据写入在两个群组(F2,D3)和(F3,D4)中,因为其与存储器 区块的边界重叠。将一些数据存储在第三存储器区块中。现通过以下数据群组的索引条目的序列来描述所述文件:(F0,D0)、(F2,D3)、(F3,D4)、(F4,D2)。
在图14C中通过使用“插入”命令(图12A)插入新的文件数据I1来进一步修改图14B的文件。将新数据I1紧跟着图14B的先前群组(F4,D2)之后写入到存储器中,作为图14C的新群组(F5,D6)和(F6,D7),因为所插入的数据与存储器区块的边界重叠。使用第四存储器区块。图14B的先前群组(F0,D0)由于新数据I1的插入而分裂为图14C中的缩短的群组(F0,D0)和(F7,D5)。现通过以下数据群组的索引条目的序列来描述所述文件:(F0,D0)、(F5,D6)、(F6,D7)、(F7,D5)、(F8,D3)、(F9,D4)、(F10,D2)。
图14D展示使用“写入”命令(图12A)将新数据W2附加到文件的末端而进一步修改图14C的数据文件。将新数据W2紧跟着图14C的先前群组(F10,D2)之后写入,作为图14D的新群组(F11,D8)。现通过以下数据群组的索引条目的序列来描述所述文件:(F0,D0)、(F5,D6)、(F6,D7)、(F7,D5)、(F8,D3)、(F9,D4)、(F10,D2)、(F11,D8)。
图14E中展示对打开的文件的第二更新,其中通过主机发布“更新”命令(图12A)将已更新文件数据U2写入到图14D的文件。图14E中将已更新数据U2紧跟着图14D的先前群组(F11,D8)之后写入,使所述数据的先前版本变得过时。图14D的先前群组(F9,D4)缩短为图14E中的经修正群组(F9,D4),先前群组(F10,D2)变得完全过时,且先前群组(F11,D8)缩短而形成新群组(F14,D9)。将已更新数据写入在图14E的新群组(F12,D10)和(F13,D11)中,并与区块边界重叠。现需要第五区块来存储文件。现通过以下数据群组的索引条目的序列来描述所述文件:(F0,D0)、(F5,D6)、(F6,D7)、(F7,D5)、(F8,D3)、(F9,D4)、(F12,D10)、(F13,D11)、(F14,D9)。
在根据以上描述的文件的创建或修改之后,优选以正确的逻辑次序使每一文件的数据的偏移量维持连续。因此,例如,作为执行“插入”命令的一部分,主机所提供的所插入数据的偏移量从紧接着在插入之前的偏移量连续,且插入之后已在文件中的数据递增所插入数据的量。更新命令最通常会导致现有文件的给定地址范围内的数据被相同量的已更新数据代替,因此文件的其它数据的偏移量通常无需被代替。代替单独的“更新”命令,可替代地通过使用“写入”命令来更新文件的数据,因为存储器系统可将从主机接收到具有已存在于所存储的文件数据中的偏移量的范围的数据解译为更新所述偏移量范围内的数据的指令。
将注意到,上文描述且通过图13和14说明的所有的数据分配和索引功能均由存储器系统的控制器执行。连同图12A的命令“写入”、“插入”或“更新”中的一者,主机 仅传送正发送到存储器系统的文件ID和文件内数据的偏移量。存储器系统执行其余操作。
以刚才描述的方式将文件数据从主机直接写入到快闪存储器中的优点是,如此存储的数据的粒度或分辨率可维持成与主机的粒度或分辨率相同。如果主机应用程序以例如一个字节的粒度写入文件数据,那么也可以一个字节的粒度将所述数据写入到快闪存储器中。接着以字节数目来测量各个数据群组内数据的量和位置。也就是说,在主机应用程序文件内可单独寻址的数据的相同偏移量单位当存储在快闪存储器中时在所述文件内也是可单独寻址的。接着,在索引表中将区块内同一文件的数据群组之间的任何边界指定为最接近的字节或其它主机偏移量单位。类似地,以主机偏移量的单位来界定区块内不同文件的数据群组之间的边界。
尽管并不使用“删除”命令来写入数据,但考虑使用“删除”命令来删除文件的一部分具有实质意义,因为此操作是“插入”命令的相反命令。“删除”命令可以以下格式应用于一系列文件偏移量地址:删除<文件ID><偏移量><长度>。以<偏移量>开始且从所述地址继续经过删除的<长度>的文件部分内的数据被删除。主机接着递减删除之后文件的剩余数据的偏移量地址,以便在整个文件中维持连续的偏移量地址。这是“插入”命令的相反命令,其中主机将数据添加到文件的中部,并接着递增插入之后剩余的文件数据的偏移量,使得经修改的文件的偏移量是连续的。
垃圾收集
从图14B和14E中将注意到,“更新”命令导致存储文件所必需的物理空间大于文件中数据的量,这是因为已由更新代替的数据仍然存储在存储器中。因此,非常需要通过消除过时、无效的数据而将文件的数据合并(垃圾收集)到较小的物理存储空间中。因此,更多的存储空间变得可用于其它数据。
还可注意到,除了图14B和14E的文件数据更新外,图14C的数据插入还导致文件数据被无序存储。也就是说,更新和插入在其进行时被添加到存储在存储器中的文件的末端,而其几乎总是逻辑上定位在文件内的其它地方。这是图14B、14C和14E的实例的情况。因此,可能需要将存储在存储器中的文件的数据重新排序以与文件内的偏移量的次序匹配。这因而改进了所存储数据的读取速度,因为按顺序读取页和区块将以文件的数据的偏移量次序提供所述文件的数据。这还提供了对文件的最大可能的碎片整理。但对文件数据重新排序以使读取更加有效对存储器系统的性能的重要性并不如文件数据合并,文件数据合并潜在地释放一个或一个以上存储器区块以用于存储其它数据。因此, 对文件中的数据重新排序通常不会是独立地进行的(因为益处抵不上所增加的操作开销),而是可作为许多垃圾收集操作的一部分进行而具有极少或不增加操作开销。
图14E的文件包含由于已进行两次数据更新U1和U2而存储在存储器中的过时数据群组(灰色部分)。因此,正用于存储文件的存储器容量的量实质上大于文件的大小,如从图14E所了解。因此,垃圾收集是适当的。图15提供对图14E的数据文件进行垃圾收集的结果的说明。在垃圾收集之前,所述文件几乎占据五个区块的存储容量(图14E),而垃圾收集之后,所述同一文件配合在略多于三个存储器单元区块内(图15)。作为垃圾收集操作的一部分,将数据从其初始被写入到的区块复制到其它已擦除区块中,且接着擦除原始区块。如果对整个文件进行数据收集,那么其数据可能以与文件内的数据逻辑偏移量次序相同的物理次序被复制到新的区块中。更新U1和U2以及插入I1(例如)在垃圾收集(图15)之后以与其在主机文件中出现的次序相同的次序存储。
垃圾收集通常还导致在正合并的文件内形成新的且不同的数据群组。在图15的情况下,通过以下新的数据群组的索引条目的新的序列来描述所述文件:(F0,D0)、(F1,D1)、(F2,D2)、(F3,D3)。这比图14E所示的文件的状态下存在的数据群组的数目少得多。现在,对于文件的数据已被复制到的存储器单元区块的每一者有一个数据群组。作为垃圾收集操作的一部分,更新文件索引表(FIT)以反映形成文件的新的数据群组。
当一个文件是进行垃圾收集的候选者时,检查所述文件的FIT数据群组条目以确定文件是否满足为垃圾收集设定的标准。当含有文件的数据的存储器单元区块的任一者还含有过时数据时,将继续进行垃圾收集。如果不,那么不必要进行垃圾收集。从上文给出的数据群组索引条目的序列中容易发现图14E的文件含有过时数据。举例来说,从两个连续的数据群组(F7,D5)和(F8,D3)可知,存储有文件数据的最初两个区块中存在过时数据。物理地址位置D5与D3的差异远远大于逻辑偏移量F7与F8的差异。从文件索引数据群组条目中还容易发现,数据未以逻辑偏移量次序存储。或者,文件的各个FIT条目可保留所述文件的参考为过时的过时数据群组的记录。控制器接着简单地扫描每一文件的FIT条目以识别任何过时数据群组和存储有所述过时数据群组的物理区块。
通常不应对打开的文件执行垃圾收集,因为主机可能继续对文件进行更新或插入,所述更新或插入会产生另外的过时数据和/或不以逻辑偏移量次序存储数据。因而,可能导致许多此类垃圾收集操作。但在已擦除集区区块的数目下降到设定水平以下的情况下,可能有必要对打开的文件进行垃圾收集以提供足够多的已擦除区块用于存储新数据或其它操作。
主机关闭文件通常促使考虑对所述文件进行垃圾收集。优选地,并不紧接着在关闭文件之后就执行垃圾收集,而是由存储器控制器调度关闭的文件在后台进行垃圾收集,此时其将不会干扰当前的存储器操作。可保持垃圾收集队列,其中关闭之后将文件添加到队列,且接着,当没有具有较高优先权的其它存储器系统操作要执行时,已处于队列中最长时间的文件由存储器控制器选择并在需要时进行垃圾收集。可(例如)响应于从主机接收到“闲置”命令(图12D)而进行这种选择和垃圾收集操作。
由于尤其对于大文件来说复制数据是垃圾收集的最耗时的部分,所以可通过任何一次仅以短突发形式复制文件的数据的一部分而将任务划分为若干组成部分。接着,这种部分文件复制可与其它存储器操作交错,且甚至在主机将数据传递到存储器系统或从存储器系统传递数据时发生。也可响应于已擦除区块的数目下降到某一指定数目以下而增加各个复制数据突发的长度。
目标是完全在后台执行垃圾收集而不干扰或减慢与主机系统传递数据的主要操作。但这并不总是可能的,尤其是在已擦除区块集区中可用于编程新数据的已擦除区块的数目变得小于某一预设的最小值的情况下。接着使垃圾收集成为优先,且可作为优先而在前台对队列中的任何文件进行垃圾收集以便合并数据,使得额外的已擦除区块可用于从主机系统接收新数据。如果队列中没有文件,那么可能必须对打开的文件进行垃圾收集。当垃圾收集变为优先时,主机通常将从存储器系统接收占用状态信号,且因此将暂停新数据的任何编程直到再次存在适当数目的已擦除区块为止。另一方面,如果存在足够数目或更多的已擦除集区区块,那么可减小垃圾收集操作的频率,且可延迟可能影响存储器系统的性能的垃圾收集。
将注意到,对主机数据文件执行垃圾收集。响应于文件的状态而对文件启始垃圾收集。当启始时,作为所述过程的一部分检查FIT中文件的所有数据群组的索引条目。当对文件进行垃圾收集时,以文件的数据群组索引条目中指定的次序将文件的数据一次一个数据群组地从其现有区块复制到新打开的复制区块。这与现有快闪存储器垃圾收集形成对比,现有快闪存储器垃圾收集完全基于各个存储器单元区块的状态。
然而,一般的规则是,将仅对存储文件的数据的还含有过时数据的各个区块进行垃圾收集。因此,将不会对存储文件的数据的所有区块进行垃圾收集。如果举例来说,文件仅存储在两个区块中,且第一区块含有过时数据而第二区块不含有过时数据,那么将对第一区块进行垃圾收集而不管第二区块的数据。将有效数据从第一区块复制到已擦除复制区块中,且复制区块于是将留下大约是过时数据的量的一些已擦除页或其它容量。 下文描述使用小于一个区块的已擦除存储容量。在图14E的实例中,垃圾收集之前的存储器空间在五个含有文件的数据的区块中的四个中的每一者中具有过时数据(灰色区域)。
作为对仅对含有过时数据的那些区块进行垃圾收集的一般规则的修改,一旦确定将对给定文件进行垃圾收集,就将处于部分归档区块中的文件的任何数据包含在垃圾收集操作中。因此,尽管图14E的第五区块中没有过时数据,但仍将所述区块中的U2数据包含在垃圾收集操作中。所有五个区块中的数据通过被复制到四个已擦除区块中而合并在一起,因为通过不包含第五区块的数据,所产生的四个复制区块中的两者将仅被部分地填满数据。在图15的情况下,仅一个复制区块保持部分地填满。通过具有较少的部分使用的区块来改进存储器性能。
图12B的由主机系统发布的某些文件命令可启始垃圾收集。已描述接收对文件的“关闭”命令。将关闭的文件置于待进行垃圾收集的队列中。“删除”和“擦除”命令也可导致垃圾收集。删除文件可促使将含有过时文件数据的区块置于进行垃圾收集的队列中。对已删除文件进行垃圾收集的作用在于,不存在已删除文件的有效数据,因此不会发生向其它区块的数据复制。作为垃圾收集过程的一部分简单地擦除仅含有已删除文件的数据的所有区块。“擦除”命令具有类似的作用,只是仅含有已擦除文件的过时数据的区块的垃圾收集可立即或基于优先权(例如,通过将区块置于垃圾收集队列的最前部分)而发生。
所论述的直接文件存储系统的显著优点是,当主机删除文件时存储器立即获悉这一情况,因为删除文件的命令直接传达到存储器系统。存储器控制器接着可在可擦除存储已删除文件的数据的区块时就擦除所述区块,而不会不利地影响存储器的其它操作。因而,使已擦除区块可用于存储新的数据。
在所描述的实施方案中,“删除”或“擦除”文件的命令中的任一者均会导致作为直接响应而擦除所述文件的数据。另一方面,在典型的基于逻辑的接口中,此命令不直接到达存储器控制器。事实上,主机仅释放存储器逻辑地址空间的由已删除或擦除文件占据的某些片段。只有当主机随后将数据写入到那些相同逻辑地址中的一者或一者以上时,存储器系统才知道重新使用的逻辑地址片段处的数据已过时。存储器仍不知道由文件占据的其它逻辑地址片段的数据已被删除或擦除。存储器只有在主机将数据写入到那些其它逻辑地址时才了解之前写入到那些其它逻辑片段的数据已过时。
共用区块
用单个文件的数据填充连续区块的结果是,当文件被关闭并进行垃圾收集时,文件数据中的一些可能仅占据存储器单元区块的一部分。此外,小文件的数据甚至可能不会填满整个区块。如果仅一个文件的数据可存储在区块中,那么这将导致各个区块的大量空间未被使用。各个区块内若干页的存储容量将维持已擦除且可用于存储数据但将不会被利用。
因此,一些存储器单元区块希望存储来自两个或两个以上文件的每一者的较少量的数据,其它区块已填满之后留下整个小文件和/或残余文件数据。残余文件数据是关闭的文件的不占据完整区块的数据,且可包含一个或一个以上数据群组。文件映射可以与仿佛区块中所有数据群组全部来自一个文件相同的方式跟踪单个存储器单元区块中一个以上文件的数据群组。各个数据群组的映射包含数据群组所属的文件ID。使用共用区块的主要目的是使可能由于如上所述将文件的数据写入到存储器中而产生的未使用的物理存储器存储容量最小化。最一般地,由于对文件的垃圾收集而产生的一个或一个以上数据群组的残余数据将写入到共用区块中,作为垃圾收集的一部分。一实例是图15的经垃圾收集的文件,其中最后的数据群组(F3,D3)仅占据最后区块的一小部分。如果其保持这样,那么所述最后区块的大部分将不被使用。可将图15的数据群组(F3,D3)写入到含有来自另一个或一个以上文件的一个或一个以上数据群组的共用区块中,或者可将所述最后存储器区块指定为共用区块。在后者情况下,来自一个或一个以上其它文件的数据群组因而将随后被写入到所述相同区块中。
或者,当已知残余数据的量是将配合到所指定的共用区块的一者内的已擦除空间中的量时,可在垃圾收集期间将残余文件数据从主机直接写入到共用区块。可使用“之后关闭”命令(图12B)来识别残余文件数据,并允许将其写入到具有足够的空间来存储作为命令的一部分而指定的数据量的打开的共用区块,而不是将残余文件数据写入到将不会被完全填满的擦除集区区块中。这可排除在后续垃圾收集操作期间复制残余数据的需要。
当将新的数据文件编程到存储器中时,可将数据写入到含有一个或一个以上其它文件的残余数据的打开的共用区块中(在区块中第一可用的物理位置开始并按顺序依次继续经过区块的位置),作为先前描述且图13A中说明的用于写入数据的方法的替代方法。如果发送文件的“打开”命令,之后在发送文件的数据之前紧接着是“之后关闭”命令,那么可确定所述文件的全部数据可配合在打开的共用区块中,且所述文件将在到达打开的共用区块的末端之前被关闭。即使文件数据的长度是未知的,也可将新文件的数据写 入到打开的共用区块中。
因此,理想地在存储器系统中维持许多共用区块用于存储两个或两个以上不同文件的共用数据群组。共用数据群组的大小可高达区块的存储容量的大小,粒度为一个字节。所述共用区块中仅一者优选地含有给定文件的数据,但可含有文件的一个以上数据群组。并且,共用数据群组优选地仅存储在一个共用区块中,且不被划分而用于存储在多个共用区块中。这避免了当数据群组变得过时时在多个共用区块中进行垃圾收集。当共用区块中的数据群组变得过时时所述共用区块经受垃圾收集。此共用区块中的任何剩余有效数据群组写入到另一共用区块中的可用的已擦除空间中,或写入到已擦除集区区块,且接着擦除共用区块。如果正进行垃圾收集的共用区块含有来自不同文件的两个或两个以上有效数据群组,那么无需将其保持在一起而是可将其复制到不同的区块。
图16中展示共用区块的实例,所述共用区块已用来自三个不同数据文件的每一者的共用数据群组进行了编程。因为在一般的NAND阵列中写入数据被限制为从区块的一端处的页进行到另一端处的页,所以数据群组被彼此连续地存储。区块末端处的空白指示区块的其中未写入有数据的页。难以使可用的数据群组完美地配合到整个共用区块中。
由存储器系统指定为可向其中写入一个以上文件的残余数据的打开的共用区块的区块的数目通常将只有几个,但在被进行垃圾收集的大量文件具有不适合任何现有的打开的共用区块中的可用空间的残余文件数据的情况下,所述数目可能变成许多个。将残余文件数据写入到打开的共用区块中最佳地利用整体存储器容量的一个打开的共用区块中。当打开的共用区块的任一者中没有足够的已擦除空间时,关闭现有的共用区块中的一者,且打开另一共用区块作为其替代。或者,无需关闭现有的打开的共用区块,且可允许打开的共用区块的数目增加。新的共用区块可被指定为已擦除集区区块中的一者,但优选地是已含有一些残余文件数据(当可用时)的不完全写入区块,例如图15中的仅含有残余文件数据群组(F3,D3)的最后的区块。然而,对于共用区块的垃圾收集,优选在必要时将已擦除集区区块指定为新的共用区块。
图17说明在存在已含有来自另一文件的残余数据的一个或一个以上数据群组的五个残余或共用单位(每一者是不同的区块或元区块)的情况下写入残余文件数据的示范性过程。从图15的经垃圾收集的文件中产生的最后数据群组(F3,D3)是此残余文件数据的实例,但其可包含来自单个文件的一个以上数据群组。展示有三种可能性。第一种可能性(A)将残余数据写入到残余单位2,因为其具有最多的可用的已擦除空间。第二种可能性(B)选择残余单位5用于残余文件数据,因为其是五个残余单位中最佳匹配者。残 余文件数据几乎填满单位5,且借此在单位2中留下较大的可用空间以用于将来接收更大量的数据。单位1、3或4的任一者中均没有足够的空间来接受残余数据,因此立即排除这些单位。
第三种可能性(C)将残余文件数据写入到来自擦除集区的区块或元区块单位中。一旦已将残余文件数据写入到完全擦除的单位中,其就变为残余单位,且随后可由存储器系统控制器作为共用区块打开。在所示的实例中,通常将不使用可能性(C),因为残余单位2或5的任一者中均存在用于残余文件数据的空间。
或者,可允许文件的残余数据分裂为两个或两个以上部分以便存储在不同的共用区块中。举例来说,没有现有的打开的共用区块可具有足够的可用空间用于存储特定文件的残余数据,且没有已擦除区块可用于作为用于残余文件数据的新的共用区块而被打开。在此情况下,残余文件数据可在两个或两个以上打开的共用区块之间分裂。
可在共用区块充满数据之前将其关闭。如上文所提及,在有必要打开另一共用区块以便存储文件的给定量的残余数据时,通常将关闭具有最少量的可用的已擦除空间的打开的共用区块。这部分地是文件的残余数据未被分裂以存储在不同的共用区块中的优选操作的结果。当存储器系统通过响应主机的“大小”命令(图12E)而向主机报告可用于新数据的存储器存储空间的量时,不包含关闭的共用区块中的这些少量的未使用的容量,因为其不可立即使用。
因为残余文件数据由于其所属的文件被删除或擦除的缘故而变得过时,所以也将共用区块内的数据合并。举例来说,每当共用区块内的残余文件数据不论由于什么原因而被指定为过时时,将所述区块添加到上述过时文件数据区块队列或另一队列。如果数据由于主机对其文件的“删除”命令而变得过时,那么将共用区块置于队列末端。但如果其是由于“擦除”命令而引起,那么共用区块前往队列的最前部分或以其它方式被给予优先权以进行垃圾收集。
替代于单个队列,在存储器系统操作期间控制器可维持五个不同的垃圾收集队列,最初两个队列中的条目被给予优先权:
(1)过时区块的优先队列,所述过时区块即那些由于对文件的“擦除”命令(图12B)而仅含有过时数据的区块;
(2)共用区块的优先队列,所述共用区块含有由于对文件的“擦除”命令而被致使过时的数据但也含有一些有效数据;
(3)过时区块(仅含有过时数据的区块)的队列,所述过时区块由于执行“更新” 或“删除”命令(图12A和12B)或因为其所有有效数据均已在垃圾收集期间被复制到另一区块而产生;
(4)共用区块的队列,所述共用区块响应于“删除”命令或垃圾收集期间发现共用区块中存在过时数据而含有一些过时数据但其也含有有效数据;以及
(5)已接收到“关闭”或“之后关闭”命令的文件的队列。
可以上文列举的次序给予这五个队列优先权,队列(1)中所有项目在队列(2)中的项目之前进行垃圾收集,依此类推。将区块列举在优先队列(1)和(2)中,因为(分别)其数据的全部或一些已由于“擦除”命令而不是由于“删除”命令而被致使过时。以存储器系统操作期间识别的次序将区块和文件添加到队列的每一者,首先对每一队列中最陈旧的区块和文件进行垃圾收集(先入先出,或FIFO)。
队列(4)和(5)中列举的项目的优先权大致相同,因此可颠倒。或者,可存在较复杂的优先权系统,其中也许甚至在较高优先权队列的一者或一者以上为空之前,根据设定的标准从队列(4)和(5)中选择文件和共用区块。管理共用区块的垃圾收集有两个目标。一个目标是使可能由于当共用区块内的数据群组变得过时时对共用区块的垃圾收集而引起的对存储器系统的正常操作的中断最小化。另一目标是使当来自共用区块的数据群组在对所述区块的垃圾收集期间被重新定位时的索引更新最小化。
共用区块的垃圾收集期间,将区块中剩余的有效数据的所有共用群组一次一个地复制到具有所述空间的共用区块的一者。如果打开的共用区块中没有用于正被复制的共用群组的空间,那么将共用群组写入到来自擦除集区的一区块中,且接着可将此区块指定为共用区块。接着,通常作为所述过程的一部分,关闭打开的共用区块的一者。与所有垃圾收集操作中一样,更新文件索引表(FIT)以反映所复制的数据群组的新的存储位置。
应在非易失性存储器中记录垃圾收集队列。应对含有队列信息的页或元页执行读取-修改-写入操作,以添加或移除条目。含有垃圾收集队列信息的页可处于专门的区块或元区块中,或者可与其它类型的页共享区块或元区块(例如,交换区块)。
编程期间对元页的缓冲和使用
上文描述了存储器系统的操作,而未特别关注存储器单元区块是否链接在一起作为元区块。上文描述的主机与存储器系统之间的基于文件的接口和相关的存储器系统操作在使用元区块的存储器系统中以及在不使用元区块的存储器系统中工作。趋势无疑是增加一次写入和读取的数据的量(并行程度),因为这直接改进存储器性能。通过使用由两个或两个以上此类区块形成的元区块来增加各个存储器单元区块的以数据位的数目表示 的有效宽度。
举例来说,参看图3,单个区块内沿着字线的每一者的所有存储器单元可作为一页而一起编程和读取,从而可能在每一行中存储用户数据的若干份一个、两个、四个或四个以上512字节的扇区。且当两个或两个以上区块逻辑上链接成元区块时,所述两个或两个以上区块的每一者的一行中的所有存储器单元可一起编程和读取。来自两个或两个以上区块的一起编程和读取的两个或两个以上页形成一元页。利用一次编程如此多的数据的能力,元页内数据的某一程度的分级可帮助充分利用此可用的并行性。
图18中说明三个主机文件的每一者的数据的一个元页,为了简单起见,每一元页展示为仅包含两页。元页的每一页的数据编程到元区块的不同区块中。
对于主机文件1,图18A中展示元页用作为单个数据群组0的一部分的具有连续偏移量(逻辑地址)的数据填充。将这些数据并行编程到元区块内接收文件1的数据的按次序的下一元页中。图18B中,展示此实例的主机文件2的不同之处在于,其第一页的一部分包含数据群组1的具有连续偏移量的部分,且元页的其余部分含有另一数据群组2的具有连续偏移量的部分。尽管在两个数据群组在文件2元页内接合的地方数据的偏移量可能存在不连续性,但这些数据共用编程在单个元页中。如先前所述,直接文件存储接口以主机文件的数据被从主机接收时的状态写入所述数据,而不管所述数据在文件内的偏移量的次序如何。
一些快闪存储器不允许将数据编程到已擦除页中一次以上。在此情况下,图18B的数据群组1和2两者同时被编程。但如果存储器允许部分页编程,那么可将文件2的两个数据群组在不同时间编程到非易失性存储器的单个元页中。在此情况下,将在不同时间对页0进行编程,首先用数据群组1编程,接着将数据群组2编程到页0的剩余部分中并编程到页1的全部中。然而,通常优选地并行编程两个数据群组,以便提高系统性能。
图18C中,展示单个数据群组3的末端已被写入到文件3的元页中。存在此少量数据编程到非易失性存储器的元页中而所述元页的剩余部分维持被擦除的某些情况。一种情况是,当主机发布对文件(其数据群组3是残余文件数据)的“关闭”命令(图12B)时,如果主机试图打开的文件数目超过所允许的数目且选择将文件3关闭以便允许改为打开另一较活动的文件,那么也可通过存储器控制器来关闭文件3。存储器控制器也可在缓冲存储器中没有足够的容量用于已打开的所有文件元页缓冲器的情况下关闭文件3。在这些情况中的任一者中,需要将文件缓冲器的部分数据内容立即写入到非易失性存储 器(“清洗”所述文件缓冲器)。主机还可发送“停机”命令(图12D),这意味着存储器可能丢失电力,且其易失性缓冲存储器内的所有数据如果未立即编程到非易失性存储器中则会丢失。
如果随后需要将文件3的另一数据群组4的开始写入到图18C的存储器元页且所述存储器不允许部分页编程,那么数据群组4的第一页写入到文件3元页的第二页中,如图18D所示。这可能在非易失性存储器元页内产生一些未使用的存储器容量,如图18D的数据群组3与4之间的空白部分所指示。此未使用的容量可通过在关闭文件3之后执行的垃圾收集操作而恢复,或可允许此未使用的容量持续,因为此情形可能很少发生。
重要的是应注意,本发明的直接文件存储技术可容许非易失性存储器的区块内的这些未填充的空隙。当前系统无法容易地容许这些空隙,在当前系统中,存储器系统通过逻辑地址空间与主机介接,如图7和8所说明。与存储器区块或元区块大小相同的逻辑数据群组映射到这些区块或元区块中。如果存储在现有存储器系统的区块或元区块内的数据中将存在空隙,那么映射到空隙中的逻辑数据地址将实际上不可由主机使用。主机假定在这种现有接口中,其具有其可用的整个逻辑地址空间,但新数据很难(如果甚至可能的话)写入在指定空隙的逻辑地址处。
通常利用系统控制器中的缓冲存储器的一部分(例如,图2的存储器31)作为编程数据缓冲器。此存储器中应存在用于主机正写入的每一活动文件的缓冲器容量。每一此类“文件缓冲器”应具有与快闪存储器中的至少一个元页相等的容量。活动文件是主机最近已将数据写入到的打开的文件。
存储器系统任何一次处理的活动主机文件的数目可等于当前打开的存储器系统文件的数目,或可为较小的数目。如果所允许的活动文件的最大数目小于所允许的打开的文件的最大数目,那么必须准备在活动与打开(且反之亦然)之间改变文件的状态。为了允许这样做,将快闪存储器中的临时存储区块指定为交换区块,且可将长度小于一个元页的数据从文件缓冲器写入到交换缓冲器中的元页,且反之亦然。在交换区块中维持有效的交换的文件缓冲器的索引。文件缓冲器数据作为整数个页而复制到交换区块,之后是提供每一复制的文件缓冲器的长度和位置以及与其有关的文件的索引的单个页。周期性地压缩交换区块并当其变满时将其写入到已擦除区块。
当打开的文件A(例如)由于主机对其进行的写入操作而必须使其活动时,识别写入最久的活动文件B,且将其文件缓冲器数据从控制器缓冲存储器复制到交换区块中接下来可用的页。接着在交换区块中识别文件A的文件缓冲器数据,并将其复制到控制器 缓冲存储器中先前分配给文件B的可用空间。
来自文件缓冲器的数据优选地根据图18所示的情况中的一者写入到快闪存储器中用于所述文件的打开的写入区块中的下一可用的元页。图18A中,当文件1缓冲器中存在形成文件1内单个数据群组0的一部分的足够的数据时,在单个操作中将其编程到完整元页。图18B中,当文件2缓冲器中存在形成文件2内数据群组1的末端和数据群组2的开始的足够的数据时,在单个操作中将其编程到完整元页。如果快闪存储器装置支持对单个页的多个编程操作(部分页编程),那么当文件2缓冲器中存在形成文件2内数据群组1的末端的足够的数据时,可将其编程到页0的一部分。当形成文件2内数据群组2的开始的足够的数据在文件2缓冲器中变得可用时,可随后在单独编程操作中将其编程到相同元页的剩余部分。
如图18C所示,当文件3缓冲器中存在形成文件3内数据群组3的末端的数据,且必须执行缓冲器清洗操作时,将其编程到页0的一部分。如果快闪存储器装置不支持对单个页的多个编程操作(部分页编程),那么当形成文件3内数据群组4的开始的足够的数据在文件3缓冲器中变得可用时,随后在单独编程操作中将其编程到相同元页中的页1。
还在垃圾收集期间使用元页文件缓冲器。可从非易失性存储器中读取文件的有效数据群组并将其写入到所述文件的控制器缓冲器元页中。如果同时重新排序文件,那么将数据群组以其主机数据偏移量的次序写入到缓冲器中。当然,每一数据群组中的数据具有连续的逻辑偏移量。一旦元页缓冲器已满,就将其数据并行编程到非易失性存储器的新的区块中。
文件索引
存储在存储器系统中的每一文件通过其自身的索引条目序列界定,如上文尤其是参看图13-16所述。这些条目随着时间由于在其中附加、插入或更新文件的数据且当文件经受垃圾收集时变化。图19说明在若干不同时间0、2、4和5一个文件的文件索引表(FIT)中索引条目的序列。这些分别是上文参看图14A、14C、14E和15描述的序列。FIT中的数据优选地由存储器控制器写入并保持当前状态,而不用来自主机系统的帮助。主机系统在将数据写入到存储器系统时供应路径名、文件名和文件内数据的偏移量,但主机不参与界定数据群组或数据群组存储在存储器单元阵列中的何处。在图19的条目中,图14和15的存储器单元区块从左侧以1开始编号。因此(例如)对于处于图14C中说明的状态的文件,其第三数据群组(F6,D7)在图19中记录为存储在区块004(从左侧 开始第四区块)中,从所述区块的初始地址开始的D7字节。每一数据群组的长度优选地也包含在表的每一条目中。
存储器控制器在对文件的改变导致对文件的数据群组的修改时或以其它较不频繁的时间间隔重写图19所示的一个文件的序列索引条目。控制器可将这类变化存储在其存储器中,且接着将其中许多变化一次写入到快闪存储器。任何一个时间一个文件仅存在一组有效的索引;图19中展示在不同时间界定文件的四组此类索引。存储器系统控制器接着视需要使用文件的当前组索引将额外数据编程到文件、从文件读取数据、对文件的数据进行垃圾收集,且可能用于其它操作。因此,如果各个文件索引条目以其文件偏移量(Fx)的次序存储则FIT较易于使用,但如果不,那么控制器当可以所述逻辑次序读取条目。存储器控制器读取特定文件的索引条目的最一般原因是在执行主机命令的过程中。
图20展示维持并使用文件索引表(FIT)作为文件映射的一部分的优选技术。使用文件索引结构链来识别具有指定路径名的文件内具有指定偏移地址的数据的物理位置。文件映射包含目录201,其具有与用于常规逻辑地址接口的标准磁盘操作系统(DOS)根目录和子目录结构大体相同的逻辑结构。文件目录201可存储在存储器系统内一个或一个以上专用快闪区块中。但文件目录201优选地由存储系统而不是主机管理。本文图12C的主机目录命令由存储器系统控制器执行,但在由控制器决定的时间且以由控制器决定的方式执行。优选地不允许主机直接向文件目录写入。
在文件目录201中保持各识别目录或文件的均匀大小的条目。使用一组连续的条目来指定特定目录内的元素。指定目录的条目中的指针字段识别指定所述文件内的元素的其它连续条目的开始。指定文件的条目中的指针字段界定相关联的文件索引表(FIT)203内的区块编号和文件编号。
FIT 203含有数据群组的均匀大小的条目,每一条目识别数据群组的开始的偏移量和数据群组的存储器系统内的物理位置。如果逻辑地址以字节粒度维持,那么每一FIT条目的偏移量含有从指定数据群组的开始的文件的开始处起的指定数目的字节。类似地,可以字节粒度指定数据群组的开始处的物理位置。上文参看图19描述了不同时间示范性文件的FIT条目的内容。为每一数据群组维持单独条目。每一文件由文件内数据群组的一组连续的索引条目界定。每文件的此类条目的数目通常将变化。
主机供应的文件的路径名用于遍历文件目录的层级以获得FIT内的区块编号和文件编号。路径名通常包含一个、两个或两个以上目录和子目录。这些用于访问文件目录201内的含有试图访问的文件的目录。接着搜索所述目录内的文件名以查找主机供应的文 名的条目205。当找到时,条目205为所述文件的FIT 203中的一组连续的条目提供指针。这些条目的性质与参看图19描述的条目相同。接着将这些条目的偏移量与由主机供应的偏移地址进行比较以便识别正确的条目207,且因此识别正确的数据群组。如果偏移量不存在恒等匹配(可能经常如此,因为包含在条目中的偏移量仅是数据群组的开始地址),那么选择识别内部含有所述偏移量的数据群组的条目。在此实例中,FIT 203的选定条目207含有包含主机正试图访问的数据的存储器位置的物理区块和字节。
当首次创建文件或当FIT 203中文件的数据群组条目的位置改变时,存储器系统控制器分派图20的所述文件的目录条目205的指针。此指针是之前论述的文件_句柄的实例。为了避免主机每当访问文件时必须搜查文件目录201的层级以便查找文件的FIT条目,存储器系统可将文件_句柄发送到主机使得其随后可直接访问打开的文件的FIT条目。
图21说明存储器系统内的存储文件目录201中的各个条目的页。一些条目为文件目录201内的目录提供指针且其它条目为FIT 203内的数据提供指针。作为存储在单个存储器页中的许多条目之一的示范性条目209说明每一条目具有四个字段。第一字段含有主机所分派的目录或文件的名称。第二字段含有主机所界定的目录或文件的属性。在目录的条目的情况下,第三字段中的指针指向文件目录中的另一条目。在文件的条目的情况下,第三字段含有针对FIT 203中的文件条目(例如,条目207)的指针。识别为“数据群组”的第四字段在目录的条目中为空,但在文件的条目的情况下,此字段指定含有文件的数据的数据群组的数目,且因此指定文件的FIT 203中的条目的数目。
将注意到,图21中说明的文件目录页含有两个部分。在最新近写入的页211中,目录条目(页213中的在209处指示的一个目录条目)和页指针均存在。在其它目录页(例如,页213)中,存在目录条目但页的一区域含有过时页指针。当前页指针维持在最新近写入的页(在此情况下为页211)的相同部分中。目录区块中每一逻辑页存在一个页指针,且页指针将存储器控制器导向对应于其正访问的逻辑页的物理页。通过在最新近写入的目录页中维持页指针,页指针与目录条目同时更新且无需接着更新另一页。2004年8月13日由Gorobets等人申请的第10/917,725号美国专利申请案中针对逻辑地址类型的文件系统更详细描述了此技术。
在特定实施方案中,目录区块含有固定数目的逻辑页,所述数目是存储器单元区块中总共页的指定分数(例如,50%)。目录区块优选地是专用于存储目录页的元区块,但可以是单个擦除区块。其可具有与用于存储数据群组的元区块相同的并行性,或者其可具有减小的并行性。当文件目录区块变满时,通过在擦除原始区块之前将每一逻辑页的 有效版本复制到新的区块而对文件目录区块进行压缩。紧接着在已压缩目录区块之后,仅用目录条目写入新的复制区块中的界定分数(例如,50%)的页。剩余页处于已擦除状态以允许写入经更新的或新的条目。
当创建、修改或删除目录或文件的条目时,在目录区块的下一可用已擦除页中重写含有所述目录或文件的目录的一组条目,因此使目录的条目保持连续。这通过对先前含有所述目录的条目的页执行读取/修改/写入操作来进行。先前页于是变得过时。所述逻辑页的页指针条目也被更新以识别其新的物理页。这可在与用于写入所述目录的条目相同的页编程操作中进行。
如果创建条目将导致目录的一组条目从页中溢出,那么可改为将所述条目写入另一页中作为第一条目。也可重写现有页以视需要将目录的该组条目移动到页的末端。可在页指针中重新分配目录区块内的逻辑页编号以使目录的条目保持连续。
图20的文件索引表(FIT)203存储组成装置中所有文件的数据群组的索引。FIT存储在存储器系统的一个或一个以上专用FIT区块中。每一FIT区块可为多达最大数目的文件存储索引。借助来自文件目录的逻辑指针来访问FIT,所述逻辑指针指定由表索引的文件中的一者。指针通过访问作为最新近写入的FIT页217的一部分而提供的文件指针来使用间接寻址,使得其不随着在FIT区块内更新和重写索引而变化。
文件目录201中的文件条目(例如,条目205)的FIT指针具有两个主要字段。第一字段是FIT区块编号,其识别组成FIT的逻辑FIT区块中的一者。单独管理分配给FIT区块编号的实际物理区块地址。FIT指针的第二字段是FIT文件编号,其识别经识别的FIT区块内的逻辑文件编号。通过存储在FIT区块的最新近写入的页内的特定文件指针将逻辑文件编号转换成物理文件条目位置。
FIT不具有预先界定的大小,且FIT区块的数目是数据被组织成的文件的数目和数据群组的数目的函数。在装置的操作期间将创建新的FIT区块以及消除FIT区块。
参看图22,各个FIT页具有许多数据群组条目,每一数据群组一个条目219,如先前参看图19所描述。在此特定实例中,每一条目219含有四个字段。文件偏移量字段指定文件内由所述条目识别的数据群组的开始的偏移地址。区块地址字段指定存储器系统内含有数据群组的区块或元区块的物理地址。字节地址字段指定区块或元区块内页的地址,以及数据群组开始的页内的字节。第四字段是数据群组的长度。数据群组长度可能不是在所有情况下都是必需的,因为可根据邻近条目的数据计算数据群组的长度。然而,通过维持长度,不必每当需要数据群组的长度时均进行此计算。如果数据群组条目未以 其逻辑地址的次序写入在FIT中(此时因而计算变得较困难),这是尤其有价值的信息。
优选地通过一组连续的数据群组条目来界定主机文件,所述连续的数据群组条目一起界定形成文件的有序数据群组。图22的页215中所示的阴影连续群组条目界定一个文件,且页217中的那些条目界定另一文件。对于FIT中的各个文件的每一者,在最后写入的FIT页217中存在针对维持在所述区块中的各个文件的一个文件指针221。文件指针221利用FIT区块内的特定FIT文件编号来界定文件的文件条目的开始。其含有两个字段。一个字段是数据群组索引条目所驻存的页的物理编号,且另一字段是所述页内的第一群组条目的编号。FIT区块中每一可能的文件编号均存在文件指针,即文件指针的数目等于FIT区块中文件的最大数目。文件指针条目中的保留代码(未图示)指示,FIT区块中特定文件编号未被使用。尽管文件指针可存在于其它FIT页中,但其仅在FIT区块的最新近写入的页中有效。
FIT区块优选地是专用于存储FIT页的元区块。其可具有与用于存储数据群组的元区块相同的并行性,或者其可具有减小的并行性。可改为使用单个擦除区块。紧接着在已压缩FIT区块之后,区块中仅界定的分数(例如,50%)的页将含有条目。剩余页将处于已擦除状态以允许写入经更新的或新的条目。当维持较大数目的文件时,可能必需一个以上FIT区块。
通过将一个或一个以上完整文件的数据群组条目写入在FIT区块的下一可用的未编程的页中来更新FIT。还更新文件的文件指针条目以识别文件条目的新的位置。在同一页编程操作中写入文件数据群组条目和文件指针两者。接着,文件条目的先前位置在FIT区块中变得过时。或者,可通过将文件条目写入在不同的FIT区块中或新的FIT区块中来更新文件条目。在此情况下,应更新两个区块中的文件指针,且应修改文件目录中文件的逻辑指针。
当FIT区块已满时,以压缩形式将有效群组条目复制到新的已擦除区块,并擦除先前FIT区块。逻辑FIT区块编号和逻辑文件编号并不因此操作而改变。应限制数据群组条目的数目,使得在压缩的FIT区块中仅编程界定的分数(例如,50%)的页。如果必要,应将文件条目移动到其它FIT区块,且修改其在文件目录中的逻辑指针。
需要将单个文件的所有FIT条目保持在一个页或元页中。这使得读取文件的所有条目相对容易。尽管文件的FIT条目可通过在每一者中包含下一者的物理地址而链接在一起,但将可能需要读取一个以上FIT页或元页。还需要使FIT条目在页内保持连续。这可能导致随着FIT条目的数目增加而频繁地写入新的页,尤其当打开关闭的文件并向其 添加数据群组时。当将新的FIT条目写入到新的页中时,从另一页复制现有条目并将其连同新条目一起写入在新的页中。检索现有条目的先前页中由过时数据占据的空间以在压缩FIT区块时使用。
如上所述,各个数据群组包含在单个区块或元区块内,可在区块内的任何字节边界开始,且可具有任何整数个字节的长度。可在将每一数据群组写入到存储器中时由控制器向其添加标头。此标头可包含两个字段。第一字段含有识别数据群组的开始的代码。此代码对于所有数据群组可能是相同的,且被选择作为位图案,所述位图案很少存在于存储为群组的一部分的数据中,但所述代码不一定从不出现在此类数据中。存储器控制器可通过以下方式来找到数据群组的开始:扫描所存储的数据以获得此代码并接着在其找到代码的位图案时确认其确实是数据群组的开始而不是群组内的数据。标头的第二字段允许进行此确认。此第二字段是FIT 203(图20和22)中针对含有数据群组的文件的文件条目的指针。第二字段界定FIT区块编号和FIT文件条目。控制器接着读取FIT文件条目以了解其是否指回到从中读取代码的数据群组。如果是,那么确认所述代码是其处于数据群组的标头内的指示。如果不是,那么知道代码的位图案是从其它数据中读取的,因此所述位图案被作为数据群组标头而忽略。
通过包含此标头作为存储在各个数据群组中的数据的一部分,存储器中的任何数据群组所属的文件可通过读取其标头并访问标头所指向的FIT条目来确定。FIT条目219(图22)可包含文件ID。这里使用此能力(例如)在共用区块的垃圾收集期间识别共用区块中的数据群组。如果因为共用区块内的一个或一个以上其它数据群组过时而开始垃圾收集,那么需要能够识别每一剩余有效数据群组所属的文件。
代替于使标头成为每一数据群组的一部分,可每文件提供一个标头。有利的是当文件中的数据群组的FIT条目的位置已知时能够识别文件的路径全名,且文件标头使这一目标成为可能。可提供此标头作为文件的FIT中的条目组中的第一条目,或作为文件目录中的目录的一组条目中的第一条目。
此文件标头含有将其识别为FIT文件标头的代码,和指向其的目录条目的反向指针。FIT文件标头还可含有额外信息,例如文件的长度和数据群组的数目。或者,标头条目可占据一个或一个以上正常条目的空间。
类似地,目录标头条目含有将其识别为目录标头的代码,和指向其的目录条目的反向指针。在根目录的标头中明确地识别所述根目录。目录标头还可含有额外信息,例如目录中条目的数目。
作为使用此类数据群组或文件标头的替代,可将索引写入在每一共用区块的末端以识别共用区块中每一数据群组所涉及的文件。当关闭共用区块时,可写入此索引。所述索引优选地包含共用区块内的所述区块中的每一数据群组开始处的物理字节地址,和所述数据群组的FIT条目的指针。接着可参考数据群组的索引条目中提供的FIT条目来确定每一共用区块数据群组所属的文件。
如果需要具有针对存储在存储器中的数据群组的文件标识的某一冗余度,那么即使使用这些共用区块索引,也可仍然保留上述数据群组标头。
由于存储器装置管理文件目录和文件索引,所以其可控制向主机报告的装置配置参数。当如当前商业系统中由主机管理装置的文件系统时,这通常是不可能的。存储器装置可改变所报告的存储容量,例如整个装置的容量和可用的未写入容量两者。
用于直接文件接口处的文件的路径名可识别存储装置本身的ID和存储装置内的隔区。可能有利的是,允许存储器装置修改隔区的大小和数目。如果隔区变满,那么可将来自一个或一个以上其它隔区的未使用的容量重新分派给已满的隔区。类似地,如果创建了新的隔区,那么可分派来自其它隔区的未使用的容量。如上所述,装置可修改各个隔区的所报告的容量。
图20和21所示的目录结构在目录条目中使用指针来识别所述目录内的元素的一组其它连续条目的开始。此指针指向目录区块内的逻辑页,并在对应于所述逻辑页的物理页改变时保持不变。然而,目录内元素的数目频繁地变化,且特定目录的一组条目将频繁地需要从一个逻辑页移动到另一逻辑页,或在其当前逻辑页内移动。这可导致频繁地需要更新目录区块内的指针参考。图23中展示图21的目录结构的条目索引技术的替代技术,其中用相同参考标号但添加撇号(′)来识别其相应的元素。
图23的结构与图22的FIT的结构相同,但具有涉及目录的不同的术语。指向特定条目,而不是如图21中仅指向页。这提供了一种比上文参看图21描述的方法有效的针对指定目录的一组条目的目录区块内间接寻址的方法。适当的是针对目录(图23)和FIT(图22)区块使用相同索引方案,因为两者具有非常类似的特性和要求。其各存储与目录或文件有关的若干组连续条目。一组条目的更新可包含改变现有条目的内容或改变条目的数目。
参看图22描述的更新FIT条目的方法使得含有FIT条目的物理区块中一定分数(例如,50%)的页在压缩区块之后处于已擦除状态。这因而允许将经更新的FIT条目写入到经压缩区块的剩余部分中。所有FIT区块均包含此容量开销,即使当由区块索引的文 件实际上均不打开时也如此。因此,FIT占据比所需更多的存储器容量。
替代性FIT更新方法促使将经更新的FIT条目组写入在单独FIT更新区块中,而不是写入到其最初所处的区块中的可用的已擦除容量中。图24和25分别概述利用更新区块的针对文件目录和FIT的索引技术。所述技术是相同的,只存在目录与FIT的术语差异。
以下描述涉及更新如图25所示的FIT区块中的群组条目,但同等适用于更新文件目录(图24)中的群组条目。
从FIT区块读取群组条目如上文所述。FIT指针的FIT区块编号字段界定逻辑FIT区块。FIT区块列表包含在快闪中的数据结构中,且提供信息以将FIT区块编号转换成其所处的区块的物理地址。每当在压缩或合并操作期间移动FIT区块时,更新FIT区块列表中的区块地址。
所述区块中最新近写入的页的文件指针区域允许将FIT指针中的FIT文件编号值转换成指定特定文件的文件群组条目组的开始的文件指针。接着可从FIT区块读取文件群组条目。
当更新文件的群组条目组中的群组条目的内容或群组条目的数目时,在已擦除页中重写完整组的条目。(这是基于以下假定:页是快闪存储器中最小的编程单位,擦除操作之间禁止对同一页进行多个写入操作。)所述组视需要可占据多个页。
在当前描述的技术中,此页是FIT区块中的下一可用的页。在经修正的方案中,此页是单独FIT更新区块中的下一可用的页。FIT更新区块具有与FIT区块相同的页结构,如图23所示。其存在通过FIT更新区块列表中目标FIT区块编号的存在来识别,所述FIT更新区块列表还含有更新区块的物理区块地址和对应于原始FIT文件编号的更新文件编号。正更新的每一FIT区块可能存在单独的FIT更新区块,或优选地,FIT更新区块可涉及多个FIT区块。单个FIT区块也可涉及多个FIT更新区块。
当FIT更新区块变得被填满时,可将其有效数据以压缩形式写入到已擦除区块,所述已擦除区块变成新的FIT更新区块。如果更新仅涉及几个文件,那么可能存在单个页那样少的有效数据。可将多个FIT更新区块压缩在一起成为单个区块。如果更新区块涉及可能继续被更新的仍然打开的文件,那么区块压缩优于区块合并。
当在FIT更新区块中更新文件的群组条目时,原始FIT区块中的所述文件的条目变得过时。在某一阶段,原始FIT区块必须经历垃圾收集操作以对其进行清除。这可通过将FIT区块和FIT更新区块中的有效数据合并到已擦除区块中来进行。
如果条目的数目在更新过程期间已增加且无法将有效数据合并到单个已擦除区块中,那么可将最初分派给所述FIT区块的文件重新分派给两个或两个以上FIT区块,且可对两个或两个以上区块执行合并。
来自FIT更新区块的条目可与来自FIT区块的条目合并,且因此从FIT更新区块中排除,而其它文件的条目可保持在FIT更新区块中。
作为另一替代,可将目录区块和FIT区块结构归并成单个索引区块结构,其可含有目录条目和文件群组条目两者。当存在单独的目录区块和FIT区块结构时,或当存在组合的索引区块结构时,索引更新区块可充当目录条目和文件群组条目两者的更新区块。
将认识到,上文参看图20-25描述的文件目录和FIT是以DOS系统为模型的。或者,其可以Linux、Unix、NT文件系统(NTFS)或某一其它已知的操作系统为模型。
特定存储器系统操作实例
图26-32的操作流程图提供如上文参看图2-6描述而构造的但使用参看图9和10-22描述的直接文件接口技术的特定组合的存储器系统的操作的实例。图26-32的流程图中包含的功能主要通过控制器11(图2)执行其所存储的固件来实行。
首先参看图26,图中展示总体系统操作。在第一步骤251中,初始化存储器系统,其包含处理器27(图2)执行ROM 29中的引导代码以将固件从非易失性存储器加载到RAM 31中。初始化之后,在此固件的控制下,存储器系统接着期待来自主机系统的命令,如步骤253所指示。如果有主机命令待决,那么从图12中列举的那些命令中识别所述命令。如果是“读取”命令(图12A),那么其在步骤255中识别并通过257处指示的过程执行,下文参看图27更完整地描述所述过程。如果不是“读取”命令,那么图12A的“写入”、“插入”或“更新”编程命令中的任一者在图26的步骤259处识别并通过过程261来执行,所述过程261是图28的主题。如果是“删除”或“擦除”命令(图12B),那么其在步骤262中识别并在步骤263中执行,如图30中更详细描述。来自主机的“闲置”命令(图12D)在图26的264处识别并导致图31的流程图中所示的垃圾收集操作265。图26-32的此实例是针对如先前所述以元页和元区块操作的存储器系统描述的,但也可由按页和/或区块组织的存储器系统执行。
如果此特定实例中,主机命令是除了“读取”、“写入”、“插入”、“更新”、“删除”、“擦除”或“闲置”以外的命令,那么此另一命令由图26的步骤267执行。这些其它命令中存在促使将垃圾收集操作添加到队列的命令,例如图12B中列举且上文描述的“关闭”和“之后关闭”命令。通过步骤257、261、263、265或267中的任一者执行所接收 的命令之后,下一步骤268询问优先垃圾收集队列是否为空。如果是,那么处理返回步骤253以执行待决的主机命令(如果有一个存在的话)。如果不是,那么处理返回步骤265以继续进行垃圾收集,而不是允许执行另一主机命令的可能性。对于参看26-32的流程图描述的特定实例,存在上文描述的五个不同的垃圾收集队列:针对过时元区块(仅具有过时数据的元区块)和具有过时数据的共用元区块的两个优先队列,其中过时数据是由于“擦除”命令而产生的;针对具有过时数据的过时元区块和共用元区块的另外两个队列,其中过时数据是由于除了执行“擦除”命令以外的原因而产生的;以及针对待进行垃圾收集的文件的一个队列。对于三个非优先队列中列举的垃圾收集,给予另一待决的主机命令优先权以实行所列举的垃圾收集操作。然而,对于优先队列中的垃圾收集,给予垃圾收集优于执行新的主机命令的优先权。也就是说,可使主机一直等到任何优先垃圾收集操作完成为止,然后可执行新的主机命令。这是因为主机先前已将优先权给予通过使用“擦除”命令而擦除优先队列中的元区块中的数据。优先垃圾收集还导致以相对较少的处理时间产生额外的已擦除元区块。但如果不是优先的,那么当主机闲置时在后台执行垃圾收集,或当有必要维持已擦除区块集区时将垃圾收集与其它操作交错。如果通过步骤268确定无待决的优先垃圾收集操作,那么下一步骤是步骤253,其中执行新的主机命令(如果有的话)。
返回图26的步骤253,如果无待决的主机命令,那么,如果通过步骤269确定主机已不活动或闲置持续预定的时间长度或最新近接收的主机命令是“闲置”命令,或者通过步骤264确定待决的主机命令是“闲置”命令,那么实行垃圾收集265,包含非优先的垃圾收集。在这些情况下,因而最有可能完全在后台执行垃圾收集。
图26的步骤257中的“读取”命令的执行是图27的流程图的主题。第一步骤271是读取文件索引表(FIT),如上文参看图19和22所描述。主机“读取”命令包含文件ID和读取将开始的文件内的偏移量(见图12A)。待读取的文件的所有FIT条目或其部分优选地从非易失性存储器读取到控制器存储器31(图2)中,以避免每当需要来自FIT的某些数据时必须从非易失性存储器读取FIT。在步骤273中,将数据群组数目计数器初始化为组成开始偏移量所处的所请求文件的数据群组的数目。这通过将主机指定的开始偏移量与主机指定的文件的FIT条目中的数据群组的偏移量进行比较来进行。接着,在步骤275中,将数据群组长度计数器初始化为初始数据群组内从主机供应的偏移量到数据群组末端的数据的量。一次读取一个数据群组,且步骤273和275设置管理对第一数据群组的读取的两个计数器。根据初始数据群组的FIT条目确定待读取的数据在非易 失性存储器内的开始物理字节地址。群组内数据的逻辑偏移和物理字节地址线性相关,因此如果不在数据群组的开始处开始读取,那么根据文件内的主机供应的开始偏移量计算开始字节地址。或者,为了简化数据群组长度计数器的初始化,可将每一数据群组的长度添加到其FIT的记录219(图22)。
对于对流程图的此描述的其余部分,假定存储器系统以元区块操作且以元页为单位来读取和编程数据,如先前所述。在步骤277中,从存储在非易失性存储器中的包含开始字节地址的初始数据群组读取数据元页。接着,通常将所读取的数据写入到控制器缓冲存储器(例如,图2的RAM 31)中以便传递到主机。接着,在步骤279处,使数据群组长度计数器递减所述一个元页。接着,在步骤281中,读取所述计数器以确定其是否已达到零。如果不是,那么有初始数据群组的更多数据待读取。但在返回步骤277以依次读取下一数据元页之前,步骤283检查主机是否已发布另一命令。如果是,那么终止读取操作,且过程返回图26的步骤253以识别所接收的命令并接着执行所述命令。如果不是,那么通过在图27的步骤277和279中读取初始数据群组的下一元页而继续读取初始数据群组。这一直继续,直到通过步骤281确定数据群组长度计数器已达到零为止。
当此发生时,在步骤285中再次读取文件的FIT条目以在步骤287中确定是否有当前文件的任何另外的数据群组待读取。如果是,那么在步骤289中更新数据群组数目计数器以识别下一数据群组,且在步骤291中将数据群组长度计数器初始化为新群组中数据的长度。接着,如果通过步骤283确定无其它主机命令待决,那么在步骤277中读取新的数据群组的第一元页。接着,针对新的数据群组的每一元页重复步骤277和279,直到读取了其所有数据为止,此时步骤285和287确定是否存在又一数据群组,依此类推。当通过步骤287确定主机供应的偏移量之后的文件的所有数据群组均已被读取时,处理返回图26的步骤253以执行另一主机命令。
在将文件用作环形缓冲器的特殊情况下,可在图27的步骤287之后重复对文件的读取,而不是返回图26的步骤253。这可在以下情况下发生:读取期间通过在步骤283中响应将数据写入到当前文件的主机命令而由主机对所述相同文件的数据进行编程。
图28的流程图中给出图26的数据编程操作261的实例。当从主机接收图12A的数据编程命令中的一者时,所述命令包含数据将被写入到的文件的文件ID。第一步骤295确定所述指定的文件当前是否打开以用于编程。如果是,那么下一步骤297确定控制器缓冲器(例如,图2的RAM 31)中是否存在针对所述文件的数据。主机系统将数据传递到控制器缓冲存储器中,且接着存储器系统控制器将数据传递到快闪存储器中。
但如果通过步骤295确定主机指定的文件未打开,那么下一步骤299询问当前由存储器系统打开以用于编程的文件的数目是否等于或大于存储器系统允许同时打开的最大数目N1。数目N1预设于存储器系统内,且可为5、8或某一其它文件数目。如果打开的文件的数目小于N1,那么下一步骤301促使通过提供向新的文件编程数据所必需的系统资源而打开所述文件,且处理进行到步骤297。然而,如果步骤299中确定打开的文件的数目等于或大于N1,那么首先需要关闭当前打开的文件(如步骤303所指示),然后才可在步骤301中打开新的文件。选择要在步骤303中关闭的打开的文件的标准可变化,但最一般地将是主机最久将数据写入到的打开的文件。从这一情况推测,主机不太可能在不久的将来将数据写入到此文件。但如果其确实这样做,那么在关闭另一打开的文件之后再次打开所述文件(如果那时有必要的话)。
当在步骤297中确定当前文件的至少一个数据元页在控制器缓冲器中时,下一步骤305确定存储器阵列内的元区块是否已打开以用于编程。如果是,那么接着在步骤307中,将数据从控制器缓冲存储器编程到打开的元区块中。如果不是,那么在步骤308中,通过提供向元区块编程数据所必需的系统资源而首先打开所述元区块。在此实例中,将数据以一次一个元页为单位写入到打开的存储器元区块中。一旦写入了此数据单位,下一步骤309就确定打开的写入元区块是否充满数据。如果不是,那么过程通常通过步骤311和313而前进并返回步骤297以重复对当前打开的文件中的下一数据元页进行编程的过程。
然而,如果通过步骤309确定写入元区块已满,那么在步骤315中关闭所述元区块,且在步骤317中更新FIT,其中包含关闭当前数据群组,因为已达到存储器元区块边界。接着,在步骤318中,更新较低优先权的过时元区块垃圾收集队列的元区块条目。在步骤317中的FIT更新期间,确定填充写入元区块是否已创建另一含有当前文件的所有过时数据或作为含有当前文件的过时数据的共用元区块的元区块。如果是,那么通过步骤318将所述元区块添加到适当的较低优先权元区块队列以进行垃圾收集。处理接着返回步骤311并经过步骤313而返回步骤297。这次通过步骤305和307,步骤308将打开新的写入元区块,因为先前的元区块刚刚通过步骤315关闭。
已通过包含步骤307的路径写入每一数据元页之后,步骤311询问当前存在于已擦除元区块集区中的元区块的数目是否超过已确定为有效地操作存储器系统所必需的最小数目N2。如果是,那么步骤313询问是否已接收到另一主机命令。如果无其它主机命令待决,那么针对待编程到存储器中的下一数据元页重复步骤297。但如果已接收到主机 命令,那么在步骤319中更新FIT以关闭已写入的数据群组。在步骤320(类似于上述步骤318)中更新较低优先权过时元区块垃圾收集队列中的元区块条目之后,过程返回图26的步骤253。
但如果在图28的步骤311中确定缺乏用于存储数据的已擦除元区块(等于或小于预设数目N2),那么执行子例行程序以在前台对文件或共用元区块进行垃圾收集,以便增加已擦除元区块的数目。此垃圾收集优选地不在将每一数据元页写入到存储器中之后执行而是只是在已写入每N3个元页之后执行。写入元区块元页编程计数器维持已被连续编程而其间没有任何垃圾收集的主机数据元页的数目的计数。每当执行垃圾收集时将此计数器重设为零,且接着每当编程一个数据元页时使此计数器递增1。在步骤321中,确定所述计数是否超过预定数目N3。如果不是,那么在步骤323中使计数器递增1以记录在步骤307中将一元页写入到存储器中。但如果编程计数器的计数超过数目N3,那么通过步骤325、327和329发生垃圾收集,之后在步骤331中将编程计数器重设为零。
在所述过程中的此点处进行垃圾收集的目的是为已擦除元区块集区创建额外的已擦除元区块。但优选地,每次仅通过执行步骤325、327和329而执行垃圾收集操作的一部分。将复制操作划分为随着时间散开的较小的操作以便使存储器无法供主机使用的时间间隔的持续时间最小化,借此使对数据编程性能的不良影响最小化。并且,由于同一原因,仅每隔N3个编程循环执行部分垃圾收集操作。尽管数目N2和N3可预设于系统中,但其可替代地在存储器系统的操作期间确定以适合可能遇到的特定情况。
由于对文件或共用元区块进行的完整的垃圾收集操作提供一个或一个以上额外已擦除元区块所需的时间的大部分由将有效数据复制到一个或一个以上复制元区块中占据,所以正是此复制在图28中主要与数据编程交错。步骤325选择前台模式进行垃圾收集329,这参看图31的流程图进行描述。接着,将数据群组的某一预设数目的元页从正进行垃圾收集的元区块连续复制到先前已擦除的复制元区块中。步骤327重设以此交错方式复制的元页的计数器,使得在步骤329中,在操作从垃圾收集步骤中离开并返回到数据编程循环中之前复制预设数目的元页。接着,在每一垃圾收集操作329之后,通过步骤331重设步骤321所参考的写入元区块元页编程计数器。这促使在前台发生另一垃圾收集操作之前将N3个数据元页写入到存储器中,借此使由于垃圾收集引起的数据编程的任何延迟散开。
图29的时间线说明了此垃圾-编程算法的交错性质。在垃圾收集操作之间将来自主机的N3个数据元页连续写入到存储器中。将每一垃圾收集操作限制为复制N4个数据元 页,其后发生对另外N3个数据元页的编程。当处于垃圾收集阶段时,可促使主机等待存储器系统完成垃圾收集然后将额外的数据元页传递到存储器系统控制器缓冲器。
图30的流程图展示图26的删除文件例行程序263的执行。其主要目的是,识别具有正被删除的文件的过时数据的过时区块和共用区块,且接着将那些区块放置于适当的垃圾收集队列中。当存储器系统接收到“删除”或“擦除”命令(图12B)以及待删除的文件的名称或其它标识时,步骤335将数据群组数目计数器初始化为零。在步骤337中,读取文件目录和文件索引表(FIT)以获得存储在存储器中的组成指定文件的数据群组的身份。接着,通过递增以逻辑顺序指向每一数据群组的数据群组数目计数器来一次一个地检查文件的每一数据群组。
对于数据群组的第一询问339是,其是否处于共用元区块中。如果是,那么步骤341将所述元区块添加到共用区块垃圾收集队列中的一者中。如果正通过“擦除”命令删除文件,那么将元区块放置于优先的共用元区块队列中,且如果正通过“删除”命令删除文件,那么将元区块放置于另一共用元区块队列中。调度具有待删除的文件的数据群组的任何共用元区块进行垃圾收集。如果通过步骤339确定数据群组不在共用元区块中,那么下一询问343确定数据群组是否通过处于过时元区块垃圾收集队列中而在已被调度进行垃圾收集的元区块内。如果元区块已被调度进行垃圾收集,那么不应将其再次添加到所述相同队列。但如果未如此调度,那么通过步骤345将其添加到过时元区块垃圾收集队列中的一者中。如果正通过“擦除”命令删除文件,那么将元区块放置于优先的过时元区块队列中,且如果正通过“删除”命令删除文件,那么将元区块放置于另一过时元区块队列中。
在已执行步骤341或345中的任一者或者步骤343的询问是肯定的之后,完成针对一个数据群组的过程。下一步骤347递增数据群组数目计数器。接着,作出询问349:文件中是否存在另一数据群组。如果是,那么处理返回步骤339并针对所述下一数据群组而重复。如果不是,那么知道含有待删除的文件的数据的所有元区块已输入到过时和共用元区块垃圾收集队列中。接着,在步骤351中更新FIT以使待删除的文件的数据群组记录过时。接着,通常在压缩FIT时消除FIT中的过时数据群组的记录。在最后步骤353中,更新文件目录201(图20)以从中移除被删除的文件。
图31的流程图说明图26的垃圾收集操作265和图28的垃圾收集操作329的特定实例。当主机发送“闲置”命令(图26的步骤264)或主机已闲置持续一段时间时在后台开始此算法(图26的步骤265),或者当少于N2个已擦除元区块保持在已擦除元区块集 区中时在编程操作期间在前台开始此算法(图28的步骤329)。第一询问355是是否存在正在进行的尚未完成的垃圾收集操作。从对图31的此描述中将看到,处理会在某些情形下脱离垃圾收集,例如当主机发布另一命令时或当数据复制与其它操作交错时。因此,如果有未完成的垃圾收集操作待决,那么接下来是步骤357,因为待决的垃圾收集被给予优先权。但如果通过步骤355确定不存在待决的垃圾收集操作,那么下一步骤356查看各个垃圾收集队列以了解其中是否存在至少一个条目。如果是,那么下一步骤358根据上述优先权选择所述条目中的一者(如果存在一个以上)。过时元区块区块队列中次序上处于下一个的元区块的垃圾收集通常将相对于待进行垃圾收集的共用元区块队列上的元区块或文件队列上的文件而被给予优先权。这是因为可借助对过时元区块进行垃圾收集而更迅速地增加已擦除元区块集区的大小,因为无需复制任何数据。
下一组步骤360、362和366确定对于选定队列条目的垃圾收集的目标,因为所述过程对于文件、共用元区块和过时元区块是不同的。询问360询问正在进行垃圾收集的是否是文件。如果是,那么在步骤370和372中依次读取所述文件的FIT条目以设定特定计数器和计数。在步骤370中,将第一计数器设定为文件中数据群组的数目,且将第二计数器设定为文件的第一数据群组中的数据的元页的数目(长度)。如果其长度不是其条目的一部分,那么可根据FIT数据群组条目计算此长度。或者,每一数据群组的长度可作为其条目的一部分而包含在FIT中,如图20和22所示,从而不需要每当需要时均计算数据群组长度。在步骤372中,将第三计数器设定为存储在含有过时数据或来自其它文件的数据的存储器区块中的当前文件数据的元页的数目。这些是当前文件的需要移动的数据。此第三计数优选地忽略文件内所有过时和无效的数据群组。最后,计数由如果文件的有效数据被压缩到并填充在整数个元区块中则会产生的数据的残余元页的数目组成。也就是说,残余元页计数是在含有文件的数据的所有元区块均包含在垃圾收集中的情况下,将不得不占据共用或部分填充的元区块的小于元区块的文件的数据的量。设定这三个计数器并形成且存储残余元页计数之后,下一步骤359开始对文件的数据进行垃圾收集。
返回步骤360,如果步骤358选择的条目不是文件,那么下一询问362确定其是否为待进行垃圾收集的共用元区块。如果是,那么实行图32的共用元区块垃圾收集364。如果不是,那么询问366确定选定的条目是否针对过时元区块,例如通过图30的步骤345添加到过时元区块队列的一个过时元区块。如果是,那么在步骤368中擦除选定的元区块。在共用元区块垃圾收集364、元区块擦除368之后,或者如果询问366产生否 定响应,那么处理返回图26的步骤253。如果垃圾收集操作仍未完成,那么其将在下一次开始垃圾收集算法时再继续。
返回步骤355,如果存在待决的垃圾收集,那么将进一步对其进行处理。图31的步骤357确定待决的操作是否针对文件,如同针对从垃圾收集队列中选择的新项目的步骤360。如果不是针对文件,那么执行上述针对新项目的步骤362、364、366和368的过程,且垃圾收集接着通过返回图26的步骤253而结束。
如果通过图31的步骤357确定再继续的垃圾收集是针对文件的,那么接下来作出询问359。之后的处理对于再继续垃圾收集(通过步骤357)的文件或对于通过步骤370和372设定其计数器和残余元页计数的从队列中选择(通过步骤360)的新文件大体上相同。当文件的垃圾收集正在进行并通过步骤357再继续时,数据群组数目和文件元页数目计数器以及残余元页计数被设定为文件的垃圾收集首次开始时的状态。数据群组数目和元页计数器可能已递减为与最初通过对当前文件的早期部分垃圾收集而计算出的值不同的值。当暂停文件的垃圾收集时存储全部四个值,且接着在对相同文件的再继续处理期间访问所述四个值。
共用步骤359询问当前数据群组内是否存在仍待复制的一个或一个以上元页。这通过参考数据群组长度计数器来确定。通过后续步骤一次检查并复制有效数据群组的一个元页。如果步骤359确定数据保持在待决的数据群组中,那么下一询问361确定复制元区块是否打开。如果是,那么通过步骤363从存储有正进行垃圾收集的文件的当前数据群组的数据元页的元区块中读取所述数据元页,并在步骤365中将其写入到复制元区块中。接着在步骤367中使数据群组长度计数器递减一个元页,且在步骤369中使文件元页计数器递减1。
如果通过步骤361确定复制元区块未打开,那么下一步骤371确定正进行垃圾收集的文件是否为打开的文件。如果是,那么下一步骤373打开复制元区块,且过程接着前进到先前描述的步骤363。但如果不是打开的文件,那么下一步骤375询问文件元页计数器的递减的计数是否等于残余元页计数。如果不是,那么通过步骤373打开复制元区块。但如果它们相等,那么意味着当前文件中不存在剩余的待复制的数据的元区块。因此,在步骤377中,识别打开的共用元区块以将残余数据复制到其中。步骤363以及以后的步骤的处理接着将当前文件的当前数据群组的剩余元页复制到共用元区块中。当步骤371确定正进行垃圾收集的是打开的文件时不采取此路径,因为可将会填满另一元区块的其它数据群组写入到当前文件。关闭打开的文件之后,将其放置于垃圾收集的队列 中,此时通过步骤377将任何残余数据复制到共用元区块中。
图31的询问379确定在写入此额外的数据元页之后复制元区块现在是否已满。如果是,那么在步骤381中关闭复制元区块,且通过步骤383更新FIT以反映所述事实。如果复制元区块未满,或在步骤383之后,询问385确定正进行垃圾收集的元区块中的所有数据是否现已被致使过时。如果是,那么在步骤387中擦除元区块。如果不是,或在元区块擦除之后,询问389询问是否在编程操作期间通过图28的步骤325设定了前台模式。如果不是,那么图31的步骤391确定主机命令是否待决。如果是,且如果步骤392确定正在进行的垃圾收集不是优先的,那么通过在步骤393中更新FIT并接着返回图26的步骤253而暂停垃圾收集。然而,如果步骤391确定主机命令并非待决,或如果存在待决的主机命令且步骤392确定正在进行的垃圾收集不是优先的,那么处理返回询问359以将下一数据元页从当前文件元区块复制到复制元区块中。
如果图31的询问389确定已设定前台模式,那么下一步骤395递增通过图28的步骤327重设的复制元区块元页计数器。如果步骤397确定已连续复制预设数目N4个元页,那么下一步骤399重设前台模式,且通过步骤393更新FIT。但如果在达到数目N4之前存在更多待复制的元页,那么除非询问391确定存在待决的主机命令,否则过程继续进行步骤359。如果存在待决的主机命令,那么中断复制操作,且过程返回图26的步骤253。
返回询问359,如果数据群组长度计数为零,那么意味着从文件元区块向复制元区块进行的一个数据群组的复制已完成。在此情形下,步骤401更新FIT以反映此情况。接着,在步骤403中通过参考数据群组数目计数器确定正进行垃圾收集的当前文件是否包含另一数据群组。如果不是,那么文件的垃圾收集已完成。过程接着返回步骤356以对来自队列的按照次序的下一文件或元区块进行垃圾收集。其不会返回步骤355,因为完成当前文件的垃圾收集意味着不可能再存在正在进行且可再继续的文件的垃圾收集。
如果从步骤403中知道当前文件中至少还有一个数据群组待复制,那么在步骤405中确定含有此下一数据群组的元区块是否还包含其它过时的数据。如先前所述,对含有文件的过时数据的元区块进行垃圾收集,但优选不对那些不含有文件的过时数据的元区块进行垃圾收集,除非所述元区块是共用元区块或含有文件的残余数据的不完整的元区块。因此,如果通过步骤405确定下一数据群组的元区块中存在过时数据,那么通过步骤407将数据群组数目计数器更新按照次序处于下一个的数据群组的数目,且在步骤409中用新数据群组中的数据的量初始化数据群组长度计数器。处理接着前进到步骤361以将第一元页的数据以先前描述的方式从文件的新数据群组复制到复制元区块中的下一已 擦除元页。
但即使通过步骤405确定存在下一数据群组的元区块中不存在过时数据,如果(1)下一数据群组处于共用元区块中或(2)处于不完整的元区块中且文件是关闭的文件,那么仍可发生对所述元区块中数据的垃圾收集。首先作出询问411:当前数据群组是否处于共用元区块中。如果是,那么下一步骤413将共用元区块添加到共用元区块垃圾收集队列以进行随后的垃圾收集,但处理继续进行步骤407和409以将数据群组数目计数器和数据群组长度计数器更新为下一元区块的计数器以通过步骤361等等步骤进行复制。然而,如果当前数据群组不处于共用元区块中,那么步骤415询问当前数据群组是否处于不完整的元区块中。也就是说,步骤415确定当前数据群组是否存在于仍具有至少最少量的已擦除容量的元区块中(例如,图15的数据群组F3,D3)。如果不是,那么不复制当前数据群组,而是处理返回步骤403以处理文件的下一数据群组(如果存在一个的话)。但如果当前数据群组处于不完整的元区块中,那么下一询问417询问不完整的元区块是否含有打开的文件的数据。如果是,那么同样通过返回询问403以继续处理文件的任何另外的数据群组而跳过对当前数据群组的复制。但如果存在下一数据群组的元区块不含有打开的文件的数据,那么对所述下一数据群组实行步骤407、409、361等等步骤。
返回图31的步骤356,即使确定垃圾收集队列中不存在文件或元区块,也可发生垃圾收集。如果不存在,那么不是结束过程,而是步骤421检查已擦除元区块集区中是否存在N2个以上的已擦除元区块。如果是,那么垃圾收集过程结束并返回图26的步骤253。但如果系统中不存在N2个以上的已擦除元区块,那么借此机会从步骤421执行垃圾收集。此垃圾收集可对打开的文件(如果存在一个的话)进行,如步骤423所指示。由于队列为空,所以当集区中已擦除元区块的数目为N2或更少时很可能不存在更多已擦除元区块的其它潜在来源。如果存在一个以上打开的文件,那么在步骤425中选择其中之一。处理接着针对打开的文件前进通过步骤370、372和359,如先前所述。
当通过图31的询问362确定正对共用元区块中的数据群组实行当前垃圾收集操作时,垃圾收集364稍许不同于上文针对其它元区块描述的垃圾收集。图32的流程图概述对共用元区块的垃圾收集。步骤431询问垃圾收集是否正在进行且因此再继续。如果是,那么数据群组长度计数器保留当垃圾收集暂停时的最后的值。如果不是,那么首先在步骤435中通过参考作为处理的主体的第一数据群组的FIT而初始化数据群组数目计数器,且接着通过步骤433确定此数据群组的长度。
当通过步骤433确定数据群组长度计数器大于零时,开始复制当前数据群组。通过 步骤437,从共用元区块读取当前数据群组的元页,且通过步骤439,将所述元页编程到打开的共用元区块中。在步骤441中,接着使数据群组长度计数器递减一个元页。如果如步骤443所指示,在前台进行垃圾收集,那么步骤445促使复制元区块元页计数器递增1。此计数器跟踪当前序列中已复制的数据的元页的数目。如果通过步骤447确定此计数超过预定数目N4,那么过程在步骤449中退出前台模式。之后在步骤451中更新FIT,且处理接着返回图26的步骤253。
如果通过图32的步骤447确定复制元区块元页计数器的值为N4或更小,那么下一步骤询问主机命令是否待决。如果是,那么在步骤451中更新FIT且处理返回图26的步骤253以便可执行待决的主机命令。如果不是,那么处理返回图32的步骤433以询问当前数据群组中是否存在另一数据元页,且如果是,那么将其从过时共用元区块复制到打开的共用元区块,等等。类似地,如果在步骤443中确定垃圾收集不在前台执行,那么接下来执行步骤453。除非步骤453确定主机命令待决,否则处理接着返回步骤433以可能复制当前数据群组中的下一数据元页,而不管复制元区块元页计数器是否超过N4,因为绕过了步骤447。此情况下,在后台执行垃圾收集。
返回图32的步骤433,如果数据群组长度计数不大于零,那么知道已复制当前数据群组的所有元页。接着在步骤455中更新FIT,且通过步骤457确定正进行垃圾收集的共用元区块中是否存在另一数据群组。如果不是,那么在步骤459中擦除过时共用元区块,且处理返回图26的步骤253。但如果共用元区块中存在另一数据群组,那么通过步骤461更新数据群组数目计数器。接着在步骤463中读取来自共用元区块索引的FIT指针,且在步骤465中读取由所述指针界定的FIT条目。如果步骤467确定FIT条目与当前数据群组匹配,那么询问468确定当前数据群组是否为已识别的残余数据的一部分。如果是,那么步骤469促使将数据群组长度计数器初始化为从FIT读取的数据群组的长度。
但如果在步骤468中确定当前数据群组不处于现有残余数据中,那么在步骤470中识别其所属的新的残余数据。在步骤471中,接着识别具有足够空间以存储新的残余数据的所有数据的打开的共用区块。这防止当残余数据含有两个或两个以上数据群组时文件的残余数据分裂在两个或两个以上不同的元区块之间。这原本会在独立地复制两个或两个以上数据群组的情况下发生。在所述情况下,第一数据群组可复制到具有足够的已擦除空间以存储所述数据群组但没有足够空间还存储第二数据群组的共用区块。接着第二数据群组将复制到不同的共用区块。这将不合需要,因为文件的残余数据不应分裂在 两个不同的元区块之间。如果其如此分裂,那么对文件或对共用区块的垃圾收集会花费更多时间。
接着通过步骤469初始化当前数据群组的数据群组长度计数器。通过步骤437和439将当前数据群组的第一数据元页从共用元区块复制到经识别的打开的共用元区块中。然而,如果通过步骤467确定FIT条目不与当前数据群组匹配,那么处理返回步骤457以确定共用元区块中是否存在另一数据群组。
图32的流程图中所示的垃圾收集继续进行,直到当前共用元区块的所有有效数据群组已复制到先前擦除的元区块(其因而变成新的共用元区块)或者复制到一个或一个以上打开的共用元区块为止。可将不同文件的数据群组复制到不同的打开的共用元区块。共用元区块之前因其含有过时数据群组而被放置于垃圾收集队列中。共用元区块中每一有效数据群组的所有数据元页的完全传递对于每一此类元页需要通过图32的步骤一遍。如果垃圾收集在前台进行,或者当在前台或后台操作时接收到新的主机命令时,此复制可能每N4个元页被中断。
作为对永久地预设数目N3和N4的替代,存储器系统控制器可响应于主机的数据编程模式而改变所述数目,以便维持均匀的数据编程速度。
存储器区块在操作期间的各种状态
图33的图表展示在上述类型的直接文件存储存储器系统内,系统的存储器区块或元区块的各种各个状态,以及那些状态之间的转换。
在左侧列中,区块501展示为在已擦除区块集区内处于已擦除状态。
在下一列中,区块503、505和507各含有一些有效数据但还具有可在其中写入来自主机的数据的已擦除容量。用单个文件的有效数据对“写入区块”503进行部分写入,且文件的另外的数据当由主机供应时应写入到此区块中。用单个文件的有效数据对“复制区块”505进行部分写入,且文件的另外的数据当在文件的垃圾收集期间复制时应写入到所述区块中。用两个或两个以上文件的有效数据对“打开的共用区块”507进行部分写入,且任何文件的残余数据群组可在垃圾收集期间写入到所述区块中。
下一列的区块509和511充满文件数据。“文件区块”509用单个文件的有效数据填充。“共用区块”511用两个或两个以上文件的有效数据填充。
图33的右侧列的旁边包含各含有一些过时数据的区块513、515、517、519和521。“过时文件区块”513用单个文件的有效数据与过时数据的任何组合填充。用单个文件的有效数据与过时数据的任何组合对“过时写入区块”515进行部分写入,且文件的另外的数据当由主机供应时应写入到所述区块中。用单个文件的有效数据与过时数据的任何组合对“过时复制区块”517进行部分写入。用两个或两个以上文件的有效数据与过时数据的任何组合对“过时的打开的共用区块”519进行部分写入。“过时共用区块”521用两个或两个以上文件的有效数据与过时数据的任何组合填充。
图33的右侧列中的过时区块523仅含有过时数据。
图33中说明的各个区块在区块状态之间的转换还通过标有小写字母的线来展示。这些转换如下:
a-“已擦除区块”501到“写入区块”503:将单个主机文件的数据写入到已擦除区块。
b-“写入区块”503到“写入区块”503:将来自主机的单个文件的数据写入到用于所述文件的写入区块。
c-“写入区块”503到“文件区块”509:写入来自主机的单个文件的数据以填充用于所述文件的写入区块。
d-“文件区块”509到“过时文件区块”513:文件区块中的数据的一部分由于主机将数据的经更新版本写入在用于所述文件的写入区块中而变得过时。
e-“过时文件区块”513到“过时区块”523:过时文件区块中的所有有效数据由于数据在垃圾收集期间被复制到另一区块或由于主机删除文件而变得过时。
f-“写入区块”503到“过时写入区块”515:写入区块中的数据的一部分由于主机将数据的经更新版本写入在所述相同写入区块中或由于数据在垃圾收集期间被复制到另一区块而变得过时。
g-“过时写入区块”515到“过时写入区块”515:将来自主机的单个文件的数据写入到用于所述文件的过时写入区块。
h-“过时写入区块”515到“过时文件区块”513:写入来自主机的单个文件的数据以填充用于所述文件的过时写入区块。
i-“过时写入区块”515到“过时区块”523:过时写入区块中的所有有效数据由于数据在垃圾收集期间被复制到另一区块或由于主机删除文件而变得过时。
j-“已擦除区块”501到“复制区块”505:在垃圾收集期间将单个文件的数据从另一区块复制到已擦除区块。
k-“写入区块”503到“复制区块”505:在垃圾收集期间将单个文件的数据从另一区块复制到用于所述文件的写入区块。
l-“复制区块”505到“复制区块”505:在垃圾收集期间将单个文件的数据从另一区块复制到用于所述文件的复制区块。
m-“复制区块”505到“文件区块”509:在垃圾收集期间从另一区块复制单个文件的数据以填充用于所述文件的复制区块。
n-“复制区块”505到“写入区块”503:当垃圾收集期间重新打开文件时将来自主机的单个文件的数据写入到用于所述文件的复制区块。
o-“复制区块”505到“过时复制区块”517:复制区块中的数据的一部分或全部由于主机将数据的经更新版本写入在用于所述文件的写入区块中或由于主机删除文件而变得过时。
p-“过时复制区块”517到“过时区块”523:过时复制区块中的所有有效数据由于数据在垃圾收集期间被复制到另一区块或由于主机删除文件而变得过时。
q-“写入区块”503到“打开的共用区块”507:在垃圾收集期间将文件的残余数据写入到用于不同的已关闭文件的写入区块。
r-“复制区块”505到“打开的共用区块”507:在垃圾收集期间将文件的残余数据写入到含有不同文件的残余数据的复制区块。
s-“打开的共用区块”507到“打开的共用区块”507:在垃圾收集期间将文件的残余数据从不同的区块复制到打开的共用区块。
t-“打开的共用区块”507到“过时的打开的共用区块”519:打开的共用区块中一个文件的数据的一部分或全部由于主机将数据的经更新版本写入在用于所述文件的写入区块中、由于数据在垃圾收集期间被复制到另一区块或由于主机删除文件而变得过时。
u-“过时的打开的共用区块”519到“过时区块”523:过时的打开的共用区块中的所有有效数据由于数据在垃圾收集期间被复制到另一区块或由于主机删除文件而变得过时。
v-“打开的共用区块”507到“共用区块”511:在垃圾收集期间从另一区块复制文件的残余数据群组以填充用于所述文件的打开的共用区块。
w-“共用区块”511到“过时共用区块”521:共用区块中一个文件的数据的一部分或全部由于主机将数据的经更新版本写入在用于所述文件的写入区块中、由于数据在垃圾收集期间被复制到另一区块或由于主机删除文件而变得过时。
x-“过时共用区块”521到“过时区块”523:过时共用区块中的所有有效数据由于数据在垃圾收集期间被复制到另一区块或由于主机删除文件而变得过时。
y-“写入区块”503到“过时区块”523:写入区块中单个文件的所有有效数据由于主机删除文件而变得过时。
z-“复制区块”505到“过时区块”523:复制区块中的所有有效数据由于数据在垃圾收集期间被复制到另一区块或由于主机删除文件而变得过时。
aa-“文件区块”509到“过时区块”523:文件区块中的所有数据由于主机删除文件而变得过时。
ab-“过时区块”523到“已擦除区块”501:在垃圾收集期间擦除过时区块。
结论
尽管已参照本发明的示范性实施例描述了本发明的各个方面,但将了解,本发明有权在所附权利要求书的完全范围内受到保护。