本专利申请要求授予JohnStrasser等人的提交于2011年1月27日的名称为“APPARATUS,SYSTEM,ANDMETHODFORDETERMININGAREADVOLTAGETHRESHOLD”(确定读取电压阈值的装置、系统和方法)的美国专利申请No.13/015,458和授予RoberrWood等人的提交于2011年7月1日的名称为“APPARATUS,SYSTEM,ANDMETHODFORUSINGMULTI-LEVELCELLSTORAGEINASINGLE-LEVELCELLMODE”(在单级单元模式中使用多级单元存储的装置、系统和方法)的美国专利申请No.13/175,637的优先权,该两篇专利以引用的方式并入本文。美国专利申请No.13/015,458要求授予JohnStrasser等人的提交于2010年1月27日的名称为“APPARATUS,SYSTEM,ANDMETHODFORDETERMININGAREADVOLTAGETHRESHOLDFORSOLID-STATESTORAGEMEDIA”(确定固态存储介质读取电压阈值的装置、系统和方法)的美国临时专利申请No.61/298,861和授予JohnStrasser等人的提交于2010年2月17日的名称为“APPARATUS,SYSTEM,ANDMETHODFORDETERMININGAREADVOLTAGETHRESHOLDFORSOLID-STATESTORAGEMEDIA”(确定固态存储介质读取电压阈值的装置、系统和方法)的美国临时专利申请No.61/305,205的优先权。
具体实施方式
为了更具体地强调实施独立性,将在本说明书中描述的多个功能单元称作模块。例如,模块可实现为硬件电路,其包括定制的VLSI电路或门阵列,成品的半导体,例如逻辑芯片、晶体管或其他离散元件。模块还可应用在可编程硬件设备中,例如现场可编程门阵列、可编程阵列逻辑、可编程逻辑器件等。
模块还可用在软件中以供各种类型的处理器执行。例如,可执行代码的标识模块包括计算机指令的一个或多个物理或逻辑块,该计算机指令可组织为对象、过程或功能。然而,标识模块的可执行文件不必物理上位于一起,但是可包括存储在不同位置的完全不同的指令,当在逻辑上连接在一起时,这些指令构成模块并实现模块的规定目标。
实际上,可执行代码模块可为单一指令或多个指令,且甚至可分布在若干不同代码段上,分布在不同程序中和多个存储设备上。相似地,在此,操作数据可在模块内标识和说明,且可被具体化为任何合适的形式,并被组织在任何适当类型的数据结构中。操作数据可收集为单个数据集,或分布在不同位置上(包括在不同的存储设备上),且操作数据可全部,或至少部分的,仅作为系统或网络上的电信号存在。当模块或模块的部分在软件中实现的情况下,该软件部分存储在一个或多个计算机可读的介质上。
在整个本说明书中所提到的“一个实施例”、“一实施例”或类似语句意为结合该实施例所述的具体特征、结构或特性包括在本发明的至少一个实施例中。因而在整个本说明书中,短语“在一个实施例中”、“在一实施例中”和类似语句的出现可(但不一定)全部指同一实施例。
计算机可读介质的引用,可采用能将机器可读指令存储在数字处理装置的存储设备上的任何形式。计算机可读介质可具体呈现为CD光盘、DVD光盘、磁带、贝努里驱动器、磁盘、穿孔卡、闪存、集成电路或其他数字处理装置存储设备。
此外,本发明所述的特征、结构或特性可在一个或多个实施例中以任何合适的方式结合。在以下的说明中,提供了许多具体细节,例如编程例子、软件模块、用户选择、网络事务处理、数据库查询、数据库结构、硬件模块、硬件电路、硬件芯片等以便于彻底理解本发明的实施例。然而,相关领域的技术人员应该认识到本发明可在没有一个或多个具体细节,或在用其他方法、元件、材料等的情况下实施。在其他情况下,众所周知的结构、材料或操作没有被详细地展示或描述,以避免使本发明各方面含混不清。
包括在本文中的示意性流程图通常阐述为为逻辑流程图。同样地,描述的顺序和标识的步骤表示所提供方法的一个实施例。可设想与所述方法的一个或多个步骤或其部分在功能、逻辑或作用上等同的其他步骤和方法。另外,所用的格式和符号是用来解释方法的逻辑步骤,不应理解为对方法范围的限制。虽然在流程图中可使用各种箭头类型和线条类型,但是它们不应理解为是对该相应方法范围的限制。实际上,可使用一些箭头或其他连接头来表示方法的逻辑流程。例如,箭头可用来表示在所述方法所列举的步骤之间,未指定持续时间的等待或监控周期。另外,具体方法所进行的顺序可以严格遵循也可以不严格遵循所示的相应步骤的顺序。
固态存储系统
图1所示为根据本发明提出的为提高固态存储介质110的实用性的系统100的一个实施例的示意性框图。该系统100包括了如下所述的固态存储设备102、固态存储控制器104、写入数据流水线106、读取数据流水线108、固态存储介质110、计算机112、客户端114和计算机网络116。
该系统100包括至少一个固态存储设备102。在其他实施例中,该系统100包括两个或更多个固态存储设备102。每个固态存储设备102可包括非易失性固态存储介质110,例如闪存、纳米随机存取存储器(“纳米RAM或NRAM”)、磁阻RAM(“MRAM”)、动态RAM(“DRAM”)、相变RAM(“PRAM”)、赛道存储器、忆阻器存储器、基于纳米晶体导线的存储器、基于氧化硅的低于10纳米尺度的过程存储器、石墨烯存储器、硅氧化氮氧化硅(“SONOS”)存储器、电阻式随机存取存储器(“RRAM”)、可编程金属化单元(“PMC”)、导电桥接RAM(“CBRAM”)等。图2、3A和3B,对固态存储设备102进行了更详细描述。
固态存储设备102示出在计算机112中,该计算机114通过计算机网络116连接了一个或多个客户端。在一个实施例中,固态存储设备102位于计算机112的内部,并通过系统通信总线(诸如快捷外围组件互连(“PCI-e”)总线、串行高级技术附件(“串行ATA”)总线等)连接。在另一个实施例中,固态存储设备102位于计算机112的外部并用外部通信总线(诸如通用串行总线(“USB”)、电气与电子工程师协会(“IEEE”)1394总线(“火线”)等)连接。在其他实施例中,固态存储设备102通过使用通信总线(诸如外围组件互连(“PCI”)快捷总线)、外部电气或光学总线扩展或总线网络解决方案(诸如Infiniband或PCIExpressAdvancedSwitching(“PCIe-AS”)等)连接到计算机112。
在各种实施例中,固态存储设备102可以是双列直插式存储模块(“DIMM”)、子卡或微模块的形式。在另一个实施例中,固态存储设备102为机架固定式刀片中的元件。在另一个实施例中,固态存储设备102包含在组件中,该组件直接集成到更高级别部件(例如,母板、笔记本电脑、图形处理器)上。在另一个实施例中,包含固态存储设备102的独立组件在没有中间组件的情况下直接集成到更高级别部件上。
固态存储设备102包括一个或多个固态存储控制器104,每个固态存储控制器可包括写入数据通道106和读取数据通道108,且每个固态存储控制器包括固态存储介质110,下文相对于图2、3A和3B对其进行了更详细描述。通常,该一个或多个固态存储控制器104管理固态存储介质110,包括确定固态存储介质110的存储单元的配置参数,以及根据该配置参数配置存储单元。
如本文所用,用于一组存储单元的配置参数为可通过接口修改的参数。该接口可包括众所周知的接口或专有接口并可包括使用特定命令指令和/或使用特定参数、寄存器设置、驱动器设置、控制器设置、一组特定命令指令顺序或其他不同于通常命令(通用命令)的命令或用来与该组存储单元相接合或管理该组存储单元的设置。配置参数可涉及写入或编程存储单元、从存储单元读取、擦除存储单元、管理存储单元、设备驱动器或存储单元的存储控制器设置等。一组存储单元的配置参数可与固态存储设备102的设备驱动器和固态存储控制器104等有关,且可涉及设备驱动器和/或固态存储控制器104如何使用、控制和与该组存储单元和/或固态存储介质110交互。
在某些实施例中,配置参数可包括一个或多个阈值,例如读取电压阈值、电阻率阈值、编程阈值、擦除阈值、硬件驱动器电平阈值、存储控制器电平阈值等。在固态存储介质110初始化期间可动态地随着发给固态存储介质110的每个命令设定配置参数一次,或者在固态存储介质110的运行期间响应于触发(诸如事件或时间间隔)设定配置参数一次。在一个实施例中,固态存储控制器104主动地为固态存储介质110的存储单元设置一个或多个配置参数以提高固态存储介质110的实用性和减少错误等。
系统100包括连接到固态存储设备102的一个或多个计算机112。计算机112可以是主机、服务器、存储区域网(“SAN”)的存储控制器、工作站、个人计算机、膝上型计算机、手持式计算机、巨型计算机、计算机集群、网路交换器、路由器或设备、数据库或存储设备、数据采集或数据捕获系统、诊断系统、测试系统、机器人、便携式电子设备、无线设备等。在另一个实施例中,计算机112可以是客户端,且固态存储设备102自主运行以服务于计算机112发出的数据请求。在该实施例中,计算机112和固态存储设备102可通过计算机网络、系统总线或其他适于在计算机112和自主固态存储设备102间连接的通信方法连接。
在一个实施例中,系统100包括通过一个或多个计算机网络116连接到一个或多个计算机112的一个或多个客户端114。客户端114可以是主机、服务器、SAN的存储控制器、工作站、个人计算机、膝上型计算机、手持式计算机、巨型计算机、计算机集群、网路交换器、路由器或设备、数据库或存储设备、数据采集或数据捕获系统、诊断系统、测试系统、机器人、便携式电子设备、无线设备等。计算机网络116可包括因特网、广域网(“WAN”)、城域网(“MAN”)、局域网(“LAN”)、令牌环、无线网络、光纤通道网络、SAN、网络连接存储(“NAS”)、ESCON等或任何网络的组合。计算机网络116还可包括来自IEEE802族的网络技术,例如以太网、令牌环、WiFi、WiMax等。
计算机网络116可包括服务器、交换器、路由器、布线、无线电设备和其他便于网络连接计算机112和客户端114的设备。在一个实施例中,系统100包括在计算机网络116上作为节点通信的多台计算机112。在另一个实施例中,系统100包括在计算机网络116上作为节点通信的多个固态存储设备102。本领域的技术人员应该认识到其他计算机网络116包含了一个或多个计算机网络116以及在一个或多个客户端114间具有单个或冗余连接的相关设备、或具有一个或多个固态存储设备102的其他计算机、或连接到一个或多个计算机112的一个或多个固态存储设备102。在一个实施例中,系统100包括通过计算机网络116连接到客户端114的两个或更多个固态存储设备102但不包括计算机112。在某些实施例中,固态存储控制器104从计算机112的处理器和/或从客户端114经上述的一个或多个通信总线接收存储在固态存储介质110中的源数据。
固态存储设备
图2为根据本发明提出的在固态存储设备102中包含了写入数据通道106和读取数据通道108的固态存储设备控制器202的一个实施例200的示意性框图。固态存储设备控制器202可具体呈现为硬件、软件或硬件和软件的组合。固态存储设备控制器202可包括多个固态存储控制器0-N104a-n,每个固态存储控制器控制固态存储介质110。在所示的实施例中,示出了两个固态控制器:固态控制器0104a和固态存储控制器N104n,且每个均控制固态存储介质110a-n。在所示的实施例中,固态存储控制器0104n控制数据通道使得相连的固态存储介质110a存储数据。固态存储控制器N104n控制与所存储数据相关的索引元数据通道,并且相关的固态存储介质110n存储索引元数据。在替代实施例中,固态存储设备控制器202包含具有单个固态存储介质110a的单个固态控制器104a。在另一个实施例中,有多个固态存储控制器104a-n和相关的固态存储介质110a-n。在一个实施例中,连接到相关固态存储介质110a-110n-1的一个或多个固态控制器104a-104n-1控制数据,而连接到相关固态存储介质110n的至少一个固态存储控制器104n控制索引元数据。
在一个实施例中,至少一个固态控制器104包含现场可编程门阵列(“FPGA”)且控制器功能被编程到FPGA中。在一个具体实施例中,FPGA为FPGA。在另一个实施例中,固态存储控制器104包含特别设计为固态存储控制器104的元件,例如专用集成电路(“ASIC”)或定制逻辑解决方案。每个固态存储控制器104通常包括写入数据流水线106和读取数据流水线108,图3A进行了进一步描述。在另一个实施例中,至少一个固态存储控制器104由FPGA、ASIC和定制的逻辑组件的组合构成。在某些实施例中,至少有部分固态存储控制器104与在计算机112上执行的设备驱动器的一部分集成,和/或与该设备驱动器通信等。
固态存储
固态存储介质110是设置在内存库214中的非易失性固态存储元件216、218、220的阵列。通过双向存储输入/输出(“I/O”)总线210并行访问。在一个实施例中,该存储I/O总线210能在任何时候单向通信。例如,当正将数据写入固态存储介质110时,就不能从固态存储介质110读取数据。在另一个实施例中,数据可同时流向两个方向。然而,在此所用的关于数据总线的双向是指能使数据一次仅在一个方向上流动的数据通道,但是当数据在双向数据总线上的一个方向上的流动停止时,数据可在双向数据总线上的相反方向上流动。
通常将固态存储元件(例如SSS0.0216a)构造为芯片(一个或多个管芯的封装)或电路板上的管芯。如图所示,固态存储元件(例如216a)独立于或半独立于其他固态存储元件(例如218a)运行,即使这些元件一起封装在芯片封装、芯片封装叠堆或一些其他封装元件中。如图所示,将一行固态存储元件216a、216b、216m指定为内存库214。如图所示,在固态存储介质110中的n×m个固态存储元件216、218、220阵列中,可有“n”个内存库214a-n且每个内存库有“m”个固态存储元件216a-m、218a-m、220a-m。当然,不同的实施例可包括不同的n和m的值。在一个实施例中,固态存储介质110a包括八个内存库214,每个内存库214中有二十个固态存储元件216、218、220。在一个实施例中,固态存储介质110a包括八个内存库214,每个内存库214中有二十四个固态存储元件216、218、220。除了n×m个存储元件216、218、220之外,一个或多个附加列(P)也可与一行或多行其他固态存储元件216a、216b、216m并行进行寻址和操作。在一个实施例中,添加的P个列存储部分ECC数据块(即ECC码字)的奇偶校验数据,该部分ECC数据块跨越特定内存库的m个存储元件。在一个实施例中,每个固态存储元件216、218、220由单级单元(“SLC”)设备构成。在另一个实施例中,每个固态存储元件216、218、220由多级单元(“MLC”)设备构成。
在一个实施例中,共享公用存储I/O总线210a(例如216b、218b、220b)的固态存储元件被封装在一起。在一个实施例中,固态存储元件216、218、220的每个芯片可具有一个或多个管芯且一个或多个芯片垂直堆叠,并且每个管芯能够被独立访问。在另一个实施例中,固态存储元件(例如SSS0.0216a)的每个管芯可具有一个或多个虚拟管芯,每个芯片可具有一个或多个管芯且一个或多个芯片垂直堆叠,每个虚拟管芯可被独立访问。在另一个实施例中,固态存储元件SSS0.0216a的每个管芯可具有一个或多个虚拟管芯,每个芯片可具有一个或多个管芯,一个或多个管芯的部分或全部垂直堆叠,并且每个虚拟管芯可被独立访问。
在一个实施例中,两个管芯垂直堆叠,每组四个叠堆以形成八个存储元件(例如SSS0.0-SSS8.0)216a-220a,每个位于单独的内存库214a-n中。在另一个实施例中,24个存储元件(例如SSS0.0-SSS0.24)216形成逻辑内存库214a,使得八个逻辑内存库中的每一个具有24个存储元件(例如SSS0.0-SSS8.24)216、218、220。数据发送到固态存储介质110,经存储I/O总线210发送至一组特定存储元件(SSS0.0-SSS8.0)216a、218a、220a的所有存储元件。存储控制总线212a用于选择特定内存库(例如内存库0214a),使得经连接到所有内存库214的存储I/O总线210接收到的数据正好写入所选的内存库214a中。
在某些实施例中,存储控制总线212和存储I/O总线210被固态控制器104一同用来传送寻址信息、存储元件命令信息和待存储的数据。本领域的技术人员应该认识到该地址、数据和命令信息可通过使用这些总线212、210中的一个或另一个传送,或每类控制信息使用单独总线传送。在一个实施例中,寻址信息、存储元件命令信息和存储数据在存储I/O总线210上传送。存储控制总线212传输信号以激活内存库并确定在存储I/O总线210线路上的数据是否构成寻址信息、存储元件命令信息或存储数据。
例如,在存储控制总线212上的控制信号(例如“命令使能”)可表示在存储I/O总线210线路上的数据为存储元件命令,例如编程、擦除、重置、读取等。在存储控制总线212上的控制信号(例如“地址使能”)可表明在存储I/O总线210线路上的数据为寻址信息,例如擦除块标识符、页标识符以及可选的在特定存储元件中的页内偏移量。最后,在存储控制总线212上没有“命令使能”和“地址使能”这两个控制信号,则可表示在存储I/O总线210线路上的数据为存储数据,该存储数据将被存储在先前定址的擦除块、物理页的存储元件上,并可选择特定存储元件的页内偏移量。
在一个实施例中,存储I/O总线210包含一个或多个独立的I/O总线(“IIOBa-m”包含210a.a-m,210n.a-m),每列中的固态存储元件共享其中一个独立的I/O总线,并行访问每个固态存储元件216、218、220,这样使得全部的内存库214被同时访问。例如,存储I/O总线210的一个通道可同时访问每个内存库214a-n的第一个固态存储元件216a、218a、220a。存储I/O总线210的第二个通道可同时访问每个内存库214a-n的第二个固态存储元件216b、218b、220b。固态存储元件216a、216b、216m的每行被同时访问。在固态存储元件216、218、220为多级(物理上堆叠)的一个实施例中,固态存储元件216、218、220的所有物理级被同时访问。如本文所用的“同时”还包括近乎同时访问,以略微不同的间隔访问设备以避免开关噪声。“同时”应用在此上下文中以区别于命令和/或数据一个接一个地单独传送的顺序存取或串行存取。
通常,使用存储控制总线212独立地选择内存库214a-n。在一个实施例中,使用芯片使能或芯片选择来选择内存库214。在芯片选择和芯片使能均可用的情况下,存储控制总线212可选择多级固态存储元件216、218、220中的一级。在其他实施例中,存储控制总线212使用其他命令以单独选择多级固态存储元件216、218、220中的一级。还可通过在存储I/O总线210和存储控制总线212上传输的控制信息和地址信息的组合来选择固态存储元件216、218、220。
在一个实施例中,每个固态存储元件216、218、220被分为擦除块且每个擦除块被分为页。在固态存储元件216、218、220上的擦除块可称为物理擦除块或“PEB”。典型的页为2000字节(“2kB”)。在一个实施例中,固态存储元件(例如SSS0.0)包括两个寄存器,可将两个页编程,使得两寄存器固态存储元件216、218、220具有4kB的容量。于是20个固态存储元件216a、216b、216m的内存库214将具有80kB的页容量,这些页以离开存储I/O总线210的通道的相同地址访问。
该组容量为80kB的固态存储元件216a、216b、216m内存库214中的页,可称为逻辑页或虚拟页。类似地,可将内存库214a的每个存储元件216a-m的擦除块分组以形成逻辑擦除块或虚拟擦除块。在一个实施例中,当固态存储元件216、218、220接收到擦除命令时,擦除在固态存储元件216、218、220内的页的擦除块。尽管在固态存储元件216、218、220内的擦除块、页、平面或其他逻辑和物理分区的大小和数量预计会随技术的进步逐渐变化,但预计符合新配置的多个实施例有可能存在且符合本文的总体描述。
通常,当数据包被写入固态存储元件216、218、220内的特定位置时(其中该数据包旨在被写入特定页内的某一位置并且该页是特定内存库的特定存储元件的特定物理擦除块所特有的),在存储I/O总线210上会先发送物理地址,然后发送该数据包。该物理地址包含固态存储元件216、218、220的足够信息以将数据包导向至页内的指定位置。因为存储I/O总线210a.a中的适当的总线同时访问存储元件(例如SSS0.0-SSSN.0216a、218a、220a)列中的所有存储元件以到达恰当页并避免将数据包写入存储元件(SSS0.0-SSSN.0216a、218a、220a)列中的相似地址的页,所以存储控制总线212同时选择包括具有数据包将被写入的恰当页的固态存储元件SSS0.0216a的内存库214a。
相似地,满足存储I/O总线210上的读取命令需要存储控制总线212上的同步信号以选择单个内存库214a和内存库214a内的恰当页。在一个实施例中,读取命令读取整个页,且因为在内存库214中有并列的多个固态存储元件216a、216b、216m,所以用读取命令读取整个逻辑页。然而,读取命令可分解为子命令,如将在下文中相对于内存库交错解释的。也可在写入操作中访问逻辑页。
可经存储I/O总线210发送出擦除块擦除命令以擦除擦除块,该总线携带特定擦除块地址以擦除特定擦除块。通常,可经存储I/O总线210的并行通路发送擦除块擦除命令以擦除逻辑擦除块,每个通路携带特定擦除块地址以擦除特定擦除块。同时,经存储控制总线212选择特定内存库(例如内存库0214a)以防止擦除在所有内存库(内存库1-N214b-n)中的相似地址的擦除块。或者,存储控制总线212不选择特定的内存库(例如内存库0214a),以便同时擦除在所有内存库(内存库1-N214b-n)中的相似地址的擦除块。还可组合使用存储I/O总线210和存储控制总线212将其他命令发送到特定位置。本领域的技术人员应认识到有其他使用双向存储I/O总线210和存储控制总线212选择特定存储位置的方法。
在一个实施例中,数据包按顺序写入固态存储介质110中。例如,数据包流入存储元件216的内存库214a的存储写入缓冲区中,若缓冲区已满,则将数据包编程至指定的逻辑页。然后数据包再次充满存储写入缓冲区且当缓冲区已满时,将数据包写入到下一个逻辑页。下一个逻辑页可位于相同的内存库214a或另一个内存库(如214b)中。该过程以一个逻辑页接一个逻辑页地持续,通常直到充满逻辑擦除块(“LEB”)。在另一个实施例中,随着该过程一个逻辑擦除块接着一个逻辑擦除块地持续,数据流可以跨过逻辑擦除块的边界继续流动。
在读取、修改、写入操作中,与被请求数据有关的数据包在读取操作中定位和读取。已修改的请求数据的数据段不被写入其读取的位置。相反,修改后的数据段被再次转换成数据包并按顺序写入当前被写入的逻辑页中的下一个可用位置。修改各数据包的索引条目以指向包含修改的数据段的数据包。与没有被修改的相同的请求数据相关的数据包的一个或多个索引条目,包括指向未修改数据包原始位置的指针。从而,如果保持原始请求数据,例如保持该请求数据的先前版本,则该原始请求数据将在索引中包含指向所有原始写入数据包的指针。新的请求数据将具有在索引中指向一些原始数据包的指针和指向在当前正被写入的逻辑页中的修改后的数据包的指针。
在复制操作中,该索引包括映射到存储在固态存储介质110中的多个数据包的原始请求数据条目。当完成复制时,创建了新的请求数据副本,且在索引中创建了新的条目,将新的请求数据副本映射到原始数据包。新的请求数据副本被写入到固态存储介质110中,而其位置被映射到索引中的新条目中。新的请求数据包副本可用来识别位于被引用的原始请求数据中的数据包,以免原始请求数据尚未传送到,请求数据副本便已发生改变以及索引丢失或损坏。
有利地,按顺序写入数据包以便于更平均使用固态存储介质110,使得固态存储设备控制器202监控在固态存储介质110中的各种逻辑页的存储热点和层使用情况。按顺序写入数据包还有利于强大且高效的垃圾收集系统,其将在下文中详细描述。本领域的技术人员应认识到数据包的顺序存储的其他益处。
固态存储设备控制器
在多个实施例中,固态存储设备控制器202还包括数据总线204、局部总线206、缓冲区控制器208、缓冲区0-N222a-n、主控制器224、直接存储器存取(“DMA”)控制器226、存储器控制器228、动态存储器阵列230、静态随机存储器阵列232、管理控制器234、管理总线236、系统总线240的桥接器238和混杂逻辑242,它们将在下文中描述。在其他实施例中,系统总线240连接到一个或多个网络接口卡(“NICs”)244,一些网络接口卡可包括远程DMA(“RDMA”)控制器246、一个或多个中央处理器(“CPU”)248、一个或多个外部存储器控制器250和相关的外部存储器阵列252、一个或多个存储控制器254、节点控制器256和专用处理器258,它们将在下文中描述。连接到系统总线240的组件244-258可位于计算机112或其他设备中。
通常固态存储控制器104通过存储I/O总线210将数据传送到固态存储介质110。在典型实施例中,固态存储器设置在内存库214中,每个内存库214包括并行访问的多个存储元件216a、216b、216m,该存储I/O总线210为总线阵列,每条总线对应跨越内存库214的每列存储元件216、218、220。如本文所用,术语“存储I/O总线”可指一条存储I/O总线210或数据独立总线阵列204。在一个实施例中,每条存储I/O总线210访问列存储元件(例如216a、218a、220a)的步骤可包括在列存储元件216a、218a、220a中被访问的存储分区(例如擦除块)的逻辑到物理的映射。如果第一存储分区出现故障、出现部分故障、无法访问或有其他问题,该映射(或坏块重新映射)允许映射到存储分区的物理地址的逻辑地址被重新映射到不同的存储分区中。
数据还可以从请求设备155经系统总线240、桥接器238、局部总线206、缓冲区222,最后经数据总线204传送到固态存储控制器104。数据总线204通常连接到由缓冲区控制器208控制的一个或多个缓冲区222a-n。该缓冲区控制器208通常控制将数据从局部总线206传输到缓冲区222并通过数据总线204传输到流水线输入缓冲区306和输出缓冲区330。该缓冲区控制器208通常控制来自请求设备的数据怎样能临时存储在缓冲区222中,然后传输到数据总线204上,反之亦然,以考虑不同时钟域、防止数据冲突等。缓冲区控制器208通常结合主控制器224工作以协调数据流。当数据到达时,该数据会到达系统总线240并通过桥接器238传输到局部总线206。
通常,在主控制器224和缓冲区控制器208导向下,数据从局部总线206传输到一个或多个数据缓冲区222。然后,数据从缓冲区222流出至数据总线204,通过固态控制器104到达固态存储介质110,例如NAND闪存或其他存储介质。在一个实施例中,数据和随数据到达的相关的带外元数据(“元数据”)通过包含一个或多个固态存储控制器104a-104n-1及相关固态存储介质110a-110n-1在内的一个或多个数据通道传送,而至少一个通道(固态存储控制器104n、固态存储介质110n)专用于带内元数据,例如索引信息和固态存储设备102内部生成的其他元数据。
该局部总线206通常为双向总线或总线组,其使得数据和命令在内部设备与固态存储设备控制器202之间、内部设备与固态存储设备102及连接到系统总线240的设备244-258之间传输。桥接器238便于局部总线206和系统总线240间的通信。本领域的技术人员应该认识到存在其他实施例,例如总线240、206、204、210和桥接器238的环结构或交换星形配置和功能。
系统总线240通常为其中安装或连接有固态存储设备102的计算机112或其他设备的总线。在一个实施例中,系统总线240可为PCI-e总线、串行高级技术附件(“串行ATA”)总线、并行ATA等。在另一个实施例中,系统总线240为外部总线,例如小型计算机系统接口(“SCSI”)、火线、光纤通道、USB、PCIe-AS等。该固态存储设备102可以被封装以适应内部设备或作为外部连接设备。
该固态存储设备控制器202包括在固态存储设备102内控制更高级功能的主控制器224。在多个实施例中,该主控制器224通过解析对象请求和其他请求控制数据流,配合DMA请求等引导索引的创建以将与数据有关的对象标识符映射到相关数据的物理位置。本文所述的多个功能全部或部分由主控制器224控制。
在一个实施例中,主控制器224使用嵌入式控制器。在另一个实施例中,主控制器224使用局部存储器,例如动态存储器阵列230(动态随机存取存储器“DRAM”)、静态存储器阵列232(静态随机存取存储器“SRAM”)等。在一个实施例中,使用主控制器224控制局部存储器。在另一个实施例中,主控制器224通过存储器控制器228访问局部存储器。在另一个实施例中,主控制器224运行Linux服务器,可支持各种公用服务器接口,例如万维网、超文本标记语言(“HTML”)等。在另一个实施例中,主控制器224使用纳米处理器。可使用可编程或标准逻辑或上列的控制器类型的任何组合构造主控制器224。主控制器224可具体呈现为硬件、软件或硬件和软件的组合。本领域的技术人员应该认识到存在用于主控制器224的多个实施例。
在一个实施例中,在存储设备/固态存储设备控制器202管理多个数据存储设备/固态存储介质110a-n的情况下,主控制器224划分内部控制器例如固态存储控制器104a-n间的工作负载。例如,主控制器224可划分为待写入数据存储设备(例如固态存储介质110a-n)中的对象,使得该对象的一部分存储在每一个相连的数据存储设备上。该特征增强了性能,允许更快存储和访问对象。在一个实施例中,主控制器224采用FPGA执行。在另一个实施例中,在主控制器224内的固件可通过管理总线236、经网络连接到NIC244的系统总线240或连接到该系统总线240的其他设备更新。
在一个实施例中,对对象进行管理的主控制器224模拟块存储,使得计算机112或连接到存储设备/固态存储设备102的其设备将存储设备/固态存储设备102看作块存储设备并将数据发送到在存储设备/固态存储设备102中的特定物理地址。然后该主控制器224将这些块进行划分并作为对象存储数据块。然后主控制器224将块和随块发送的物理地址映射到由主控制器224确定的实际位置。映射存储在对象索引中。通常,对于块模拟,块设备应用程序接口(“API”)设置在计算机112、客户端114的驱动器中或设置在希望将存储设备/固态存储设备102用作块存储设备的其他设备中。
在另一个实施例中,主控制器224与NIC控制器244和嵌入式RDMA控制器246协作实现数据和命令集的及时RDMA传输。NIC控制器244可隐藏在不透明端口后以使得定制驱动器能够使用。另外,通过采用标准栈API并与NIC244共同操作的I/O存储器驱动器,客户端114上的驱动器可访问计算机网络116。
在一个实施例中,主控制器224也为独立磁盘冗余阵列(“RAID”)控制器。在数据存储设备/固态存储设备102与一个或多个其他数据存储设备/固态存储设备102网络连接的情况下,主控制器224可为用于单层RAID,多层RAID、循序RAID等的RAID控制器。主控制器224还允许一些对象存储在RAID阵列中,而其他对象在没有RAID的情况下存储。在另一个实施例中,主控制器224可为分布式RAID控制器元件。在另一个实施例中,主控制器224可包括多个RAID、分布式RAID和在别处所述的其他功能。在一个实施例中,主控制器224控制在类似RAID结构中的数据存储,在该结构中奇偶校验信息存储在逻辑页的一个或多个存储元件216、218、220中,在该逻辑页中奇偶校验信息保护存储在相同逻辑页内的其他存储元件216、218、220中的数据。
在一个实施例中,主控制器224与单个或冗余网络管理器(例如交换机)协作以建立路由、平衡带宽利用率和故障转移等。在另一个实施例中,主控制器224与集成专用逻辑(通过局部总线206)以及相关驱动程序软件协作。在另一个实施例中,主控制器224与相连的专用处理器258或逻辑(通过外部系统总线240)及相关驱动程序软件协作。在另一个实施例中,主控制器224与远程专用逻辑(通过计算机网络116)和相关驱动程序软件协作。在另一个实施例中,主控制器224与局部总线206或连接了硬盘驱动器(“HDD”)存储控制器的外部总线协作。
在一个实施例中,主控制器224与一个或多个存储控制器254通信,存储设备/固态存储设备102可呈现为通过SCSI总线、互联网SCSI(“iSCSI”)、光纤通道等连接的存储设备。同时,存储设备/固态存储设备102可自主管理对象且可呈现为对象文件系统或分布式对象文件系统。还可通过节点控制器256和/或专用处理器258访问主控制器224。
在另一个实施例中,主控制器224与自主集成管理控制器协作,定期验证FPGA代码和/或控制器软件、运行(重置)时验证FPGA代码和/或上电(重置)期间验证控制器软件、支持外部重置请求、支持由于看门狗超时而发出的重置请求以及支持电压、电流、功率、温度和其他环境测量值及阈值中断的设置。在另一个实施例中,主控制器224管理垃圾收集释放擦除块以重新使用。在另一个实施例中,主控制器224控制耗损均衡。在另一个实施例中,主控制器224允许将数据存储设备/固态存储设备102分为多个逻辑设备并允许基于分区的介质加密。然而在另一个实施例中,主控制器224支持采用高级的多位ECC校正的固态存储控制器104。本领域的技术人员应该认识到在存储控制器202中,或更具体地讲在固态存储设备102中的主控制器224具有其他特征和功能。
在一个实施例中,固态存储设备控制器202包括控制动态随机存储器阵列230和/或静态随机存储器阵列232的存储器控制器228。如上所述,存储器控制器228可独立于主控制器224或与主控制器224集成。存储器控制器228通常控制一些类型的易失性存储器,例如DRAM(动态随机存储器阵列230)和SRAM(静态随机存储器阵列232)。在其他例子中,存储器控制器228还控制其他存储器类型,例如电可擦可编程只读存储器(“EEPROM”)等。在其他实施例中,存储器控制器228控制两个或更多个存储器类型且存储器控制器228可包括不止一个控制器。通常存储器控制器228控制尽可能多的SRAM232并通过DRAM230补充SRAM232。
在一个实施例中,对象索引存储在存储器230、232中,然后定期卸载到固态存储介质110n的通道或其他非易失性存储器中。本领域的技术人员应该认识到存储器控制器228、动态存储器阵列230和静态存储器阵列232具有其他用途和配置。
在一个实施例中,固态存储设备控制器202包括DMA控制器226,该DMA控制器226控制在存储设备/固态存储设备102与一个或多个外部存储器控制器250及相关的外部存储器阵列252和CPU248之间的DMA操作。注意外部存储器控制器250和外部存储器阵列252之所以被称为外部是因为它们位于存储设备/固态存储设备102之外。另外,DMA控制器226还可利用请求设备,通过NIC244和相关RDMA控制器246控制RDMA操作。
在一个实施例中,固态存储设备控制器202包括连接到管理总线236的管理控制器234。通常管理控制器234管理存储设备/固态存储设备102的环境指标和状态。管理控制器234可通过管理总线236监控设备温度、风扇转速和电源设置等。管理控制器234可支持用于存储FPGA代码和控制器软件的可擦可编程只读存储器(“EEPROM”)的读取和编程。通常管理总线236连接到位于存储设备/固态存储设备102内的多种组件。管理控制器234可通过局部总线206或可包括连于系统总线240或其他总线的单独连接传送警报和中断等信号。在一个实施例中,管理总线236为内置集成电路(“12C”)总线。本领域的技术人员应该认识到通过管理总线236连接至存储设备/固态存储设备102组件的管理控制器234的其他相关功能和用途。
在一个实施例中,固态存储设备控制器202包括可为特殊应用而定制的混杂逻辑242。通常,在使用FPGA或其他可配置控制器配置固态设备控制器202或主控制器224的情况下,可基于特殊应用、客户要求和存储要求等将定制逻辑包括在内。
数据流水线
图3A为根据本发明示出了在固态存储设备102中具有写入数据流水线106和读取数据流水线108的固态存储控制器104的一个实施例300的示意性框图。该实施例300包括数据总线204、局部总线206和缓冲区控制208,其基本上类似于所述的与图2的固态存储设备控制器202有关的那些。写入数据流水线106包括打包器302和纠错码(“ECC”)编码器304。在其他实施例中,写入数据流水线106包括输入缓冲区306、写入同步缓冲区308、写入程序模块310、压缩模块312、加密模块314、垃圾收集器旁路316(有一部分在读取数据流水线108中)、偏置模块318和写入缓冲区320。读取数据流水线108包括读取同步缓冲区328、ECC解码器322、解包器324、对齐模块326和输出缓冲区330。在其他实施例中,读取数据流水线108可包括反向偏置模块332、一部分垃圾收集器旁路316、解密模块334、解压模块336和读取程序模块338。
该固态存储控制器104还可包括控制和状态寄存器340和控制队列342、内存库交错控制器344、同步缓冲区346、存储总线控制器348和复用器(“MUX”)350。在所示的实施例中,该固态存储控制器104包括配置模块352,该配置模块352可为写入数据流水线106的一部分和/或读取数据流水线108的一部分,或可独立于写入数据流水线106和读取数据流水线108。下文中描述了固态控制器104组件及相关写入数据流水线106和读取数据流水线108。在其他实施例中,可使用同步固态存储介质110,并可去除同步缓冲区308、328。
写入数据流水线
写入数据流水线106包括打包器302,该打包器302可直接或间接通过另一个写入数据流水线106阶段接收待写入固态存储器的数据或元数据段,并创建大小适合固态存储介质110的一个或多个数据包。数据或元数据段通常为数据结构(例如对象)的一部分,但也可包括整个数据结构。在另一个实施例中,数据段为数据块的一部分,但也可包括整个数据块。通常,由计算机112、客户端114或其他计算机或设备接收诸如数据结构的数据集,并以流入固态存储设备102或计算机112的数据段的形式传输至固态存储设备102。数据段还可以使用其他名称,例如数据封装包,但是如本文所引用,该数据段包括全部或一部分数据结构或数据块。
每个数据结构存储为一个或多个数据包。每个数据结构可具有一个或多个容器数据包。每个数据包包含数据头。数据头可包括数据头类型字段。类型字段可包括数据、属性、元数据、数据段分隔符(多包)、数据结构和数据链接等等。数据头还可包含有关数据包大小的信息,例如数据包中所包含的数据字节数。数据包的长度可由数据包类型确定。数据头可包含在数据包和数据结构间建立联系的信息。一个例子可能是数据包头中偏移量的使用,用于识别数据段在数据结构中的位置。本领域的技术人员将会了解可包含在由打包器302添加至数据的数据头中的其他信息和可添加至数据包的其他信息。
每个数据包包含数据头,并且可能包含来自数据或元数据段的数据。每个数据包的数据头包含用以关联数据包和包含该数据包的数据结构的相关信息。例如,数据头可包含对象标识符或其他数据结构标识符以及指示组成数据包的数据段、对象、数据结构或数据块的偏移量。数据头还可包含存储总线控制器348用于存储数据包的逻辑地址。数据头还可包含有关数据包大小的信息,例如数据包中所包含的字节数。数据头还可包含序号,当重建数据段或数据结构时,该序号可识别数据段相对于数据结构中其他数据包的所属位置。数据头可包含数据头类型字段。类型字段可包括数据、数据结构属性、元数据、数据段分隔符(多包)、数据结构类型和数据结构链接等等。本领域的技术人员将会了解可包含在由打包器302添加至数据或元数据的数据头中的其他信息和可添加至数据包的其他信息。
写入数据流水线106包括ECC编码器304,该编码器304为从打包器302接收的一个或多个数据包生成一个或多个纠错码(“ECC”)。该ECC编码器304通常使用纠错算法生成与一个或多个数据包一起存储的ECC校验位。由ECC编码器304生成的ECC编码连同与该ECC编码相关的一个或多个数据包一起包含ECC数据块。与一个或多个数据包一起存储的ECC数据用于检测和纠正通过传输和存储引入数据的错误。在一个实施例中,数据包作为长度为N的未编码块流入ECC编码器304。ECC编码器304计算出长度为S的并发位,添加进数据包并输出长度为N+S的已编码的数据块。N和S的值取决于被选择用于实现特定性能、效率和稳定性指标的算法特性。在一个实施例中,在ECC数据块和数据包之间没有固定的关系;数据包可包括不止一个ECC数据块;ECC数据块可包括不止一个数据包;第一个数据包可在ECC数据块中的任意位置结束,并且第二数据包可从同一ECC数据块中第一数据包结束之后开始。在一个实施例中,不能对ECC算法进行动态修改。在一个实施例中,与数据包一起存储的ECC数据足够稳健,可纠正两位以上的错误。
有利的方面是,使用允许超过单个位错误校正或甚至双位错误校正的稳健ECC算法可延长固态存储介质110的使用寿命。例如,如果将闪存用作固态存储介质110中的存储介质,则闪存可在每个擦除周期无错写入大约100,000次。这一使用期限可通过使用稳健的ECC算法加以延长。因具有ECC编码器304和在固态存储设备102上相应的ECC解码器322,该固态存储设备102可在内部纠正错误,并且相比使用稳健性较差的ECC算法(例如单个位错误校正)具有更长的使用寿命。然而,在其他实施例中,ECC编码器304可使用稳健性较差的ECC算法,并且可纠正单个位或双位错误。在另一个实施例中,固态存储介质110可包括可靠性较低的存储器(例如多级单元(“MLC”)闪存)以增加容量,在没有更稳健的ECC算法的情况下此存储器可能不够充分可靠。
在一个实施例中,写入数据流水线106包括输入缓冲区306,该输入缓冲区接收待写入固态存储介质110的数据段并存储该输入数据段直到写入数据流水线106的下一阶段,例如打包器302(或更复杂的写入数据流水线106的其他阶段)做好准备处理下个数据段。输入缓冲区306通常允许写入数据流水线106使用适当大小的数据缓冲区接收和处理数据段的速率之间存在差异。输入缓冲区306还允许数据总线204以大于写入数据流水线106可维持的速率将数据传输至写入数据流水线106,以提高数据总线204的运行效率。通常,当写入数据流水线106不包括输入缓冲区306时,缓冲功能在别处执行,例如在固态存储设备102中但在写入数据流水线106之外;在计算机112中,例如在网络接口卡(“NIC”)内;或在其他设备中,例如当使用远程直接内存访问(“RDMA”)时。
在另一个实施例中,写入数据流水线106还包括写入同步缓冲区308,该写入同步缓冲区在数据包写入固态存储介质110之前缓冲从ECC编码器304接收的数据包。写入同步缓冲区308位于局部时钟域和固态存储时钟域之间的边界,并提供缓冲以解决时钟域差异。在其他实施例中,可使用同步固态存储介质110,并可去除同步缓冲区308、328。
在一个实施例中,写入数据流水线106还包括偏置模块318,该偏置模块可直接或间接地从打包器302接收一个或多个数据包。偏置模块318使数据包的位偏置以趋向于固态存储介质110的存储单元的偏置。如本文所用,“偏置”是一组位的位值的倾向、概率、趋势或期望以呈现出特定的数据模式。偏置可以是自然特性、设计属性、存储介质上执行操作的特性或随机事件。数据本身可具有偏置,并且数据存储介质可具有偏置。偏置可趋向于二进制一,趋向于二进制零,趋向于二进制一和二进制零的平均数,趋向于某些位的某个二进制值等等。
例如,在一个实施例中,可在数据文件的终段填补二进制零,使得存储终段的数据包表现出趋向于二进制零的偏置,意味着数据包具有比二进制一更多的二进制零。其他数据包可具有比二进制零更多的二进制一、或二进制一和二进制零的平均数。虽然每个数据包可基于数据包内的数据具有单独的偏置,但是固态存储介质110的存储单元的偏置可基于与特定二进制值或模式的存储或者存储单元的某些特性相关的有益效果。存储单元特性的一个例子是,NAND闪存单元在由制造商提供时偏于所有二进制一值或几乎所有二进制一值。另外,在NAND闪存单元中执行擦除操作可将每个存储单元的二进制值设置为二进制一,使得存储单元的编程包括将某些存储单元更改为二进制零值。所有二进制一值或几乎所有二进制一值的偏置在由制造商提供时或擦除时表现了非易失性固态存储介质的存储单元为空态的一个例子。
在一个实施例中,每个存储元件216、218、220将二进制数据存储在表现出偏置的多个存储单元中。每个存储单元存储一个或多个二进制位或值。闪存存储单元可以是分别存储单个二进制位的单级单元(“SLC”)、或分别存储两个或更多个二进制位的多级单元(“MLC”)。存储单元的例子包括晶体管、电容器、磁性元件、机械元件、光学元件等等。在闪存中,每个存储单元通常为浮栅晶体管。NRAM、MRAM、DRAM、PRAM和其他类型的固态存储器可具有其他类型的存储单元,并且每个存储单元可存储单个二进制位或者两个或更多个二进制位。
在一个实施例中,空态或擦除状态下的存储元件216、218、220中的存储单元存储初始二进制值。初始二进制值代表存储单元的偏置。例如,存储单元可具有物理特性、电特性、机械特性或其他特性,使其在默认情况下存储特定值。在另一个实施例中,偏置可基于固态存储介质110的设计考虑、安全考虑、兼容性问题等有意地选择,但不可基于存储单元的默认属性。
例如,在一个实施例中,存储元件216、218、220的存储单元可分别在制造商提供时存储二进制值一,并且可分别在被编程或写入之前擦除至值一,如同闪存的通常情况一样。在另一个实施例中,可使存储元件216、218、220的存储单元偏置为趋向于二进制零、趋向于平均或等量的二进制一或零、趋向于多个位的某个二进制值、趋向于二进制模式等等。
在某些实施例中,一个或多个存储单元的偏置可能会受到物理上邻近或靠近一个或多个存储单元的其他存储单元的状态的影响或以该状态为基础。例如,期望存储单元中存储的数据偏置可最大程度减少存储单元与其他存储单元之间的单元间干扰,诸如此类。在物理上邻近的存储单元之间的电压差可引起单元间干扰,在某些实施例中,基于存储单元的物理几何形状使数据偏置以减少或最小化存储单元之间的电压差可减少单元间干扰。在一个实施例中,固态存储介质110的存储单元可具有趋向于二进制模式的偏置,该二进制模式满足存储单元与其他物理上邻近的存储单元之间的预定电压差阈值,诸如此类。
除了局部类型的单元间干扰外,较大的多单元结构,例如位串、字线等也会受到单元间干扰。某些数据条纹或其他数据模式(例如二进制一或二进制零的条纹)会妨碍用于这些较大多单元结构的传感放大器和/或其他管理电路的精确度或有效性,并且可能有利于将数据偏置以远离此类条纹或其他模式。
对于某些类型的存储单元,例如SLC闪存,存储单元的电压电平和存储单元之间的相关电压差可基于每个存储单元的单个位值,并且使数据偏置可包括趋向于在数据包内和/或在存储单元的物理区域内的二进制一值和二进制零值之间具有最小过渡的二进制模式偏置。对于其他类型的存储单元,例如MLC闪存,存储单元的电压电平和存储单元之间的相关电压差可基于形成子模式或符号的位组,并且偏置数据可包括趋向于在某些子模式或符号之间具有最小过渡的二进制模式的偏置。使用子模式或符号的一个例子包括多个二进制值对MLC存储单元内相关电荷水平进行二进制或格雷码映射。在某些实施例中,由单个MLC存储单元存储的位可能没有邻近的地址,但可存储在不同的物理页和逻辑页等等中。
在一个实施例中,作为分别从其他偏置技术、代替其他偏置技术或除了其他偏置技术之外执行的单独步骤,偏置模块318偏置源数据以减少单元间的干扰。例如,当反转、白化、压缩、重新分配和/或以其他方式偏置源数据时,单独的源数据块可能仍具有可引起单元间干扰的模式,并且偏置模块318可用趋向最小化单元间干扰的模式偏置一个或多个单独的源数据块,诸如此类。
偏置模块318通过改变数据包的偏置使其更贴切地匹配固态存储介质110的存储单元的偏置的方式偏置数据包。偏置模块318以可逆的方式偏置数据包,使得反向偏置模块332可将数据包转换回具有初始源偏置的原始源数据值。在一个实施例中,调整偏置模块318所偏置的数据包的大小以适于存储在特定逻辑或物理存储区域或固态存储介质110的分区中,例如擦除块、虚拟擦除块、页、虚拟页、ECC数据块,页内分区等等。在一个实施例中,偏置模块318基于数据包的偏置选择性地偏置某些数据包,而不偏置其他数据包。
本领域的技术人员应该认识到偏置模块318可选择性地在形成数据包子集的一个或多个数据段中运行。相似地,反向偏置模块332也可在数据段中运行。或者,另外,在一个实施例中,可基于固态存储介质110中存储区域的大小、总线或缓冲区的大小、流水线106、108的大小和可用于存储的指示器的多个额外位等等,调整数据包(或数据包子集,例如数据段)的大小。
通过使数据包的偏置趋向于存储单元的偏置,偏置模块318提高了固态存储介质110和固态存储设备102的性能和持久性。例如,使数据包偏置从而更贴切地匹配存储单元的偏置可减少写入时间和擦除时间,因为只需改变较少的实际存储单元即可执行该操作。这还增加了存储单元的可写入寿命,因为在存储单元上执行的操作更少就意味着在耗损开始影响存储单元的性能/可靠性之前存储单元将持续更长时间。在某些实施例中,偏置数据包可减少功耗或具有其他额外有益效果。在一个实施例中,由于存储单元恰好在编程或写入之前存储了满足偏置的初始二进制值,因此数据包更加匹配存储单元的偏置,需要改变以存储数据包的存储单元更少,并且保持在偏置状态的存储单元更多。
如图所示,在将一个或多个数据包发送至ECC编码器304之前,偏置模块318使这些数据包偏置。根据偏置模块318用于偏置数据包的方法和其他设计考虑,在另一个实施例中,偏置模块318可在写入数据流水线106中的ECC编码器304之后接收数据,或被置于写入数据流水线106中的其他位置。例如,在某些实施例中,将ECC数据与偏置模块318偏置的数据保持分离是有利的,而在其他实施例中,偏置包含来自ECC编码器304的ECC数据的数据对偏置模块318来说是有利的。
在一个实施例中,在将一个或多个数据段发送至ECC编码器304之前,偏置模块318偏置这些数据段。数据段可以是在一个实施例中小于数据包的一组位。在此类实施例中,数据段可包含写入数据流水线106的位/字节宽度。相似地,反向偏置模块332可在偏置的数据段被读取后将其转换回初始源状态。偏置和反向偏置数据段可利于在写入数据流水线106和读取数据流水线108中使用偏置模块318和反向偏置模块332,因为可调整数据段大小以匹配流过流水线106、108的数据的大小(总线宽度)。
在另一个实施例中,偏置模块318可与写入数据流水线106的另一个元件整合,例如压缩模块312、加密模块314和ECC编码器304等等。在写入数据包之前,当偏置模块318偏置数据包时,偏置模块318和相应的反向偏置模块332明显地提高了固态存储介质110的性能,并且反向偏置模块332在偏置的数据包被读取后将其转换回初始源状态。
在另一个实施例中,写入数据流水线106还包括加密模块314,在将数据段发送到打包器302之前,该加密模块直接或间接地将从输入缓冲区306接收的数据或元数据段加密,并且使用与数据段共同接收的加密密钥加密数据段。加密模块314用来加密数据的加密密钥并非对于存储在固态存储设备102中的所有数据通用,但是可基于每种数据结构而有所不同,并且在接收数据段时被共同接收,如下文所述。例如,用于通过加密模块314加密数据段的加密密钥可随数据段一起接收,或可作为命令的一部分被接收以写入数据段所属的数据结构。固态存储设备102可使用非秘密加密随机数,并将其存储在结合加密密钥使用的每个数据结构包中。每个包可存储不同的随机数。数据段可在多个数据包之间用唯一的随机数进行拆分以达到通过加密算法增强保护的目的。
加密密钥可从客户端114、另一个计算机、密钥管理器或其他保存该加密密钥的设备接收以用于加密数据段。在一个实施例中,将加密密钥从固态存储设备102、计算机112、客户端114或其他传送到其他外部代理之一传送到固态存储控制器104,该其他外部代理具有执行行业标准方法的能力以安全地传送和保护私人密钥和公开密钥。
在一个实施例中,加密模块314使用与数据包一起接收的第一加密密钥对第一数据包进行加密,并使用与第二数据包一起接收的第二加密密钥对第二数据包进行加密。在另一个实施例中,加密模块314使用与数据包一起接收的第一加密密钥对第一数据包进行加密,并将第二数据包不加密的传递至下一个阶段。有利地,固态存储设备102的写入数据流水线106中包含的加密模块314允许在没有单个文件系统或其他外部系统的情况下逐个数据结构或逐个数据段对数据加密,以跟踪用于存储相应数据结构或数据段的不同加密密钥。每个请求设备155或相关密钥管理器独立地管理加密密钥,该加密密钥仅用于加密由请求设备155发送的数据结构或数据段。
在一个实施例中,加密模块314可使用固态存储设备102的唯一加密密钥加密一个或多个数据包。或者除了上述加密之外,加密模块314可独立地执行此介质加密。通常包括数据头在内的整个数据包都会被加密。而在另一个实施例中,不加密数据头。加密模块314的介质加密可为存储在固态存储介质110中的数据提供一定水平的安全性。例如,在使用特定固态存储设备102的唯一介质加密对数据进行加密后,如果固态存储介质110连接到不同的固态存储控制器104、固态存储设备102或计算机112,则在不使用与将数据写入固态存储介质110过程中所用的相同加密密钥的情况下,通常无法在不付出重大努力的情况下读取固态存储介质110的内容。
在另一个实施例中,写入数据流水线106包括压缩模块312,该压缩模块在将数据或元数据段发送至打包器302之前对数据段进行压缩。压缩模块312通常使用本领域技术人员所知的压缩例程压缩数据或元数据段以减少段的存储大小。例如,如果数据段包含512个零的串,则压缩模块312可用表示这512个零的代码或令牌替换该512个零,而该代码或令牌所占据的空间比512个零占据的空间紧凑得多。
在一个实施例中,压缩模块312用第一压缩例程压缩第一数据段,而不压缩的传递第二数据段。在另一个实施例中,压缩模块312用第一压缩例程压缩第一数据段,并用第二压缩例程压缩第二数据段。在固态存储设备102中具有该灵活性是有利的,使得客户端114或将数据写入固态存储设备102的其他设备可分别指定压缩例程,或使得其中一个可指定压缩例程而另一个不指定压缩。也可基于每个数据结构类型或数据结构类的默认设置选择压缩例程。例如,特定数据结构的第一数据结构可覆盖默认压缩例程设置,并且相同数据结构类和数据结构类型的第二数据结构可使用默认压缩例程,以及相同数据结构类和数据结构类型的第三数据结构可以不使用压缩。
在一个实施例中,写入数据流水线106包括垃圾收集器旁路316,该垃圾收集器旁路316作为在垃圾收集系统中的数据旁路的一部分从读取数据流水线108接收数据段。垃圾收集系统通常标记不再有效的数据包,这通常是因为该数据包被标记为删除或已被修改并且修改后的数据存储在不同位置。在某些情况下,垃圾收集系统确定特定存储部分可被回收。该确定可能是由于可用的存储容量不足、标记为无效的数据百分比达到阈值、有效数据的合并、存储部分的错误检测率达到阈值或基于数据分布提高性能等。垃圾收集算法将考虑多个因素以确定何时回收存储部分。
标记存储部分进行回收后,通常必须重新分配该部分中的有效数据包。垃圾收集器旁路316允许将数据包读入读取数据流水线108,然后在未脱离固态存储控制器104的情况下直接传送至写入数据流水线106。在一个实施例中,垃圾收集器旁路316是运行在固态存储设备102中的自主垃圾收集系统的一部分。这将允许固态存储设备102管理数据以使数据系统地散布在固态存储介质110中,从而提高性能和数据可靠性,避免固态存储介质110的任何一个位置或区域过多使用和使用不足,并延长固态存储介质110的使用寿命。
垃圾收集器旁路316将插入写入数据流水线106的数据段与由客户端114或其他设备写入的其他数据段整合。在所示的实施例中,垃圾收集器旁路316位于写入数据流水线106中的打包器302之前以及读取数据流水线108中的解包器324之后,但也可位于读取和写入数据流水线106、108中的其他位置。在刷新写入流水线108的过程中,可使用垃圾收集器旁路316填充虚拟页剩余部分以提高固态存储介质110中的存储效率,从而减少垃圾收集的频率。
在一个实施例中,写入数据流水线106包括为高效写入操作缓冲数据的写入缓冲区320。通常,写入缓冲区320具有足够的数据包容量以填充固态存储介质110中的至少一个虚拟页。这将允许写入操作将整页数据无中断地发送至固态存储介质110。通过将写入数据流水线106的写入缓冲区320和读取数据流水线108中的缓冲区的大小调整为具有相同容量或大于固态存储介质110中存储写入缓冲区的容量,写入和读取数据将更为有效,因为单个写入命令就可以将整个虚拟页的数据发送至固态存储介质110中而无需多个命令。
填充写入缓冲区320时,固态存储介质110可用于其他读取操作。这是有利的,因为在将数据写入存储写入缓冲区和流入存储写入缓冲区的数据停滞时,具有较小写入缓冲区或没有写入缓冲区的其他固态设备可占用固态存储。读取操作将被阻断直到整个存储写入缓冲区被填充并编程。用于没有写入缓冲区或具有较小写入缓冲区的系统的另一个方法是刷新未满的存储写入缓冲区以便能够读取。而这是低效的,因为需要多个写入/编程周期来填充页面。
对于写入缓冲区320的尺寸大于虚拟页的所示实施例,可以在包括多个子命令的单个写入命令之后使用单个编程命令以将数据页从每个固态存储元件216、218、220中的存储写入缓冲区传输至每个固态存储元件216、218、220中的指定页。该技术具有消除部分页编程的有益效果,已知该技术会降低数据可靠性和耐久性,并且当缓冲区填满时,将清空用于读取和其他命令的目标内存库。
在一个实施例中,写入缓冲区320是乒乓缓冲区,其中当乒乓缓冲区的一面正在填充时,填充并指定缓冲区的另一面以在适当的时间传输。在另一个实施例中,写入缓冲区320包括具有大于数据段虚拟页容量的先进先出(“FIFO”)寄存器。本领域的技术人员应当知道在将数据写入固态存储介质110之前允许数据虚拟页存储的其他写入缓冲区320配置。
在另一个实施例中,调整写入缓冲区320的大小以小于虚拟页,使得少于一页的信息写入固态存储介质110中的存储写入缓冲区。在本实施例中,为了防止写入数据流水线106中的停滞阻碍读取操作,作为垃圾收集过程的一部分,使用需要从一个位置移至另一个位置的垃圾收集系统将数据列队。在写入数据流水线106中数据停滞的情况下,可通过垃圾收集器旁路316将数据传送到写入缓冲区320,然后传送到固态存储介质110中的存储写入缓冲区上,以在编程该数据之前填充虚拟页的页面。用这种方法,写入数据流水线106中的数据停滞将不会停止从固态存储设备102进行读取。
在另一个实施例中,写入数据流水线106包括在写入数据流水线106中具有一个或多个用户可定义功能的写入程序模块310。写入程序模块310允许用户定制写入数据流水线106。用户可基于特定数据要求或应用定制写入数据流水线106。当固态存储控制器104为FPGA时,用户可相对容易地用定制命令和功能编程写入数据流水线106。用户还可使用写入程序模块310以包括具有ASIC的定制功能,然而,定制ASIC比用FPGA更难。写入程序模块310可包括缓冲区和旁路机构以使得第一数据段在写入程序模块310中执行,而第二数据段可继续通过写入数据流水线106。在另一个实施例中,写入程序模块310可包括可通过软件编程的处理器内核。
请注意,写入程序模块310示出在输入缓冲区306和压缩模块312之间,然而,写入程序模块310可位于写入数据流水线106中的任何位置并且可分布在多个阶段302-320中。另外,在被编程和独立运行的多个阶段302-320中可分布多个写入程序模块310。另外,可改变阶段302-320的顺序。本领域的技术人员应该认识到基于特定用户要求的阶段302-320顺序的可行改变。
读取数据流水线
读取数据流水线108包括ECC解码器322,该ECC解码器322通过使用与请求数据包的每个ECC数据块一起存储的ECC确定从固态存储介质110接收的请求数据包的ECC数据块中是否存在数据错误。如果请求数据包中存在任何错误且该错误可通过使用ECC纠正,则ECC解码器322可纠正请求数据包中的任何错误。例如,如果ECC检测到六位的错误但仅能纠正三位错误,那么ECC解码器322将纠正具有最多三位错误的请求数据包的ECC数据块。ECC解码器322通过将错误的位更改为正确的一或零状态来纠正错误的位,使得请求数据包与当其被写入固态存储介质110并且该数据包生成ECC时相同。
在某些实施例中,ECC解码器322可为下述的配置模块352提供有关可纠正错误的错误信息,例如错误位的位置、错误位的值和/或其他错误信息。例如,ECC解码器322可为配置模块352提供错误偏置,指示数据集中出错的一个或多个位,诸如此类。如本文所用,错误偏置表示数据集中检测到的一个或多个位错误。在一个实施例中,错误偏置包括在数据集中检测到的位错误的位置或定位。在另一个实施例中,错误偏置包括检测到的位错误的值。所测错误的值可包括错误位的纠错值、错误位的错误值等。例如,在一个实施例中,ECC解码器322可提供具有未纠正数据集和指示所测位错误位置的错误偏置的配置模块352,并且配置模块352可通过将这些位置的位反向或倒置以确定已知偏置。例如,在另一个实施例中,ECC解码器322可提供具有已纠正错误的数据集和指示所测位错误位置的错误偏置的配置模块352,并且配置模块352可通过将这些位置的位反向或倒置以确定读取偏置。
如果ECC解码器322确定请求数据包包含的错误位大于ECC可纠正的错误位,则ECC解码器322不能纠正请求数据包中损坏的ECC数据块中的错误,并发送中断。在一个实施例中,ECC解码器322通过发送指出请求数据包中存在错误的消息来发送中断。该消息可包括有关ECC解码器322无法纠正错误或暗指ECC解码器322不能纠正错误的信息。在另一个实施例中,ECC解码器322通过中断和/或消息发送请求数据包中损坏的ECC数据块。
在一个实施例中,ECC解码器322无法纠正的请求数据包中已损坏ECC数据块或已损坏ECC数据块的一部分由主控制器224读取、更正并返回至ECC解码器322,以便读取数据流水线108进一步处理。在一个实施例中,请求包的已损坏ECC数据块或已损坏ECC数据块的一部分被发送至请求数据的设备。请求设备155可纠正ECC数据块或用另一个副本替换数据,例如备份或镜像副本,然后可使用请求数据包的替换数据或将其返回至读取数据流水线108。请求设备155可使用错误的请求数据包中的数据头信息以识别替换已损坏请求数据包或替换数据包所属的数据结构所需的数据。在另一个实施例中,固态存储控制器104使用某些类型的RAID存储数据并能恢复损坏的数据。在另一个实施例中,ECC解码器322发送中断和/或消息并且接收设备放弃与请求数据包相关的读取操作。本领域的技术人员应当了解当解码器322确定请求数据包的一个或多个ECC数据块已损坏并且ECC解码器322无法纠正错误时应采取的其他选择和操作。
读取数据流水线108包括可直接或间接地从ECC解码器322接收请求数据包的ECC数据块的解包器324,并可检查和移除一个或多个数据包头。解包器324可通过检查数据头中的数据包标识符、数据长度和数据位置等验证数据包头。在一个实施例中,数据头包括散列码,该散列码可用于验证传送到读取数据流水线108的数据包是所请求的数据包。解包器324也可将数据头从由打包器302添加的请求数据包中移除。解包器324可能针对的不是操作某些数据包,而是将这些数据包在不进行修改的情况下向前传递。一个例子是在重建过程中请求的容器标签,其中需要数据头信息用于索引重建。另外的例子包括用于固态存储设备102中的多个类型数据包的传输。在另一个实施例中,解包器324的操作取决于数据包的类型。
读取数据流水线108包括对齐模块326,该对齐模块从解包器324接收数据并将不需要的数据移除。在一个实施例中,发送至固态存储介质110的读取命令将检索数据包。请求数据的设备可能不需要所检索数据包中的所有数据,对齐模块326将不需要的数据移除。如果检索页中的所有数据均为所请求数据,则对齐模块326不会移除任何数据。
对齐模块326在将数据段转发到下一阶段之前,以与请求数据段的设备兼容的数据结构数据段的形式,重新格式化数据。通常,当读取数据流水线108处理数据时,数据段或数据包的大小在各个阶段会有所变化。对齐模块326使用接收到的数据将数据格式化为适于发送至请求设备155并连接以形成响应的数据段。例如,来自第一数据包的一部分的数据可与来自第二数据包的一部分的数据结合。如果数据段大于请求设备155所请求的数据,则对齐模块326可移除不需要的数据。
在一个实施例中,读取数据流水线108包括读取同步缓冲区328,该读取同步缓冲区328在读取数据流水线108进行处理之前,缓冲从固态存储介质110读取的一个或多个请求数据包。读取同步缓冲区328位于固态存储时钟域和局部总线时钟域之间的边界,并提供缓冲以解决时钟域差异。
在另一个实施例中,读取数据流水线108包括输出缓冲区330,该输出缓冲区在数据包传输至请求设备155之前从对齐模块326接收请求的数据包并存储数据包。输出缓冲区330可解决当从读取数据流水线108的各阶段接收数据段时与当数据段传输至固态存储控制器104的其他部分或传输至请求设备155时之间所产生的差异。输出缓冲区330还允许数据总线204以大于读取数据流水线108可保持的速率从读取数据流水线108接收数据,以提高数据总线204的运行效率。
在一个实施例中,固态存储控制器104包括配置模块352,该配置模块可设置和调整用于固态存储介质110的配置参数,例如读取电压阈值等等。在另一个实施例中,配置模块352可与固态存储介质110整合,使其可独立于读取数据流水线108和/或写入数据流水线106运行。在某些实施例中,如下文中结合图4和图5的主动配置模块424所详述,配置模块352基于开环形式的存储单元的存储介质特性主动地确定固态存储介质110的存储单元的一个或多个配置参数,并具有少量的或没有来自存储单元的反馈。在所示实施例中,配置模块352与存储控制总线212和存储总线控制器348连通,以将固态存储介质110的存储单元配置为可使用各种配置参数。在另一个实施例中,配置模块352管理固态存储控制器104和/或固态存储设备102的配置参数和/或设置。
在其他实施例中,配置模块352可直接或间接地从固态存储介质110接收数据集,以确定闭环形式的相应存储单元的配置参数,并以读取数据集作为来自存储单元的反馈。在某些实施例中,配置模块352可从ECC解码器322接收一个或多个请求的偏置数据包。在另一个实施例中,配置模块352可从读取同步缓冲区328、直接从存储I/O总线210、从反向偏置模块332等接收数据集。结合图4更详细地描述配置模块352。下文结合图3B描述了另一个实施例,其中配置模块352从ECC解码器322和反向偏置模块332接收输入。
通常,配置模块352可设置和调整固态存储介质110的一个或多个存储单元的一个或多个配置参数,例如设置和调整读取电压阈值、电阻率阈值、编程阈值、擦除阈值等。读取电压阈值是可将存储在固态存储介质110的存储单元中的离散值分离的电压电平。不同固态存储技术可使用除电压之外的不同阈值以在离散状态之间进行区分。例如,相变RAM或PRAM将数据存储于在不同状态下具有不同电阻率的硫系玻璃中。对于PRAM,配置模块352可确定、设置和/或调整可区分离散存储状态的电阻率阈值。按照本公开,本领域的技术人员应该认识到配置模块352可采用本文中结合读取电压阈值所述的基本上类似的方式确定、设置和调整电阻率阈值或其他配置参数。
对于存储单个二进制值的SLC存储单元,读取电压阈值为在二进制一状态和二进制零状态之间的边界值。例如,在一个实施例中,读取电压电平高于读取电压阈值的存储单元存储二进制一,而读取电压电平低于读取电压阈值的存储单元存储二进制零。其他类型的存储单元(如MLC存储单元)可具有多个读取电压阈值以在两个以上的离散状态之间进行区分。
例如,在一个实施例中,存储两位数据的MLC存储单元可具有三个读取电压阈值以分离二进制值11、01、00和10。这三个示例读取电压阈值可为x伏特、y伏特和z伏特,如下文结合图6C的读取电压阈值662所详述。
如果从存储单元读取的电压在最低电压Vmin到x伏特之间,则表明是二进制11状态。在某些实施例中,Vmin可以是负电压。如果从存储单元读取的电压在x伏特到y伏特之间,则表明是二进制01状态。如果从存储单元读取的电压在y伏特到z伏特之间,则表明是二进制00状态。如果从存储单元读取的电压在z伏特到最高电压Vmax伏特之间,则表明是二进制10状态。
Vmin、Vmax、x、y和z的电压可基于存储单元的制造商而有所不同。例如,读取电压可在-3.5和5.8伏特之间的范围内或在另一个预定电压范围内。相似地,相对于读取电压阈值,二进制状态11、01、00和10的变化顺序可基于所用的编码类型(例如格雷码编码类型和二进制代码编码类型等)而有所不同。下文结合图6C描述了一个示例编码类型。如图6C所详述,虽然单个MLC存储单元存储多个位,但是来自单个存储单元的位可能不具有相邻地址并且可能包含在不同的物理页和逻辑页中,诸如此类。
在某些实施例中,读取电压阈值包括表示取值的电压范围(最大值和最小值),而不是指在离散值之间的边界值。作为一个范围的电压阈值可通过更改该范围的任一端或两端的边界值来调整。在一个实施例中,固态存储介质110的读取电压阈值或其他配置参数最初设定在可由制造商限定的默认电平。通常将此类配置参数默认电平设置为适用于固态存储介质110的多种一般用途。有利的是,配置模块352的实施例允许基于更具体的使用特性以最佳方式运用固态存储介质110。在某些实施例中,配置模块352重写一个或多个配置参数的默认电平,并基于固态存储介质110的存储介质特性将一个或多个配置参数设置为不同电平。配置模块352可将配置参数设置为与默认电平相比时固态存储介质110遇到的错误量减少的电平、设置为与默认电平相比时可检测和纠正的错误量增多的电平、设置为与默认电平相比时固态存储介质110的每秒输入输出操作(“IOPS”)数量增多的电平、设置为与默认电平相比时固态存储介质110的使用寿命延长的电平和/或设置为与默认电平相比时固态存储介质110的实用性提高的电平。
由于固态存储介质110的泄漏和其他干扰因素,存储单元的读取电压电平和其他配置参数会随时间推移而变化。泄漏率也会随固态存储介质110的耗损和老化而增高。如果存储单元的读取电压电平改变至超过读取电压阈值,造成从存储单元读取的数据值不同于写入存储单元的数据值,则会发生数据错误。在一个实施例中,配置模块352调整固态存储介质110的一个或多个存储单元的读取电压阈值或其他配置参数,以补偿存储单元的读取电压电平的变化量。通过主动地和/或动态地调整读取电压阈值,配置模块352可增加固态存储介质110中所存储数据的保持率和/或可靠性,并延长固态存储介质110自身的使用寿命,从而提高固态存储介质110的实用性。
在一个实施例中,配置模块352使用固态存储介质110的数据集或数据包的已知偏置调整读取电压阈值或其他配置参数。如上文结合偏置模块318所述,偏置是一组位的位值的倾向、概率、趋势或期望以呈现出特定的数据模式。偏置可以是自然特性、设计属性、在存储介质上执行操作的特性或随机事件。偏置可趋向于二进制一、趋向于二进制零、趋向于二进制一和二进制零的平均数、趋向于某些位的某个二进制值、趋向于特定比率的二进制一和二进制零、趋向于二进制模式等等。
在一个实施例中,配置模块352接收的数据集或数据包具有已知的偏置。由于至少三个原因之一,该数据集或数据包具有已知偏置。第一,该数据集或数据包可具有已知偏置是因为当写入数据集或数据包时偏置模块318使数据集或数据包偏置。在一个实施例中,偏置模块318和/或反向偏置模块332与配置模块352协作,从而将已知偏置传送给配置模块352。第二,该数据集或数据包可具有已知偏置是因为数据集或数据包读取自固态存储介质110的初始未写入区域。例如,在一个实施例中,固态存储介质110的初始未写入区域通常可具有在未写入状态下的全部为二进制一或全部为二进制零的已知偏置。第三,该数据集或数据包可具有已知偏置是因为ECC解码器322已纠正数据集或数据包并且已确定存在错误的数据集的一个或多个位的初始正确值。数据集中的正确位值包括该已知偏置。由数据集中的错误引起的相对于已知偏置的偏置是一种错误偏置。
在一个实施例中,配置模块352确定了数据集或数据包的读取偏置相对于已知偏置出现偏移,并基于读取偏置与已知偏置之间的差异确定数据集偏移方向。在另一个实施例中,配置模块352基于偏移方向调整与数据集相应的存储单元的读取电压阈值或其他读取阈值,例如电阻率阈值。例如,在一个实施例中,如果数据集基于已知偏置具有比预期多的二进制零,则配置模块352可将存储单元的读取电压阈值从先前的读取电压阈值降至新的读取电压阈值。在一个实施例中,对于MLC存储单元,数据集可包括来自不同地址、不同页等的数据,以使得数据集包含相关存储单元存储的所有数据。配置模块352可将读取电压阈值调整基于存储单元的已知特性,例如基于存储单元的物理和/或电气结构等用于存储单元的编码类型。在另一个实施例中,配置模块352可改变、转化或结合来自不同地址或页的数据,以便于确定MLC存储单元的已知偏置、读取偏置和/或相对于已知偏置的偏移。在另一个实施例中,对于MLC存储单元,配置模块352可基于MLC存储单元所存储的数据子集调整MLC存储单元的读取电压阈值。
在一个实施例中,配置模块352可请求以新的读取电压阈值重新读取数据集。配置模块352可确定重新读取的数据集是否具有与已知偏置相偏移的读取偏置,并可以采用迭代方式将读取电压阈值调整为新的读取电压阈值,直到数据集的读取偏置不再与已知偏置出现超过阈值量(可能为零)的偏移,并且直到ECC解码器322可纠正数据集或者诸如此类中的错误。在一个实施例中,配置模块352存储新的读取电压阈值,使得新的读取电压阈值持续用于固态存储介质110的后续数据读取。在另一个实施例中,固态存储介质110存储该新的读取电压阈值以用于后续数据读取。
在一个实施例中,配置模块352可监测每个数据包读取的读取偏置,并将该数据包或其他数据集的偏置与已知偏置进行比较以响应读取请求。在另一个实施例中,配置模块352可监测每个数据包读取的读取偏置,并可将该数据集或数据包的偏置与已知偏置进行比较以响应数据错误,例如ECC解码器322无法纠正的位错误等。在另一个实施例中,配置模块352不会监测每个数据包读取的读取偏置,但可确定数据集或数据包的偏置并将其与已知偏置进行比较以响应数据错误。如下文结合图4和图5中的主动配置模块424所述,在某些实施例中,代替基于读取数据集或数据包的调整,或是除了基于读取数据集或数据包的调整之外,配置模块352基于存储介质特性,主动地设置或调整读取电压阈值或其他配置参数。
在一个实施例中,固态存储控制器104可从固态存储介质110中的多个通道、存储元件、管芯、芯片、物理擦除块(“PEB”)和存储单元分组等读取数据包中的数据,其中每一项可具有独立的读取电压阈值。通道、存储元件、管芯、芯片和/或存储单元分组的制造商可为由固态存储控制器104独立调整的每个通道、存储元件、管芯、芯片和/或存储单元分组制定读取电压阈值。或者除此之外,通道、存储元件、管芯、芯片和/或存储单元组的制造商可为由固态存储控制器104作为单个组调整的通道组、存储元件组、管芯组、芯片组和/或存储单元分组的组制定读取电压阈值。
在一个实施例中,ECC编码器304为每个通道、存储元件、管芯、芯片、PEB或其他存储单元组生成独立的ECC校验位。ECC校验位由数据存储在特定存储单元分组上,而不是分布在多个分组中。如果每个存储单元分组独立地生成并存储ECC校验位,则为了响应数据错误,配置模块352可将ECC校验位和已知结构用于如何将ECC校验位写入存储单元分组以确定发生数据错误的存储单元分组并调整这些分组的读取电压阈值。如果数据包的ECC校验位存储在多个存储单元分组上,则配置模块352可单独地检查来自每个存储单元分组的数据集的读取偏置并调整一个或多个相应的读取电压阈值。结合图6A和6B更详细地描述了具有多个通道的存储元件阵列。
在一个实施例中,读取数据流水线108包括反向偏置模块332,该反向偏置模块可直接或间接地从ECC解码器322接收一个或多个请求的偏置数据包,并在将一个或多个请求的数据包发送至解包器324之前通过反转偏置模块318的偏置过程以将一个或多个请求的数据包转换回它们的初始源形式。在一个实施例中,反向偏置模块332可使用偏置模块318存储的一个或多个指示器将偏置的数据包转换回它们的初始源数据。在某些实施例中,反向偏置模块332可将数据包或其他数据集的已知偏置、读取偏置和/或已知偏置的偏移提供给配置模块352,如下文结合图3B所述。
在另一个实施例中,反向偏置模块332在不使用指示器的情况下将偏置的数据包转换回它们的初始源数据。不使用指示器,反向偏置模块332可实施偏置模块318反向操作的算法。该算法可反转每个接收到的数据包和/或接收到的所选数量的数据包的偏置。在所示实施例中,反向偏置模块332位于ECC解码器322和解包器324之间。在另一个实施例中,基于在写入数据流水线106中偏置模块318的位置,反向偏置模块332可位于读取数据流水线108的其他位置。
在另一个实施例中,读取数据流水线108包括解密模块334,该解密模块在将数据段发送至输出缓冲区330之前解密由解包器324格式化的数据段。可使用接收到的密匙并结合使用读取请求解密加密数据段,而该读取请求会引发由读取同步缓冲区328接收的请求数据包的检索。解密模块334可使用与第一数据包的读取请求一起接收到的加密密钥解密第一数据包,然后可用不同的加密密钥解密第二数据包,或者可在未解密的情况下将第二数据包传递至读取数据流水线108的下一阶段。当数据包存储为非秘密加密随机数时,该随机数结合加密密钥用于解密该数据包。加密密钥可从一个客户端114、一个计算机112、密钥管理器或其他管理加密密钥的设备接收以用于固态存储控制器104。
在另一个实施例中,读取数据流水线108包括可将解包器324格式化的数据段进行解压的解压模块336。在一个实施例中,解压模块336使用存储在数据包头和容器标签中其中一个或者两个中的压缩信息来选择补充例程以用于由压缩模块312压缩数据。在另一个实施例中,解压模块336使用的解压例程由请求解压数据段的设备决定。在另一个实施例中,解压模块336可根据基于每个数据结构类型或数据结构类别的默认设置选择解压例程。第一对象的第一数据包可覆盖默认解压例程,并且对于相同数据结构类别和数据结构类型第二数据结构第二数据包可使用默认解压例程,以及对于相同数据结构类别和数据结构类型的第三数据结构的第三数据包可以不使用解压。
在另一个实施例中,读取数据流水线108包括在读取数据流水线108中具有一个或多个用户可自定义功能的读取程序模块338。读取程序模块338具有与写入程序模块310类似的特性,允许用户为读取数据流水线108提供自定义功能。读取程序模块338可位于如图3A中所示的位置、可位于读取数据流水线108中的另一个位置或可包括读取数据流水线108内的多个位置中的多个部分。另外,在读取数据流水线108内的多个位置中可存在多个独立运行的读取程序模块338。本领域的技术人员可以认识到读取数据流水线108中其他形式的读取程序模块338。与写入数据流水线106一样,读取数据流水线108的各个阶段可重新排列,并且本产品的一项功能是可以辨认读取数据流水线108中各个阶段的其他顺序。
固态存储控制器104包括控制和状态寄存器340和相应的控制队列342。控制和状态寄存器340和控制队列342有利于对在写入和读取数据流水线106、108中与处理的数据相关的控制和排序命令和子命令。例如,打包器302中的数据段在控制队列342可具有与ECC编码器304相关的一个或多个相应控制命令或指令。打包数据段时,可在打包器302中执行一些指令或命令。从数据段生成的新数据包传递至下一阶段时,可通过控制和状态寄存器340将其他命令或指令传递至下一控制队列342。
当各阶段执行各自的数据包时,每个流水线阶段抽取合适的命令或指令,来将数据包传输至写入流水线106,同时将相应的命令与指令载入到控制队列342。类似的,当各自的数据包在相应流水线阶段执行时,用于从读入数据流水线108请求数据包的命令或指令被载入到控制队列342,同时每一个流水线阶段抽取相应的命令或指令。本领域的技术人员应当了解控制和状态寄存器340以及控制队列342的其他特征和功能。
该固态存储控制器104和/或固态存储设备102还可包括内存库交错控制器344、同步缓冲区346、存储总线控制器348和复用器(“MUX”)350。
配置存储单元
图3B所示为固态存储控制器104的另一个实施例301的示意性框图。在所示实施例301中,固态存储控制器104包括设备因素模块354、反向偏置模块332、ECC解码器322以及配置模块352。虽未在图3B中示出,但图3B所示实施例中的固态存储控制器104在某些实施例中也可包括来自如上所述的在图3A中示出的固态存储控制器104的一个或多个附加模块或者其他元件。
在所示实施例301中,配置模块352接收来自反向偏置模块332、ECC解码器322和设备因素模块354的输入,并且配置模块352基于输入确定配置参数调整358。在其他实施例中,配置模块352可接收仅来自反向偏置模块332、仅来自ECC解码器322、仅来自设备因素模块354的输入,或者接收来自反向偏置模块332、ECC解码器322、和/或设备因素模块354的不同组合的输入。
在一个实施例中,反向偏置模块332向配置模块352提供数据集的已知偏置和/或实际读取偏置。反向偏置模块332可提供已知偏置作为基于可逆偏置算法计算的预期偏置,在此算法中,偏置模块318应用于写入固态存储介质110的数据。在某些实施例中,预期偏置可以是精确偏置,其中偏置模块318使用可逆偏置算法将偏置置数据以精确匹配偏置。例如,偏置模块318可添加填充数据到数据集,以便使数据集具有二进制一和二进制零的精确平衡,或者具有类似平衡,同时已知偏置也可为精确的。
在另一个实施例中,反向偏置模块332基于偏置模块318应用于数据的可逆偏置算法可将预期偏置提供为一个范围、一个分布、一个平均值、一个估值等。例如,因反向偏置模块332将反向偏置算法应用于从固态存储介质110读取的数据,反向偏置模块332可测量或获悉随时间变化的预期偏置。在一个实施例中,预期偏置可以是采用数学或者其他方式从偏置模块318的可逆偏置算法中得到,该可逆偏置算法是可能或可行偏置的范围或分布。
例如,如果偏置模块318将数据偏置至一半二进制一和一半二进制零的平衡,该平衡也可称为直流(“DC”)平衡,偏置数据的实际偏置范围可以在大约百分之四十六二进制一到百分之五十四二进制一之间,或者类似范围内。在其他实施例中,数据集的已知偏置和读取偏置也可以基于多位符号或位模式,而不只基于单个二进制一和零等。虽然在已示出的实施例301中,反向偏置模块332为配置模块352提供输入,但是在某些实施例中,偏置模块318可为配置模块352提供预期偏置作为已知偏置,而该已知偏置可以硬编码或编程到配置模块352等。
在一个实施例中,反向偏置模块332提供了从固态存储介质110读取的数据集的读取偏置到配置模块352。例如,因反向偏置模块332通过颠倒偏置模块318的偏置过程将偏置数据包或其他数据集转换回它们的原始源代码形式,反向偏置模块332可确定、测量或检测数据包或其他数据集的读取偏置。反向偏置模块332可根据使用的偏置过程,在颠倒偏置过程之前、期间和之后确定读取偏置。在某些实施例中,如果反向偏置模块332确定数据集的读取偏置与数据集的已知/预期偏置有偏差,那么反向偏置模块332可向配置模块352提供数据集,作出配置参数调整358,以调整数据集存储单元,使数据集可重新读取。在其他实施例中,如以上参照图3A所述,配置模块352可在反向偏置模块332接收数据集前调整数据集的读取电压阈值。本领域的技术人员按照本说明书,将认识到配置模块352、反向偏置模块332和ECC解码器322的其他布置方式,并且每个布置方式均在本发明范围内。
在一个实施例中,ECC解码器322为配置模块352提供数据集的已知偏置和/或读取偏置。ECC解码器322可为具有位纠正状态的数据集提供数据集的已知偏置。例如,一旦ECC解码器322已经纠正数据集中一个或多个可纠正的位错误,那么ECC解码器322可向配置模块352提供数据集的位的已纠正错误状态作为已知偏置,根据该已知偏置,将数据集写入固态存储介质110。在另外的实施例中,ECC解码器322可为数据集提供读取偏置作为错误偏置,该错误偏置指示当数据集从固态存储介质110读取时,数据集中处于错误状态的一个或多个位。
因为对于可纠正的错误,ECC解码器322可以确定数据集位(已知偏置)的精确、原始的、正确的值,并且确定数据集中处于错误状态的位(错误偏置)的精确位置,配置模块352可确定数据集对于已知偏置的精确偏差。为此,在某些实施例中,配置模块352可使用来自ECC解码器322的已知偏置和错误偏置(可用时)作出更多精确的配置参数调整358,而不使用来自反向偏置模块332的预期偏置和读取偏置。
在一个实施例中,配置模块352响应于数据集中一个或多个可纠正的位错误而使用来自ECC解码器322的数据集的已知偏置和/或错误偏置。在另外的实施例中,配置模块352使用基于可逆偏置算法的预期偏置作为已知偏置。在某些实施例中,预期偏置响应于数据集中一个或多个不可纠正的位错误而用作已知偏置。因为不可纠正的位错误状态使偏置未定义,来自ECC解码器322的错误偏置作为不可纠正的位错误可能不可用于配置模块352。在某些实施例中,对于数据集中不可纠正的位错误,因这些错误更严重,数据集的读取偏置与数据集的已知预期偏置的偏差可能大于与可纠正位错误的已知预期偏置的偏差。由于数据集的读取偏置与不可纠正位错误的数据集的已知预期偏置之间的偏差更大,来自反向偏置模块332的偏置信息可为不可纠正的位错误提供好于可纠正位错误的配置参数调整358的方向指示器。
在一个实施例中,设备因素模块354为配置模块352提供给固态存储设备102的一个或多个统计数据。在某些实施例中,配置模块352可基于一个或多个统计数据作出配置参数调整358,可为来自反向偏置模块332和/或ECC解码器322的信息补充一个或多个统计数据等。在一个实施例中,固态存储设备102的一个或多个统计数据包括可能影响固态存储设备102存储单元读取电压的统计数据。例如,在某些实施例中,一个或多个统计数据可包括固态存储设备102的温度、固态存储设备102的错误率(如不可纠正位错误率“UBER”等)、固态存储设备102的擦除循环计数、固态存储设备102的存储请求延迟(如平均值、最大值或其他存储请求执行延迟)、固态存储设备102的老化、和/或其他统计数据或特性。
在所示实施例301中,设备因素模块354接收来自一个或多个传感器356的输入。一个或多个传感器356各自检测固态存储设备102的统计数据或特性,例如温度、湿度、移动和/或其他统计数据。例如,在多个实施例中,一个或多个传感器356可包括固态存储设备102的温度传感器、湿度传感器、加速计和/或另一类型的传感器。在一个实施例中,设备因素模块354和/或配置模块352可接收来自一个或多个其他模块或元件的固态存储设备102的一个或多个统计数据。例如,设备因素模块354和/或配置模块352可接收来自ECC解码器322的固态存储设备102的错误率,例如UBER等。
在多个实施例中,配置模块352可将配置参数调整358建立在来自反向偏置模块332、ECC解码器322和/或设备因素模块354的单个输入或输入组合的基础上。在某些实施例中,来自反向偏置模块332、ECC解码器322和/或设备因素模块354的一个或多个输入可能不可用于数据集。例如,ECC解码器322可能不会为具有不可纠正位错误的数据集提供错误偏置和已知偏置,当反向偏置模块332确定预期偏置时在其学习期间,反向偏置模块332可能不会为数据集提供已知的预期偏置或读取偏置,设备因素模块354可能不会在初始启动期间提供一个或多个统计数据等。
在一个实施例中,配置模块352依照预定的输入层级或等级,将配置参数调整358建立在最佳的可用输入的基础上。例如,配置模块352可将配置参数调整358建立在来自ECC解码器322的已知偏置和错误偏置(如可用)的基础上;如果来自ECC解码器322的输入不可用,则建立在来自反向偏置模块332的已知的预期偏置和读取偏置的基础上;如果来自ECC解码器322和反向偏置模块332的输入均不可用,则建立在来自设备因素模块354的一个或多个统计数据的基础上。
在另外的实施例中,如果来自反向偏置模块332、ECC解码器322和设备因素模块354之中每一者的输入不可用,配置模块352响应于数据错误等可作出随机配置参数调整358。例如,配置模块352可尝试一个方向上的配置参数调整358,重新读取数据集并检查错误,如果错误持续存在,则尝试另一方向上的配置参数调整358。
在另一实施例中,配置模块352可通过合并来自反向偏置模块332、ECC解码器322和/或设备因素模块354的输入,将配置参数调整358建立在多个输入的基础上。配置模块352可缩放输入、加权输入、将输入转换为常用单位等以方便输入的组合。例如,在一个实施例中,配置模块352可将每一个输入转换成单个初始阈值调整量,然后对初始阈值调整量求和,以提供配置参数调整358。在该例中,配置模块352可以基于预定的相关输入的层级或等级加权每一个初始阈值调整量。例如,如果来自ECC解码器322的已知偏置和错误偏置指示一个方向上的配置参数调整358,并且来自反向偏置模块332的已知的预期偏置和读取偏置指示另一方向上的配置参数调整358,在预定的层级或等级中具有更大权重或优先级的输入将指示配置参数调整358的方向。
图4为示出了配置模块352的一个实施例的示意性框图。在所示实施例中,配置模块352包括数据集读取模块402、偏差模块404、方向模块406、调整模块408、持久性模块410、ECC模块412、分配模块414、数据集源模块422、主动配置模块424以及写入电压模块416。写入电压模块416可与配置模块352集成,或者与配置模块352分离。如以上参照图3A和图3B的配置模块352所述的,配置模块352可以是写入数据流水线106的一部分、读取数据流水线108的一部分、固态存储介质110的一部分等,使得配置模块352可调整固态存储介质110一个或多个存储单元的读取电压阈值和/或另一配置参数。虽然具体实施例通过使用读取电压阈值作为示例性配置参数的方式进行描述,配置模块352可以通过同样的方式确定并调整其他配置参数。
在一个实施例中,配置模块352通过使用主动配置模块424,以开环模型主动地设置配置参数。在另一个实施例中,配置模块352通过使用数据集读取模块402、偏差模块404、方向模块406和/或调整模块408,以闭环模型被动地设置配置参数。在某些实施例中,配置模块352可对配置参数进行数层或数个阶段的调整,通过使用主动配置模块424主动地确定配置参数,并在数据集读取模块402从固态存储介质110中读取数据集时被动地调整配置参数。
在一个实施例中,数据集读取模块402从固态存储介质110的存储单元中读取数据集。数据集读取模块402可以从固态存储介质110中直接或间接读取数据集。例如,在一个实施例中,数据集读取模块402可以从读取数据流水线108、固态存储介质110等中的另一模块或元件中接收数据集。
在一个实施例中,数据集读取模块402响应于测试操作而读取数据集,数据集可以是作为测试操作一部分读取的样本数据集。在另外的实施例中,数据集读取模块402响应于客户端发出的读取请求而读取数据集,并且数据集可以是客户端请求的数据集。在一个实施例中,数据集可以是完整的数据包、数据包的一部分等。在另一个实施例中,数据集的大小可以通过测试操作、通过客户端发出的读取请求等进行设定。在另外的实施例中,数据集可以是来自固态存储介质110、与数据包或者其他数据结构无关的原始数据。
在另外的实施例中,数据集最初以已知偏置存储在存储单元中。例如,数据集可以是来自偏置模块318已偏置的数据包,可以是来自处于原始状态的固态存储介质110的存储单元,这些存储单元以例如固态存储介质110的制造商等设定的已知偏置来存储默认数据或编程到固态存储介质110的其他数据。
在一个实施例中,数据集的大小可相对于偏置模块318用于偏置数据包的偏置方案进行调整。例如,在一个实施例中,数据集的大小可以基于确定性序列的周期,例如偏置模块318用于偏置数据包的伪随机二进制序列的周期来进行调整。数据集的大小与伪随机二进制序列的周期的整数倍越接近,所得数据集的偏置就越可能匹配已知偏置。在另外的实施例中,偏置模块318可保证预定大小的数据集具有的偏置与已知偏置的偏差不超过阈值量。阈值量可以在零至给定的整数值或百分比值范围内变化。
如上所述,偏置是在一组用以表示特定数据模式的位元中的位元值的倾向、概率、或趋向。在一个实施例中,已知偏置是二进制一和二进制零在一组位元或数个分组的位元组内的已知比率。在一个实施例中,已知比率可以表示为零和一之间的比例或百分比,其中零比率表示排他性的一个值的偏置,而一比率表示排他性的其他值的偏置。在一个实施例中,已知比率大于零且小于一,说明已知比率为一个排他性二进制值和排他性相反的进制值之间的偏移量。如果已知比率大于零且小于一,数据集的读取偏置中的偏差可在已知比率的任一方向出现,同时仍然可通过配置模块352进行检测。
在所示实施例中,数据集读取模块402包括监控模块418和读取错误模块420。在一个实施例中,数据集读取模块402可以通过使用监控模块418和/或读取错误模块420来读取数据集。
在一个实施例中,监控模块418对响应于计算机112或其他客户端114发出的读取请求而从固态存储介质110读取的数据集进行监控。监控模块418可以响应于存储客户端等发出的命令或指令,按照预定的时间间隔,监控从固态存储介质110读取的每一个数据集,或者选择从固态存储介质110读取的某些数据集。通过使用监控模块418监控从固态存储介质110读取的数据集,配置模块352可动态调整固态存储介质110的读取电压阈值,防止发生不可纠正的数据错误。
在一个实施例中,读取错误模块420响应于数据集中识别出的数据错误而读取数据集。例如,ECC解码器322或另一模块可以确定数据错误是否已经发生。在一个实施例中,数据错误是ECC解码器322没有足够信息进行纠正的不可纠正的位错误。特别地,在一个实施例中,ECC解码器322被配置成检测和纠正数据集中处于错误状态的多达一定数量的位(处于错误状态的位的数量-#BER)。当处于错误状态的位的数量超过#BER时,ECC解码器322可以发出信号通知出现不可纠正的数据错误、不可纠正的位错误等。
因固态存储介质110的一个或多个存储单元中保留的电压电平的偏移,可能出现数据错误。本文中存储单元的保留电压电平称为读取电压电平。在一个实施例中,读取错误模块420读取数据集,作为测试操作一部分。配置模块352响应于数据错误、响应于计划维护操作、响应于初始校准操作等而可执行测试操作。数据错误模块420使用的数据集可以来自客户端请求的数据包,或者可以是作为测试操作一部分读取的样本数据。
在某些实施例中,数据集读取模块402在响应于测试操作而定期或在监控期间等读取样本数据的数据集时,可调整样本数据集的大小,使其处于固态存储介质110的剩余读取带宽范围内。在一个实施例中,通过调整样本数据的大小使其位于固态存储介质110的剩余读取带宽范围内,读取样本数据可能不会影响到用于向固态存储介质110提出读取请求的读取带宽或固态存储介质110的读取通量。在一个实施例中,数据集读取模块402可以从固态存储介质110读取具有比读取请求所要求数据量更大的数据量的数据集,为配置模块352提供更大的位样本以用来确定读取电压阈值的调整等。在某些实施例中,大于所请求数据量的样本大小可提高读取电压阈值调整的精确度。
例如,如果用户应用请求512字节的数据,而固态存储介质110在一个读取请求中可以与512字节数据基本相同的速度读取800字节的数据,在一个实施例中,那么数据集读取模块402可以读取800字节的数据集,以便调整读取电压阈值在,不影响操作的读取时间的前提下,向用户应用提供请求的512字节(800字节数据集的子集)。在一个实施例中,数据集读取模块402设置了最少数据集请求量,即便读取请求是要小于最少数据请求量,也为每个读取请求检索至少具有最少数据集请求量的数据。在某些实施例中,最少数据集请求量可经选择以便位于一个或多个ECC数据块界限内、一页或多页内、一个或多个擦除块内、固态存储介质110的剩余带宽内等。在一个实施例中,最少数据集请求量可基于固态存储介质110、读取数据流水线108等的结构或几何形状进行选择。
在一个实施例中,偏差模块404确定了数据集的读取偏置与数据集初始存储时具有的已知偏置的偏差。当读取偏置与已知偏置存在差异时,数据集的读取偏置与已知偏置有偏差。在一个实施例中,当已知偏置是精确的情况下,例如在已知偏置包括纠错位值或偏置模块318偏向精确偏置的情况下,偏差模块404可以确定读取偏置和已知偏置间的任何差值都包含与已知偏置的偏差。在其他实施例中,已知偏置可包括平均偏置、估计偏置、偏置分布、偏置范围等。在这些实施例中,偏差模块404可以确定在已知偏置分布范围外的读取偏置、远离已知偏置的至少一个预定偏差阈值等与已知偏置有偏差。
在一个实施例中,数据集读取偏置和已知偏置之间的差值可以是二进制一与二进制零比率的差值。在其他实施例中,数据集的偏置和已知偏置之间的差值可以是二进制模式的差值、多位二进制符号的差值等。如以上参照图3B所述的,在多个实施例中,偏差模块404可以接收来自ECC解码器322、来自反向偏置模块332等的数据集的原始的已知偏置和/或读取偏置。
在一个实施例中,偏差模块404通过比较读取偏置和已知偏置来确定数据集的读取偏置是否与已知偏置有偏差。偏差模块404可以通过如下方式比较读取偏置和已知偏置:计算数据集中二进制一的数量和二进制零的数量以便确定数据集中二进制一和二进制零的比率,并且将该比率与已知偏置的比率进行比较。在另外的实施例中,偏差模块404可以搜索和/或计算已知偏置的预期模式或其他预期属性的发生率,并且将数据集中类似搜索和/或计算的结果与预期属性进行比较。在某些实施例中,ECC解码器322通过为配置模块352等提供数据集的错误偏置,向偏差模块404指示数据集的读取偏置与已知偏置有偏差。
在已知偏置包括位模式、多位二进制符号等的实施例中,偏差模块404可以对数据集的位进行转换,可以分析数据集的位子集等,以便确定数据集的读取偏置是否与已知偏置有偏差。例如,偏差模块404可以基于用于固态存储介质110的存储单元的编码类型,例如格雷码编码类型、二进制代码编码类型等,进行转换。在某些实施例中,转换可以基于存储介质110的存储单元的物理和/或电气结构进行。
例如,如下文参照图6C所述的,多级存储单元存储至少一个最高有效位(“MSB”)和一个最低有效位(“LSB”)。在某些实施例中,MSB和LSB尽管属于相同物理多级存储单元的一部分,也可分配至固态存储介质110的不同页。在某些实施例中,多个多级存储单元在固态存储介质110(例如NAND闪存)上组织构成物理页。在某些固态存储介质110中,物理页是可写入固态存储介质110的最小单元。在此类实施例中,多级存储单元可以与页对相关。页对是与单组物理多级存储单元相关联的一对页(较高页和较低页)。例如,多级存储单元可与包括较高页和较低页的页对相关联。较高页可以与MSB相关联,较低页可以与LSB相关联,反之亦然。
因此,在同一多级存储单元中的MSB和LSB可以在存储设备102中具有不同的地址。在某些实施例中,较高页包括多个多级存储单元的MSB,较低页包括同一多级存储单元的LSB。因此,涉及较高页的写入可只造成相关多级存储单元中MSB的改变,而涉及较低页的写入可只造成相关多级存储单元中LSB的改变。
如下文参照图6C所详述的,在某些实施例中,数据集读取模块402可以读取只包括由多级存储单元分组存储的位子集,偏差模块404可基于位子集确定数据集的读取偏置是否与已知偏置有偏差。例如,数据集可以只包括来自LSB(较低页)的数据值,只包括来自MSB(较高页)的值等。在另一个实施例中,偏差模块404可以至少部分基于固态存储介质110使用的编码类型、存储介质110存储单元的物理和/或电气结构等,来确定数据集的读取偏置是否与已知偏置有偏差。在其他实施例中,偏差模块404可以对数据集(该数据集可组合来自不同页的数据以在单个数据集中包括LSB和MSB位)执行转换,从而协调来自不同数据集的LSB和MSB位和/或页等。
在一个实施例中,偏差模块404检测数据集读取模块402读取的每个数据集的读取偏置。例如,如果数据集读取模块402使用监控模块418,随着数据集从固态存储介质110读取,偏差模块404可以定期监控这些数据集的读取偏置。在一个实施例中,监控模块418可以比较由客户端请求的每个数据集的读取偏置。在另外的实施例中,监控模块418可以检查请求数据集的读取偏置,例如每隔一段时间进行检查和/或响应于命令进行检查等。在另一个实施例中,如果数据集读取模块402使用读取错误模块420,偏差模块404则可以响应于数据错误而检查数据集的读取偏置,作为测试操作一部分等。
在一个实施例中,方向模块406确定数据集偏移的方向。在一个实施例中,偏移的方向是数据集读取偏置和已知偏置之间的差值。方向或差值可以表示为数值、符号(即正或负)、关系(即大于、小于)、方向(即上、下)等。在某些实施例中,方向模块406可以基于固态存储介质110的存储单元所用的编码类型、基于存储介质110的存储单元的物理和/或电气结构等,来确定偏移方向。例如,方向模块406可检查数据集中的偏置偏差,以基于存储介质类型(2位MLC、3位MLC、n位MLC)、读取多阶段编程模型的哪页、固态存储介质110的编码类型(例如格雷码编码类型、二进制代码编码类型等)和/或所确定偏差的大小,来确定偏移方向。
在一个实施例中,方向模块406可以通过从数据集读取偏置表示中减去已知偏置的比率、比例或其他表示来确定方向。例如,在一个实施例中,方向模块406可以从数据集中的二进制一、零、多位二进制符号等的比例减去基于已知偏置所预期的二进制一、零、多位二进制符号等的比例。根据是否比较二进制一的比率或是否比较二进制零的比率,以及是否高电压表示二进制一或二进制零,或者根据存储单元的其他具体结构,方向模块406可以反转差值或执行另一转换以便确定方向。
在来自ECC解码器322的错误偏置可用的实施例中,方向模块406可以按照错误偏置的指示,基于处于错误状态的数据集的一个或多个位来确定偏移方向。在其他实施例中,如上文参照图3B所述的,方向模块406可以基于来自反向偏置模块332、ECC解码器322和/或设备因素模块354的输入而合并方向,从而确定偏移方向等。
在一个实施例中,二进制零由低于读取电压阈值的电压表示,二进制一由高于读取电压阈值的电压表示。在一个例子中,存储具有0.5的已知偏置的数据集,表示数据集的预期偏置应为一半二进制一或为直流平衡的。在此例子中,数据集从存储单元读取,并且数据集具有0.7的读取偏置,意味着数据位的百分之七十为二进制一。在一个实施例中,为确定方向,方向模块406从数据集的读取偏置0.7中减去预期偏置0.5,得到方向0.2。方向可以是完整结果(即“0.2”)、结果符号(即“正”)、关系(即“大于”)、方向(即“上”)或者另一表示预期偏置0.5和读取偏置0.7之间差值的指示符。
在另一个例子中,如果数据集的读取偏置为0.3,意味着数据位的百分之三十是二进制一,方向模块406在一个实施例中将从数据集的读取偏置0.3中减去预期偏置0.5,得到差值-0.2。在此例子中,方向可以与第一个例子中相反,即“-0.2”、“负”、“小于”、“下”等。
因为预期偏置是已知的,相对于已知偏置比较读取偏置指示本应满足已知偏置的某些位现在并未满足,这可能是由于数据错误或由于位写入后存储单元内存储的电压电平有变化。此外,确定差值为正或负指示读取电压是否应增加或减少,使得数据集的重新读取将产生与已知偏置相同或接近的读取偏置。在一个实施例中,配置模块352按照与方向模块406指示的方向相同的方向对读取电压电平进行调整。
有利的是,具有关于调整读取电压阈值方向的指示可使识别新的调整后电压电平所需的时间和资源显著减少。如果创建读取电压阈值的方向未知,识别新的读取电压阈值可能要求试误法的劳动和时间密集过程,此时会对不同的可能读取电压阈值进行设置、随后测试并随后按需求进行调整。可能需要此过程来找到可使数据包的重新读取基本匹配已知偏置的读取电压阈值。
在一个实施例中,调整模块408基于方向模块406确定的偏移方向,调整固态存储介质110的存储单元的读取电压阈值。在一个实施例中,调整模块408可以在偏移方向上、远离偏移方向等的方向上对读取电压阈值进行调整。例如,在一个实施例中,方向模块406检测出已知偏置中二进制一多于预期数量时,调整模块408可对此作出响应,从前一读取电压阈值提高读取电压阈值,而在检测出二进制一少于预期数量时,则降低读取电压阈值。虽然相对方向可以基于固态存储介质110的存储单元特性以及采用的存储方案来进行改变,调整模块408可调整读取电压阈值,以校正或补偿由方向模块406确定的差值。
在另外的实施例中,调整模块408基于由方向模块406确定的方向振幅或差值大小,来确定读取电压阈值的调整量。在另一个实施例中,调整模块408可以缩放或以其他方式调整来自方向模块406的振幅,并将读取电压阈值调整到调整量。例如,在一个实施例中,调整模块408可以基于方向振幅,在单次调整中以数个调整水平调整读取电压阈值。在另外的实施例中,调整模块408可基于诸如固态存储介质110的老化、耗损量、使用历史、错误历史或其他方面等附加因素,来选择读取电压阈值的调整量。如上文参照图3B所述的,在某些实施例中,调整模块408可基于配置模块352从设备因素模块354中接收到的、固态存储设备102的一个或多个统计数据,来作出读取电压阈值调整。
在另一个实施例中,调整模块408使用搜索算法,基于偏移方向来确定读取电压阈值。例如,从当前读取电压阈值偏移的方向上的电压范围可以是搜索算法的搜索空间。在一个实施例中,调整模块408可以使用线性搜索、二分搜索等来确定读取电压阈值。为检查作为搜索算法一部分的每一个步骤,数据集读取模块402可以响应于每一次调整而重新读取数据集,并且偏差模块404可以重新确定是否重新读取数据集的读取偏置与已知偏置有偏差。方向模块406可以重新确定重新读取数据集的偏移方向,以便进行进一步的搜索。调整模块408可以基于重新确定的偏移方向,反复重新调整读取电压阈值,直到偏差模块404确定重新读取的数据集的读取偏置与已知偏置无偏差,或者直到每个读取电压阈值电平已经得到测试,和/或直到数据集可使用ECC校验位等进行校正。
在一个实施例中,一旦重试阈值已满足,调整模块408就停止读取电压阈值的重新调整。例如,如果ECC解码器322不能校正数据错误和/或如果数据集的重试阈值已满足时数据集的读取偏置继续从已知偏置偏移,那么调整模块408可以停止对读取电压阈值进行调整。重试阈值可以基于一组可能的读取电压阈值电平等进行选择。在一个实施例中,重试阈值设置调整模块408可以调整读取电压阈值的次数。在另一个实施例中,重试阈值可以设置调整模块408可进行读取电压阈值调整的时间量。在某些实施例中,重试阈值满足时,固态存储控制器104可对此作出响应,采取进一步的补救措施,例如使与数据集相关联的存储单元停止工作、逻辑替换与数据集相关联的存储单元等。
在一个实施例中,即使偏差模块404确定数据集的读取偏置与已知偏置有偏差、数据错误已经发生、重试阈值未能满足等,调整模块408也不会调整读取电压阈值。在某些实施例中,调整模块408可以基于与存储单元组的调整相关的一个或多个风险因素,选择性地调整读取电压阈值。例如,风险因素可以包括存储单元组的错误率(例如UBER等)、存储单元组的擦除循环计数、存储单元组的存储请求延迟(例如平均值、最大值或其他存储请求执行延迟)、存储单元组的老化、存储单元组的读取电压阈值的先前调整次数、和/或其他潜在风险因素。在一个实施例中,一个或多个风险因素满足风险阈值时,调整模块408可对此作出响应,取消或延缓读取电压阈值的调整。在另外的实施例中,一个或多个风险因素满足风险阈值时,固态存储控制器104可对此作出响应,采取进一步的补救措施。
在一个实施例中,调整模块408使用由固态存储介质110的制造商提供的程序或命令,对读取电压阈值进行调整。例如,在一个实施例中,调整模块408可以通过如下方式调整读取电压阈值:在固态存储介质110的设置寄存器中写入值,发送读取电压阈值参数到固态存储介质110,或以其他方式将读取电压阈值的调整传送给固态存储介质110。调整模块408可以读取电压阈值的绝对值、读取电压阈值的调整量等形式传送调整。在另外的实施例中,固态存储介质110提供读取电压阈值可以调整到的多个离散电平(即2和15之间的不同电平)。在其他实施例中,读取电压阈值调整的量级可以由固态存储介质110的制造商或供应商定义或推荐。
在一个实施例中,调整模块408单独调整固态存储介质110的管芯、芯片、PEB或其他离散段的读取电压阈值。在另外的实施例中,调整模块408为每个存储单元调整多个读取电压阈值。例如,在一个实施例中,固态存储介质110的存储单元为MLC存储单元,每个单元具有多个读取电压阈值(即一个2位MLC存储单元可以具有三个不同的读取电压阈值)。调整模块408可以将多个读取电压阈值中的每个一起移动,或者单个地移动它们。
在存储单元具有多个读取电压阈值的实施例中,每个读取电压阈值以一定的间距分隔。在一个实施例中,各读取电压阈值之间的间隔是一致的。在另外的实施例中,调整模块408使用单一命令或程序对多个读取电压阈值进行调整,并且多个读取电压阈值之间的间隔根据调整量进行缩放。例如,在一个实施例中,读取电压阈值之间的间隔可以在读取电压阈值更高时增大,并在读取电压阈值更低时减小。在一个实施例中,根据调整量缩放读取电压阈值间的间隔,使读取电压阈值分布更均匀,因此范围端点处电压的范围并未缩小或扩大,同时中间范围保持不变。
在一个实施例中,持久性模块410存储读取电压阈值的状态。在一个实施例中,持久性模块410是固态存储控制器104的一部分。在另一个实施例中,持久性模块410可以随着每一次读取操作,将读取电压阈值发送到固态存储介质110。在另外的实施例中,持久性模块410是固态存储介质110的一部分,可使固态存储介质110保持调整模块408作出的读取电压阈值调整。在一个实施例中,持久性模块410存储多个读取电压阈值,每个读取电压阈值针对固态存储介质110的存储单元不同段或不同分组。
在一个实施例中,固态存储介质110的制造商提供命令或程序,以便调整预定存储单元组(例如芯片、物理擦除块、物理页或管芯)的读取电压阈值。在另外的实施例中,持久性模块410存储小于预定存储单元组的存储单元子分组的读取电压阈值,调整模块408可以使用制造商提供的命令或程序对该读取电压阈值进行调整。在另一个实施例中,当从基于持久性模块410存储的读取电压阈值的子分组读取数据集时,调整模块408则可以重新调整读取电压阈值。子分组的例子可以包括PEB、页、ECC数据块、或存储单元组的其他物理或逻辑分区。
例如,响应于存储单元第一子分组中数据集的读取请求,调整模块408可以将整个存储单元组的读取电压阈值调整到持久性模块410为第一子分组存储的电平。在一个实施例中,响应于第二子分组中数据集的读取请求,调整模块408可以将整个分组的读取电压阈值重新调整到持久性模块410为第二子分组存储的电平。这使配置模块352可以在相比固态存储介质110可用的命令或程序中所提供的范围更精细的范围内对固态存储介质110的读取电压阈值进行调整。例如,制造商可以提供用于调整管芯、芯片或其他存储单元组的读取电压阈值的命令、程序或方法,调整模块408可以依照上述命令、程序或方法调整单个PEB或其他子分组的读取电压阈值。
在一个实施例中,配置模块352响应于上述不可纠正的(在本文中指ECC解码器322不可纠正的,如本文所讨论,在读取电压阈值调整后可能进行纠正)数据错误而处理数据集,并且一次或多次调整读取电压阈值,直到数据错误不再不可纠正,并可使用数据集ECC校验位进行修复为止。在一个实施例中,ECC模块412与ECC解码器322协作,确定ECC解码器322是否可以纠正数据集中的错误。或者,配置模块352与ECC解码器322协作,确定ECC解码器322是否可以纠正数据集中的错误。
在一个实施例中,配置模块352重复上文所述的处理步骤,直到ECC模块412确定ECC解码器322可以纠正错误为止。例如,在另外的实施例中,数据集读取模块402、偏差模块404、方向模块406和调整模块408可以重复读取数据集,确定数据集的读取偏置与已知偏置的偏差,确定数据集的偏移方向,并且如上文所述调整读取电压阈值,直到ECC模块412确定ECC解码器322可以纠正错误为止。
如参照图6A和6B详细描述的,在一个实施例中,数据集可以跨越数个管芯、芯片、通道、存储元件、PEB或其他存储单元组进行存储。在一个实施例中,ECC校验位可以针对每个存储单元组进行独立计算和存储。在另一个实施例中,ECC校验位与每个存储单元组存储在一起,例如,存储为ECC数据块的一部分。
在另外的实施例中,ECC模块412使用ECC校验位,确定在固态存储介质110的哪个管芯、芯片、通道、存储元件、PEB或其他存储单元组中发生了不可纠正的错误。在一个实施例中,ECC模块412使用ECC校验位验证每个存储单元组的数据集,以便确定一组存储单元组中具体哪个组出现了不可纠正的错误。在一个实施例中,配置模块352调整出现不可纠正错误的具体存储单元组中的一个或多个读取电压阈值。
在一个实施例中,分配模块414确定数据集的读取偏置在已知偏置的预期分布范围内,不应进行额外的读取电压阈值调整。在另外的实施例中,数据集读取模块402、偏差模块404、方向模块406和调整模块408继续使用新的读取电压阈值重新读取数据集,重新确定数据集的读取偏置与已知偏置的偏差,重新确定数据集的偏移方向,并重新调整读取电压阈值,直到分配模块414确定数据集的读取偏置在预期分布范围内。
在一个实施例中,分配模块414可以与偏差模块404协作或集成。在一个实施例中,配置模块352使用ECC模块412或分配模块414来确定读取电压阈值应进行调整或完成调整的时间。在另外的实施例中,分配模块414将来自数个管芯、芯片、通道、存储元件、PEB或固态存储介质110其他存储单元组的数据集的读取偏置与已知偏置分布进行比较,以便确定在哪个存储单元组中发生了错误,同时配置模块352调整出现错误的存储单元组的一个或多个读取电压阈值。
在一个实施例中,ECC模块412和/或分配模块414与数据集源模块422协作。在一个实施例中,数据集源模块422确定从哪个具体存储单元组读取数据集。例如,数据集源模块422可以确定哪个管芯、芯片、通道、存储元件、PEB或其他存储单元组是数据集源。在一个实施例中,偏差模块404、ECC模块412和/或分配模块414确定数据集具有与已知偏置有偏差的读取偏移、具有数据错误等时,数据集源模块422对此作出响应,确定从哪个具体存储单元组读取数据。
在一个实施例中,数据集源模块422基于数据集序列内的数据集位置,确定从哪个具体存储单元组读取数据集。例如,在一个实施例中,固态存储介质110可以具有多个存储单元组,每个存储单元组可以在读取操作期间并行读取。在一个实施例中,数据集源模块422可以使用关于写入数据流水线106和/或读取数据流水线108如何处理数据的已知信息,以及关于多个存储单元组的已知信息,来确定从哪个存储单元组读取数据集。
例如,在一个实施例中,写入数据流水线106和读取数据流水线108可以各自具有64位(8字节)的数据路径,固态存储介质110可具有24管芯宽的阵列,并且在读取操作期间,可从24管芯中的每一个并行读取8字节,每次读取操作总共读取192字节。基于该信息,在一个实施例中,数据集源模块422可基于192字节范围内8字节数据集的位置来确定从哪个管芯或其他存储单元组读取数据集。
在另外的实施例中,数据集源模块422可以计算或以其他方式追踪作为读取操作一部分所处理的数据集数量,以便确定数据集序列中数据集的位置。例如,8字节可以在24管芯中从第一管芯开始顺序进行读取,因此如果ECC模块412和/或分配模块414对第五个8字节数据集的操作期间,检测出读取偏置偏差或数据错误,那么数据集源模块422识别出该8字节数据集来自24管芯中的第五管芯。
在一个实施例中,通过使用数据集序列中的数据集位置和其他已知信息,数据集源模块422无需使用标识符或其他外部信息,即可确定从中读取数据集的存储单元组。通过识别管芯、芯片、通道、PEB或其他呈现读取偏置差值的存储单元组,可快速执行补救措施,例如更改读取电压阈值、使用预留分组对存储单元组进行逻辑调换、或其他形式的补救措施。
在一个实施例中,主动配置模块424通过主动设置和调整固态存储介质110存储单元的配置参数,提高了固态存储介质110的实用性。通过在错误出现前主动确定配置参数,主动配置模块424避免了某些错误的发生,而在重试读取或执行其他补救措施使错误得以避免的过程中没有出现性能损失。在某些实施例中,主动配置模块424优化了固态存储设备102的用例的配置参数,以优化该用例的存储单元,而非使用默认参数。
如上文所述,配置参数是可通过接口进行修改的一组存储单元的参数,例如读取阈值、写入或编程阈值、擦除阈值等。用于修改配置参数的接口可以包括可编程数据寄存器、固态存储介质110的控制总线的命令接口、固态存储设备102的设备驱动器的API、固态存储控制器104的控制参数等。
主动配置模块424引用一组存储单元的一个或多个存储介质特性,以确定该存储单元组的配置参数。存储介质特性是与固态存储介质110属性相关的统计数据、启发式数值或者其他描述符号。一组存储单元的存储介质特性可以是基本上静态的,或者可以是动态且随时间变化的。在一个实施例中,存储介质特性包括或涉及固态存储设备102和/或固态存储介质110的制造、模型、制造商、产品版本等。在另一个实施例中,存储介质特性描述了一组特定存储单元的属性或统计数据,例如存储单元组的编程/擦除循环计数、存储单元组的读取计数、从存储单元组的前一次写入以来的保持时间、存储单元组的错误统计等。在另外的实施例中,存储介质特性可以包括或涉及固态存储设备102和/或固态存储介质110的环境条件或应用,例如温度、用例(如高速缓存用例、档案用例、服务器用例、企业用例、消费者用例等)等。
响应于存储单元组的配置参数的确定,主动配置模块424配置存储单元组,以使用所确定的配置参数。主动配置模块424可以周期性更新存储单元组的存储介质特性,更新存储单元组的配置参数,并且重新配置存储单元组以使用已更新的配置参数。存储单元组的后台扫描表明存储介质特性已变化等时,主动配置模块424可对此作出响应,在输入/输出操作执行期间、启动期间,使用配置参数配置存储单元。
在某些实施例中,主动配置模块424以独立于上述调整模块408所做调整的方式对存储单元进行配置。例如,主动配置模块424可以与配置模块352分离,主动配置模块424可以是不具有配置模块352等的存储控制器104的一部分。在其他实施例中,调整模块408和主动配置模块424可以协作。例如,调整模块408可以对一个或多个由主动配置模块424使用开环模型等进行设置的配置参数进行基于闭环反馈的调整。
在一个实施例中,写入电压模块416设置写入电压电平,以便对固态存储介质110的存储单元写入数据。写入电压电平是指定了用于编程或更改存储单元状态的最小或最大电压的编程电压,是递增步长脉冲编程操作的步长量级,是递增步长脉冲编程操作的最大迭代次数,是程序操作的程序验证阈值,是递增步长脉冲编程操作的初始偏置等。在一个实施例中,写入电压模块416可以与配置模块352和/或主动配置模块424集成。
例如,对于NAND闪存固态存储,写入电压和/或其他程序相关的配置参数,将存储单元的状态从二进制一更改为二进制零。在一个实施例中,写入电压模块416将已知模式写入存储单元,然后将该模式读取回来,以确定读取电压阈值,再调整写入阈值,直到满足所需的读取阈值。在另外的实施例中,写入电压模块416基于数学模型调整写入电压电平,该数学模型基于与存储单元老化有关的存储单元耐久性和数据保持要求来指定写入电压电平值。在一个实施例中,存储单元的老化依照编程和擦除循环进行计算。在一个实施例中,写入电压模块416对一个或多个存储单元执行测试写入,检测至少一个存储单元的读取电压,并且调整写入电压电平,直到读取电压达到阈值。在另外的实施例中,写入电压模块416通过将具有已知偏置的数据集写入存储单元,来执行测试写入,并且通过确定读取数据集的读取偏置是否与已知偏置有偏差,来测试读取电压。
在一个实施例中,写入电压模块416可以从最小写入电压开始,然后增加写入电压,直到读取电压达到阈值。在另外的实施例中,写入电压模块416可以从最大写入电压开始,然后降低写入电压,直到读取电压达到阈值。在一个实施例中,写入电压模块416可以选择特定的写入电压电平,使存储单元的编程时间与存储单元的所需耐久性和/或数据保持达到平衡。
主动配置
图5示出了主动配置模块424的一个实施例。在某些实施例中,主动配置模块424可以基本上类似于上文中结合图4所述的主动配置模块424。在所示实施例中,主动配置模块424包括介质特性模块502、配置参数模块504、存储单元配置模块506、特性更新模块508、配置更新模块510和自适应配置模块512。介质特性模块502、配置参数模块504、存储单元配置模块、特性更新模块508、配置更新模块510和自适应配置模块512可以是安装在计算机112或另一个主机设备上的固态存储设备102的设备驱动器的一部分和/或固态存储设备硬件的一部分,例如FPGA、ASIC的固件等。
在一个实施例中,介质特性模块502引用固态存储介质110的一组存储单元的一种或多种存储介质特性。介质特性模块502可以确定自身的一种或多种存储介质特性,可以从另一个模块接收存储介质特性,可以在存储介质特性库中检索存储介质特性,诸如此类。如上所述,存储介质特性是与固态存储介质110的属性相关的统计数据、启发式数值或其他描述符。存储介质特性可包括和/或涉及固态存储设备102和/或固态存储介质110的构造、型号、制造商、产品版本等;一组存储单元的属性或统计数据;固态存储设备102和/或固态存储介质110的环境条件或用例;和/或固态存储介质110的属性的另一个统计数据、启发式数值或其他描述符。
一组存储单元的存储介质特性会影响或告知该组存储单元的配置参数的确定。在一个实施例中,存储介质特性包括一组存储单元的编程/擦除循环计数。在另一个实施例中,存储介质特性包括一组存储单元的读取计数。在另一个实施例中,存储介质特性包括一组存储单元自上次写入后的保持时间。在另一个实施例中,存储介质特性包括一组存储单元的温度。在某些实施例中,存储介质特性包括一组存储单元的用例。在另一个实施例中,存储介质特性包括一组存储单元的错误统计,例如UBER等。在另一个实施例中,存储介质特性可包括一组存储单元之前的或历史的配置参数、其他存储单元组的配置参数或存储介质特性等。
在某些实施例中,介质特性模块502管理存储介质特性的收集和/或维护。介质特性模块502可以维护存储介质特性库中的存储介质特性和/或从存储介质特性库中检索存储介质特性。存储介质特性库的一个例子将在下文中结合图7A和7B进行更详细的描述。在某些实施例中,介质特性模块502引用、确定和/或管理若干不同存储单元组的存储介质特性,例如固态存储设备102的每个存储介质区域或存储介质分区。存储介质区域可包括擦除块(逻辑的或物理的)、页、逻辑页、ECC数据块、页内分区、管芯、管芯平面、芯片等。
在一个实施例中,介质特性模块502可以类似于上文结合图3B所述的设备因素模块354,可以与其一起运行,和/或可以与其整合。例如,存储介质特性可包括上文中结合设备因素模块354所述的统计数据中的一者或多者,例如固态存储设备102的温度、固态存储设备102的错误率(例如无法纠正的位错误率UBER等)、固态存储设备102的擦除循环计数、固态存储设备102的存储请求延迟(例如平均值、最大值或其他存储请求执行延迟)、固态存储设备102的老化,和/或其他统计数据或特性。在某些实施例中,介质特性模块502可以直接或间接地从一个或多个传感器356、从其他模块或元件(如ECC解码器322)接收输入,诸如此类。
在一个实施例中,配置参数模块504根据一组存储单元的介质特性模块502的一个或多个存储介质特性确定该组存储单元的配置参数。如上所述,配置参数是可通过接口修改的一组存储单元的参数。配置参数可以涉及写入或编程存储单元、从存储单元读取、擦除存储单元,和/或存储单元的其他参数。配置参数模块504可以将配置参数确定为绝对数据值、确定为数据值的偏移量或调整量、或确定为存储单元配置模块506可用于配置一组存储单元的其他参数,所述如下。
用于从存储单元进行读取的配置参数的一个实施例是读取阈值,例如读取电压阈值、电阻率阈值等。用于写入/编程存储单元的配置参数的多个实施例包括递增步长脉冲编程操作的步长量级、递增步长脉冲编程操作的最大迭代次数、程序操作的程序验证阈值、递增步长脉冲编程操作的初始偏置等。在某些实施例中,用于擦除存储单元的配置参数可包括递增步长脉冲擦除操作的步长量级、递增步长脉冲擦除操作的最大迭代次数、擦除操作的擦除验证阈值、递增步长脉冲擦除操作的初始偏置等。按照本说明书,本领域的技术人员将会了解可通过接口修改的存储单元的其他配置参数。
配置参数模块504可以通过以下方法使配置参数基于一个或多个存储介质特性:将一个或多个存储介质特性输入方程、查找表(“LUT”)、矩阵等中;在一个或多个存储介质特性上执行预定转换或操作;或者引用和/或使用该一个或多个存储介质特性,以确定配置参数。配置参数方程、查找表、矩阵等可以基于经验数据,例如测试数据、历史数据等等。在一个实施例中,设计工程师等可以测试具有多个存储介质特性的多组存储单元,例如来自多个制造商的固态存储介质等,并确定具有多个存储介质特性的存储单元的最佳配置参数。例如,方程、查找表、矩阵等可以表明,来自制造商X的固态存储介质110在1,000个编程/擦除循环后往往具有单元值自然漂移量Y,使得可以通过将读取阈值增大Z伏特进行补偿,诸如此类。
在一个实施例中,一组存储单元的存储介质特性包括温度。一组存储单元的温度可以影响该组存储单元上的一个或多个其他存储介质特性的效应速度。例如,在较高温度下,与错误统计相关的存储介质特性的变化速率(例如原始位错误率(RBER)和数据保持时间)会增加,对配置参数的某些调整会减轻影响。在某些实施例中,配置参数模块504可以根据温度来调整或缩放配置参数、存储介质特性等,以补偿温度的影响,为温度规范数据。一组存储单元的温度可以是平均温度、滑动窗口上的温度、当前温度、固态存储设备102的温度或与一组或多组存储单元相关的其他温度量度。
在一个实施例中,一个或多个存储介质特性可为配置参数模块504表明配置参数的趋势、优化等,并且配置参数模块504确定满足该趋势或优化的配置参数。例如,编程/擦除循环计数、读取计数、UBER的大小或另一个存储介质特性可以表明读取电压已漂移的量,配置参数模块504可根据存储介质特性主动确定读取电压阈值或其他配置参数,无需来自存储单元的直接反馈,例如读取、读取重试等。
在一个实施例中,配置参数模块504维护配置参数库中固态存储介质110的不同存储区域或存储分区的多组存储单元的配置参数。配置参数库的一个例子将在下文中结合图8A和8B进行更详细的描述。通过确定和管理不同存储区域的单独的存储介质特性和/或配置参数,在某些实施例中,主动配置模块424可以为每个存储区域单独定制配置参数,从而通过减少错误、延长固态存储介质110的使用寿命等提高固态存储介质110的实用性。
在某些实施例中,配置参数模块504可根据目标存储单元组确定一组存储单元的配置参数。目标存储单元组可以具有已知的和/或受控的使用特性(如存储介质特性等),配置参数模块504可以通过此使用特性确定另一组存储单元的配置参数。具体地讲,配置参数模块504可以将目标存储单元组的存储介质特性与所配置的一组存储单元的存储介质特性进行比较。此类比较可用于进一步优化一组存储单元的已确定配置参数。目标存储单元组可以存储已知的数据,例如元数据、系统数据、已知数据模式等,并且配置参数模块504可以根据已知的数据确定另一组数据的配置参数。
在另一个实施例中,配置参数模块504根据目标存储单元组的已确定配置参数、根据目标存储单元组的一个或多个存储介质特性等确定一组存储单元的配置参数。例如,配置参数模块504可以将目标存储单元组的配置参数用作另一组存储单元的配置参数,可以调整目标存储单元组的配置参数以用于确定另一组存储单元的配置参数,可以用目标存储单元组的存储介质特性确定另一组存储单元的配置参数,诸如此类。这样,目标存储单元组充当用于管理其他存储单元组的对照组。在某些实施例中,在存储设备102的使用期内,目标存储单元组可采用类似于“系统轨迹”用于硬盘驱动技术的方式对配置参数进行修改。在另一个实施例中,配置参数模块504将一组存储单元的一个或多个存储介质特性与目标存储单元组的一个或多个存储介质特性进行比较,并根据存储介质特性之间的差异确定该组存储单元的配置参数。
在某些实施例中,配置参数模块504在目标存储单元组的基础上确定一组存储单元的配置参数来自举配置参数,以响应该组存储单元的已知存储介质特性的缺乏。配置参数模块504可以在启动操作过程中,或是在一组存储单元的存储介质特性尚不可用但目标存储单元组的存储介质特性或其他数据可用的另一种操作过程中,自举该组存储单元的配置参数。例如,存储在固态存储介质110的元数据区域中的元数据可以具有已知的或受控的编程/擦除计数,配置参数模块504可在元数据区域的已知或受控的编程/擦除计数基础上,确定用于存储用户数据的固态存储介质110的区域的配置参数。
在一个实施例中,存储单元配置模块506配置一组存储单元,以便使用配置参数模块504为该组存储单元确定的配置参数。存储单元配置模块506用一组存储单元的接口配置该组存储单元。该接口可包括众所周知的接口或专用接口。配置模块506可以通过设置数据寄存器、通过在固态存储介质110的控制总线的命令接口上发送命令、通过调用固态存储设备102的设备驱动器的API、通过设置固态存储控制器104的控制参数或以其他方式配置该组存储单元,从而对一组存储单元进行配置。存储单元配置模块506可使用特定命令指令、某些命令指令序列和/或使用特定参数、寄存器设置或其他不同于常规命令(通用命令)的、用来与存储单元组建立接口的命令指令。存储单元配置模块506可接收来自配置参数模块504的配置参数,可从配置参数库中检索配置参数,诸如此类。
在一个实施例中,存储单元配置模块506将一组存储单元配置为可使用已确定的配置参数以响应触发。在某些实施例中,根据固态存储设备102和/或固态存储介质110的结构选择触发。例如,某些固态存储设备102和/或固态存储介质110可保留多次输入/输出操作过程中的配置参数,而另一个固态存储设备102和/或固态存储介质110可能需要为每次输入/输出操作设置配置参数,诸如此类。在固态存储介质110初始化过程中,存储单元配置模块506动态地使用分发到一组存储单元的每个命令,配置该组存储单元;在固态存储介质110运行期间,为了响应事件或时间间隔,或者为了响应其他的触发等等,存储单元配置模块506也会配置该组存储单元。
在一个实施例中,存储单元配置模块506的触发包括一组存储单元的存储介质特性的变化、该组存储单元的存储介质特性的预定量级的变化等,并且存储单元配置模块506将配置该组存储单元以响应存储介质特性的变化。在另一个实施例中,存储单元配置模块506的触发包括一组存储单元的输入/输出请求,例如读取请求、写入请求、擦除请求等。例如,在某些实施例中,存储单元配置模块506可以将一组存储单元配置为使用读取配置参数以响应该存储单元的读取请求,可以将一组存储单元配置为使用写入配置参数以响应该存储单元的写入请求,可以将一组存储单元配置为使用擦除配置参数以响应擦除请求,诸如此类。
在另一个实施例中,固态存储设备102的启动操作、固态存储设备102的常规关机操作等等是使存储单元配置模块506配置一组或多组存储单元的触发。在某些实施例中,一旦存储单元配置模块506使用配置参数配置一组存储单元以响应启动操作,该组存储单元将在关机操作和后续启动操作等之前保留配置参数。一组存储单元保留配置参数的方式可以有所不同,具体取决于配置参数的类型、该组存储单元的结构等等。
在一个实施例中,特性更新模块508更新一组存储单元的一个或多个存储介质特性以响应该组存储单元的更新事件。更新事件是触发,特性更新模块508为响应该触发而更新存储介质特性。固态存储设备102和/或固态存储介质110的某些存储介质特性(例如构造、型号、制造商、产品版本等)可以大体上是静态的,在某些实施例中,特性更新模块508可能不更新此类存储介质特性,可能会不太频繁地更新此类存储介质特性,诸如此类。而其他存储介质特性(例如编程/擦除循环计数、读取计数、保持时间、温度、用例、错误统计等等)可以是动态的,并可以频繁变化。
在一个实施例中,固态存储介质110的后台扫描可以是更新事件。例如,特性更新模块508可以执行固态存储介质110的后台扫描,并在后台扫描过程中更新存储单元组的存储介质特性的记录以响应存储单元组的扫描。在另一个实施例中,该组存储单元或相邻的一组存储单元的输入/输出请求(例如读取请求、写入请求、擦除请求等)是更新事件,特性更新模块508将更新一组存储单元的存储介质特性以响应该输入/输出请求。在另一个实施例中,特性更新模块508的更新事件可包括固态存储设备102的启动操作和/或关机操作。在某些实施例中,一组存储单元的垃圾收集操作是更新事件。例如,当通过垃圾收集操作恢复一组存储单元的存储容量时,特性更新模块508可更新该组存储单元的存储介质特性,诸如此类。
在一个实施例中,特性更新模块508与介质特性模块502协作,使用介质特性模块502更新存储介质特性,诸如此类。在某些实施例中,特性更新模块508可以更新存储在存储介质特性库中的存储介质特性,如下文结合图7A和7B所详述。
在一个实施例中,配置更新模块510更新一组存储单元的配置参数。在某些实施例中,配置更新模块510更新配置参数以响应与该配置参数相应的一个或多个存储介质特性的变化。特性更新模块508可向配置更新模块510告知特性更新模块508已更新存储介质特性,配置更新模块510可周期性地扫描存储介质特性的变化,配置更新模块510可检查存储介质特性的变化以响应一组存储单元的配置触发,诸如此类。
在某些实施例中,配置更新模块510更新配置参数以响应存储介质特性大于预定变化阈值的变化。在一个实施例中,配置更新模块510与配置参数模块504协作,使用配置参数模块504更新配置参数,诸如此类。在另一个实施例中,配置更新模块510可更新存储在配置参数库中的配置参数,如下文结合图8A和8B所详述。
在一个实施例中,自适应配置模块512动态调整和修改固态存储设备102和/或固态存储介质110的一个或多个配置参数、阈值、管理技术等。在某些实施例中,自适应配置模块512可以在固态存储设备102老化时、固态存储设备102的用例改变时等等情况下进行调整或修改。用例的例子可包括缓存用例、归档用例、服务器用例、企业用例、消费者用例等。
在一个实施例中,自适应配置模块512根据固态存储设备102的先验知识、收集的固态存储设备102的运行时间统计数据、固态存储设备102的存储单元的存储介质特性等进行调整或适应。与磁存储器不同,固态存储的介质属性通常会在存储设备的使用寿命期间发生变化。例如,可周期性地处理固态存储介质110的存储区域以进行存储容量恢复或垃圾收集,从而控制读取干扰的影响,并确保可靠的数据保持。
在固态存储介质110中,当选择并读取存储单元时,在未被选择的相邻的存储单元中可能会发生称为读取干扰的效应,从而引起未被选择的存储单元的浮栅极上的电荷聚集,使未选择的存储单元具有并非有意施加的增高电压。克服读取干扰效应的一种方法是将有效数据从受干扰的单元中移出,同时这些单元中的值仍是可确定的。可将有效数据重新写入新的物理位置,并擦除受干扰的单元,以消除读取干扰效应。此方法称为刷新,刷新操作之间的时间称为数据刷新间隔。读取干扰阈值是在需要采取补救措施减轻读取干扰效应之前相邻单元的读取次数。对于处理存储区域以进行存储容量恢复和/或数据刷新的数据刷新间隔而言,如果数据刷新间隔适合于使用寿命接近终止的固态存储设备102,则该数据刷新频率对于刚开始使用的固态存储设备102而言可能过于激进。
在多个实施例中,自适应配置模块512可以根据固态存储设备102的老化(以绝对时间、通电时间、用户数据写入量等表示)动态地调整或修改数据刷新间隔、根据固态存储设备102的耗损调整或修改读取干扰阈值(即,刷新数据以减轻读取干扰效应之前的读取操作次数)、根据固态存储设备102的老化调整或修改擦除块报废标准、根据主机工作量调整或修改固态存储设备102的垃圾收集方法、根据尽可能减小活动和非活动数据之间的混乱的活动程度调整或修改固态存储设备102的按区域垃圾收集方法、在固态存储设备102老化时调整或修改清理间隔以增加清理次数,诸如此类。
图6A为根据本发明示出了N个存储元件606的阵列600的一个实施例的示意性框图。在所示实施例中,ECC数据块616包含来自若干存储元件606的数据612。在另一个实施例中,ECC数据块616的ECC校验位还存储在若干存储元件606中。
在一个实施例中,存储元件606的阵列600包括N个存储元件606a、606b、606c、...606n。每个存储元件606可包括设备、芯片、芯片的一部分、管芯等。在所示实施例中,存储元件606a-n形成内存库602a。在一个实施例中,阵列600包括若干内存库602a...602m。在所示实施例中,内存库602a-m包括若干通道604a、604b、604c、...、604n。在一个实施例中,数据包或数据集被写入若干通道604a-n中,从每个通道604a-n分别读取数据并重新组装成数据包。在另一个实施例中,ECC数据块616、数据包或数据集被写入若干通道604a-n中,并从所有通道604a-n并行读取数据。内存库602a上的一次读取操作可以读取整个ECC数据块616、数据包或数据集、或重新组装成整个ECC数据块616、数据包或数据集的ECC数据块616、数据包或数据集的一部分。在所示实施例中,每个内存库602中的每个通道包括至少一个存储元件606。
此外,在一个实施例中,每个存储元件606包括物理擦除块或“PEB”608。例如,存储元件1606a包括PEB1608a。物理擦除块通常为位于一个管芯、芯片或其他存储元件606上的擦除块。每个PEB608包括m个物理页610。例如,PEB1608a包括页面0610a页面m614a。每个物理页610a存储数据(“D”)612的一部分和随数据612分布的ECC校验位。
在一个实施例中,一组PEB(PEB1608a-PEBm608m)形成逻辑擦除块(“LEB”)。LEB跨越N个存储元件600的阵列。此外,在一个实施例中,逻辑页(“LP”)跨越行中的多个物理页610。在另一个实施例中,逻辑页跨越N个存储元件606a-n。
在一个实施例中,ECC为分布数据的块码。此外,数据和ECC可以不与任何特定物理硬件边界对齐。因此,用ECC代码进行的错误纠正不取决于特定硬件配置。因此,ECC和相应数据可形成ECC数据块616,ECC数据块可划分并存储在N个存储元件606a-n中的一者或多者上。ECC数据块616通常跨越逻辑页的多个物理页610的至少一部分,其中从数据612a、612b、...612m生成的数据和ECC遍布在N个存储元件606a-n上。在一个实施例中,LP包括多个ECC数据块616。物理页610可包含ECC数据块616的一个或多个数据字节。ECC数据块616可跨越物理页610内的多个行,物理页610可包括多个ECC数据块616。
在所示实施例中,由于ECC数据块616的ECC校验位遍布若干存储元件606a-n和通道604a-n,因此当由于存储元件606a-n中的一者或多者的读取电压变化而发生数据错误时,ECC模块412无法确定哪个存储元件606的错误可通过调整读取电压阈值纠正。在一个实施例中,分配模块414可确定哪个存储元件606或通道604的数据具有在已知偏置的预期分布之外的读取偏置,配置模块352可调整由分配模块414确定的存储元件606的读取电压阈值。
在一个实施例中,偏差模块404、ECC模块412和/或分配模块414确定数据集是否具有错误或偏移已知偏置的读取偏置,数据集源模块422确定从哪个存储元件606读取数据集。例如,在一个实施例中,阵列600可具有24个通道604,在每次读取操作共可读取192个字节的读取操作过程中,可以从单个内存库602的24个存储元件606并行读取8个字节。根据该信息,在一个实施例中,数据集源模块422可以根据192字节内8字节数据集的位置确定从哪个存储元件606读取数据集。在一个实施例中,192字节包括ECC数据块616。
通过将来自每个通道604a-n的数据的读取偏置与已知偏置进行比较,即使不使用ECC校验位,配置模块352也可以纠正由于特定通道的读取电压改变而发生的数据错误。如果不将来自通道604a-n的数据的读取偏置与已知偏置进行比较,调整读取电压阈值将需要大量的试错测试来调整和测试通道604a-n的每个可能组合的每个可能的读取电压阈值调整值。通过将来自通道604a-n的数据的读取偏置与已知偏置进行比较,配置模块352可准确确定要调整哪个通道604。通过确定这些通道的偏差方向,配置模块352还将这些通道的读取电压阈值的搜索范围缩小了一半。
为了阐明合适的调整后读取电压阈值的搜索范围的可能大小,假设ECC数据块616(即ECC码字-包括数据和相应ECC校验位)存储在存储元件606a-606n中。另外,假设存储ECC数据块616的阵列600行中的存储元件606a-606n各自具有可独立调整的读取电压阈值。例如,在一个实施例中,具有η通道604a-n的阵列600的读取电压阈值设置的不同组合数、每个通道可以设置读取电压阈值的级数λ和具有需要调整的读取电压阈值的通道数x由公式1给定:
在一个实施例中,具有最多η个通道604a-n的所有排列的阵列600的读取电压阈值设置的不同组合数由公式2给定:
使用公式1,例如,如果有24个通道606a-n(η=24)、每个通道606具有8个可能的读取电压阈值设置(λ=8),并且24个通道606a-n中只有两个具有需要调整的读取电压阈值(x=2),那么总共有17,644个读取电压阈值设置的不同组合。如果具有需要调整的读取电压阈值的通道606数量增至三个,那么不同组合数将增至1,036,288。配置模块352通过检测哪些通道606a-n具有需要调整的读取电压阈值使这些数量大幅减小。此外,将存储分组中介质上的数据的已知偏置与当前偏置比较可指示调整读取电压阈值的方向。了解读取电压阈值的调整方向可大大缩小在已知具有数据错误的通道中合适电压的搜索范围。
因此,需要尝试的组合数从17,644(其中x=2)变至32,并从1,036,288(其中x=3)变至256,这是因为配置模块352使用已知偏置确定了哪个通道具有需要调整的读取电压阈值以及调整方向。然而,并不需要尝试这些组合中的每一个,因为当以迭代方式进行调整时,已知的数据偏差继续指示进行每次后续调整的方向,每次迭代有可能将搜索范围缩小至少一半。可以用多种搜索算法迅速辨识合适的调整后读取电压阈值。(即,二进制搜索)。
图6B为根据本发明示出了N个存储元件606的阵列650的一个实施例的示意性框图。在所示实施例中,阵列650基本上类似于图6A的阵列600,但ECC数据块652包括单个存储元件606a中的数据612a,而不是横跨若干存储元件606a-n。在一个实施例中,ECC数据块652的ECC校验位存储在单个存储元件606a中。因为每个存储元件606a-n或通道604a-n具有单独的ECC校验位,在一个实施例中,ECC模块412使用单独的ECC校验位确定发生错误的存储元件606a-n或通道604a-n,配置模块352调整由ECC模块412确定的一个或多个特定存储元件606的读取电压阈值。
图6C用示例性编码或编程模型示出了一组多级存储单元的配置参数662a-c的一个实施例,例如MLCNAND闪存存储单元等。示出的编码模型中的任何固有限制不一定适用于所有其他编码模型,不应将本发明理解为固有地包含任何此类限制。在所示实施例中,使用格雷码编码模型对读取电压状态进行编码,其中编码中相邻状态的二进制值相差一个比特位。
图6C示出,值“11”与最低读取电压状态(标记为L0,“擦除”状态)相关,值“01”与次低读取电压状态(标记为L1)相关,值“00”与次高读取电压状态(标记为L2)相关,值“10”与最高读取电压状态(标记为L3)相关。在图6C中,最低读取电压状态L0示出为负电压。本发明所涵盖的读取电压的值、量级、大小等可能随制造商和固态存储单元类型而有所不同。如上所述,在所示实施例中,配置参数662是可区分状态L0、L1、L2和L3的读取电压阈值662。固态存储控制器104将存储在多级存储单元中的四个离散的电压电平解析为表示两个二进制位,一个由单元编码中的最高有效位(MSB)表示,一个由单元编码中的最低有效位(LSB)表示。如上所述,可以使用其他编程和编码模型。另外,某些固态存储介质110可具有四个以上的可能状态,以允许将两个以上的二进制值存储在单个多级存储单元中。电压电平L0、L1、L2和L3可以是邻接的,也可以不是邻接的;例如,在某些实施例中,电压电平被称为防护频带的带隙隔开。例如,L0和L1可以间隔0.3V。
在一个实施例中,LSB对应于较低数据页,MSB对应于较高数据页。在某些实施例中,多级存储单元可以附着到双相编程模型上,如下所述,这需要在写入MSB之前写入LSB,反之亦然。在另一个实施例中,LSB和MSB可以由固态存储控制器104单独编程。可根据供应商或制造商对页面配对(即,MLC单元的LSB位与另一个MLC单元的MSB位配对)和页面寻址(即,LSB页面必须在MSB页面之前进行编程,反之亦然)的要求采用此类方法。在某些情况下,必须在写入MSB之前写入LSB,在写入LSB之前写入MSB,诸如此类。
在某些实施例中,固态存储介质110可以采用双相编程模型。在此类模型中,首先通过较低页的第一写入命令将二进制值写入LSB。写入命令使多级存储单元从其初始状态(例如,标记为L0的11状态)移至被配置为可在随后读取00状态的中间状态(低至中LM状态-介于L1和L2之间)。例如,将“0”写入较低页会使多级存储单元从L0状态(其中LSB和MSB均为1)更改为L2状态(其中LSB变为0)。随后将“0”写入较高页会将多级存储单元从中间状态(通常在L1状态与L2状态之间)移至L2状态,使得MLC两个位均为“0”。因此,在该实施例中,需要通过两次写入(一次写入较低页,一次写入较高页)将多级单元从L0移至L2,这是因为单元通过中间状态过渡,并且MLC设备要求在较高页之前对较低页进行编程,而且不允许在没有中间擦除操作的情况下进行页面的部分编程。将“1”写入较高页或较低页中的任一个会使MLC转换到L1或L3,具体取决于当时较低页的二进制值。此外,某些固态介质供应商会强加一些要求,诸如必须在较高页之前写入较低页等等。在其他实施例中,固态存储介质110可以采用双相编程模型,其中首先通过较高页的第一写入命令将二进制值写入MSB。
在一个实施例中,配置模块352根据多级存储单元存储的二进制数据子集调整一个或多个读取电压阈值662,例如仅较高页、仅较低页等。在此类实施例中,通过检查LSB位的状态变化可指示多级存储单元中电压的变化方向。对于位值的格雷码编码(如图6C所示)和二进制代码编码而言,多级存储单元的LSB在介于中间两个位置或状态之间的二进制零和二进制一之间转换,在所示实施例中,为L1状态和L2状态。对于其他编码模型而言,MSB可以在介于中间两个位置或状态之间的二进制零和二进制一之间转换,诸如此类。对于格雷码或二进制代码编码模型而言,LSB在较低范围(包括较低的两个状态或位置,L0和L1)内具有读取电压值“1”,LSB在较高范围(包括较高的两个状态或位置,L2和L3)内具有读取电压值“0”。通过仅使用MLC存储单元的LSB确定读取偏置是否与已知偏置偏移,在一个实施例中,配置模块352可使用基本上类似于确定SLC存储单元的读取偏置是否与已知偏置偏移的方式,通过计算或记录LSB数据集的二进制一和/或二进制零等进行确定。
对于某些类型的多级存储单元而言,中间读取电压阈值662b以及相邻的L1和L2状态可能对读取干扰或会导致读取电压漂移的其他因素更敏感。另外,如上所述,在某些实施例中,单个多级存储单元的LSB和MSB可以表示存储在不同物理页中的数据。在一个实施例中,将来自多个多级存储单元中的每一个的单个位用作数据集可以减少检索数据集的读取操作数量。在其他实施例中,将来自多个多级存储单元中的每一个的单个位用于较低页简化了检测多级存储单元的读取偏置与已知偏置的偏移和方向的过程。
在一个实施例中,方向模块406根据包括来自多级存储单元的一个或多个较低页的数据在内的数据集,来确定多级存储单元组的偏移方向。因为较低页包括LSB,在某些实施例中,较低页的读取偏置与较低页的已知偏置之间的差异表明LSB的存储单元值已从二进制一转换为二进制零,方向模块406对此作出响应,确定读取电压阈值662向较大读取电压偏移。对于LSB从二进制一转换为二进制零的情况,采用图6C编码模型的多级存储单元的读取电压必定会从L0或L1状态漂移至L2或L3状态,这表明一个或多个读取电压阈值662应增高以使读取电压返回至初始L0或L1状态。
相似地,在某些实施例中,较低页的读取偏置与较低页的已知偏置之间的差异表明LSB的存储单元值已从二进制零转换为二进制一,方向模块406对此作出响应,确定读取电压阈值662趋向于较小读取电压偏移。对于LSB从二进制零转换为二进制一的情况,采用图6C编码模型的多级存储单元的读取电压必定会从L3或L2状态漂移至L1或L0状态,这表明一个或多个读取电压阈值662应降低以使读取电压返回至初始L3或L2状态。在某些实施例中,不太可能出现跨越多个状态的偏移,并且使用LSB可检测的偏移可以介于L1与L2状态之间,这表明在任一方向上都有着明确的偏移。
在另一个实施例中,方向模块406至少部分地基于用于固态存储介质110的存储单元的编码类型、存储介质110的存储单元的物理和/或电气结构等,来确定偏移方向。例如,基于图6C的编码模型,方向模块406可以基于2位MLC存储介质类型,基于数据集是包括较高页还是较低页,基于所示格雷码编码类型,基于所确定的偏移的大小等等,来确定偏移方向。在另一个实施例中,方向模块406可以将单独或不同地址(例如不同物理页等)的LSB和MSB转换或合并成单个数据集,或者可以另外方式调整LSB和MSB以确定偏移方向。
在某些实施例中,使用存储在多级存储单元内的每个位确定读取电压阈值调整量,这样可以提高读取电压阈值调整的精度,但会增加读取操作次数或使确定过程更为复杂。在一个实施例中,如果ECC解码器322在多级存储单元组的较高页中检测到数据错误,那么数据集读取模块402检索该分组的一个或多个较低页,并且配置模块352基于较低页对该分组的读取电压阈值进行调整。
图6D示出了固态存储介质110的一组多级存储单元的调整后配置参数672a-c的一个实施例。在某些实施例中,图6C的配置参数662a-c是由制造商、供应商等设置的默认配置参数,配置模块352和/或主动配置模块424将默认配置参数662a-c调整或配置为调整后配置参数672a-c。
与默认配置参数662a-c相比,调整后配置参数672a-c更贴切地匹配图6D的存储单元状态的实际分布。如果对应的存储单元组采用具有图6D的存储单元状态分布的默认配置参数662a-c,该分布中漂移过默认配置参数662a-c位置的部分会对数据错误进行寄存。配置模块352通过配置对应的存储单元组使用调整后配置参数672a-c,从而防止、避免或校正潜在的数据错误。
在一个实施例中,配置模块352采用如上所述的偏差模块404、方向模块406、调整模块408等被动地确定调整后配置参数672a-c。在另一个实施例中,配置模块352采用主动配置模块424,根据如上所述对应组的存储单元的存储介质特性,主动地确定调整后配置参数672a-c。
图7A示出了介质特性模块502和存储介质特性库702的一个实施例。在所示实施例中,介质特性模块502为存储介质特性库702中多个不同组的存储单元存储并维护介质特性。存储介质特性库702存储这样的条目,这些条目罗列固态存储介质110的多组存储单元的存储介质特性。存储介质特性库702可以具体呈现为一个或多个对存储介质特性进行存储的表格、矩阵、阵列、数据库、文件或另一种数据结构。
介质特性模块502可将存储介质特性库存储在固态存储介质110的一个或多个元数据区域中,存储在固态存储设备102和/或计算机112的易失性存储器中,存储在固态存储设备102的配置文件中(该配置文件存储在计算机112的非易失性存储器中),存储在固态存储设备102的专用非易失性存储器中等。介质特性模块502可以将介质特性库702和/或存储介质特性存储在单个位置,或分开存储在多个位置。
例如,在一个实施例中,介质特性模块502可以从固态存储设备102的非易失性存储器(例如在经制造商或供应商编程的可编程只读存储器(“PROM”)等)中访问静态存储介质特性,例如固态存储设备102和/或固态存储介质110的构造、型号、制造商、产品版本等。介质特性模块502可以存储动态存储介质特性,例如固态存储设备102和/或计算机112的易失性存储器中的编程/擦除循环计数、读取计数、保持时间、温度、用例、错误统计等,固态存储介质110上的元数据等等。如果介质特性模块502将存储介质特性库702的至少一部分存储在易失性存储器中,那么在某些实施例中,介质特性模块502可周期性地将存储介质特性库702的数据保存到固态存储介质110或保存到其他非易失性存储器中,从而在发生电源故障、错误关机等时,介质特性模块502可以重建存储介质特性库702。
图7B示出了存储介质特性库702的另一个实施例。存储介质特性库702包括多组存储单元的多个条目708。在所示实施例中,所述多组存储单元由存储介质区域706组织,使存储介质特性库702中每个存储介质区域706具有从LEB0到LEBN的条目708。虽然所示实施例中的存储介质区域706以如上所述的逻辑擦除块LEB0到LEBN示出,但在其他实施例中,存储介质区域706可包括物理擦除块、页、逻辑页、ECC数据块、页内分区、管芯、管芯平面、芯片等。
每个条目708还包括相应存储介质区域706的存储介质特性704。在所示实施例中,存储介质特性704包括编程/擦除循环计数704a、读取计数704b、保持时间704c、温度704d和位错误率704e。特性更新模块508可与介质特性模块502协作,对如上所述的存储介质特性库702进行更新。
图8A示出了配置参数模块504和配置参数库802的一个实施例。在所示实施例中,配置参数模块504为配置参数库802中多个不同组的存储单元存储并保持配置参数。在某些实施例中,配置参数库802可与存储介质特性库702整合为单个库702、802。配置参数库802存储这样的条目,这些条目罗列固态存储介质110的多组存储单元的配置参数。配置参数库802可以具体呈现为一个或多个对配置参数进行存储的表格、矩阵、阵列、数据库、文件或另一种数据结构。
图8B示出了配置参数库802的另一个实施例。配置参数库802包括多组存储单元的多个条目808。在所示实施例中,所述多组存储单元由存储介质区域706组织,并且条目808对应从LEB0到LEBN的存储介质区域706。每个条目808还包括对应存储介质区域706的配置参数804。在所示实施例中,配置参数804包括读取电平R1804a、读取电平R2804b和读取电平R3804c的读取电压阈值调整量804a-c,其中每个条目为相对于默认读取电压阈值的十六进制偏移量。
虽然所示实施例中的配置参数804以如上所述读取电压阈值调整量示出,但在其他实施例中,配置参数804可包括固态存储介质110的电阻率阈值、写入或编程阈值、擦除阈值和/或其他可修改的参数。如上所述,配置参数804可包括绝对数据值、数据值的偏移量或调整量、或另一个参数。配置更新模块510可与配置参数模块504协作,对如上所述配置参数库802进行更新。
流程图
图9示出了用于提高固态存储介质110实用性的方法900的一个实施例。方法900开始,在902处介质特性模块502为固态存储介质110的一组存储单元引用一个或多个存储介质特性。在904处配置参数模块504基于902处引用的一个或多个存储介质特性确定该组存储单元的配置参数。在906处存储单元配置模块506对该组存储单元进行配置以使用904处所确定的配置参数,然后方法900结束。
图10示出了用于提高固态存储介质110实用性的方法1000的另一个实施例。方法1000开始,在1002处特性更新模块508确定固态存储介质110的一组存储单元是否发生了更新事件。如果在1002处特性更新模块508确定发生了更新事件,那么在1004处特性更新模块508在存储介质特性库702等中对该组存储单元的一个或多个存储介质特性进行更新。如果在1002处特性更新模块508确定尚未发生更新事件,那么在1004处特性更新模块508不对该组存储单元的一个或多个存储介质特性进行更新。
在1004处特性更新模块508对该组存储单元的一个或多个存储介质特性等进行更新后,在1006处配置更新模块510确定一个或多个存储介质特性是否有变化。如果在1006处配置更新模块510确定该组存储单元的一个或多个存储介质特性有变化,那么在1008处介质特性模块502为该组存储单元引用一个或多个存储介质特性,并且在1010处配置参数模块504和/或配置更新模块510确定/更新该组存储单元的配置参数。如果在1006处配置更新模块510确定该组存储单元的一个或多个存储介质特性没有变化,那么方法1000跳过引用步骤1008和确定/更新步骤1010。
在1012处存储单元配置模块506确定该组存储单元是否发生了配置触发。如果在1012处存储单元配置模块506确定发生了配置触发,那么在1014处存储单元配置模块506对该组存储单元进行配置以使用1010处确定/更新的配置参数,然后重复方法1000。如果在1012处存储单元配置模块506确定尚未发生配置触发,则重复方法1000。
在不脱离本发明精神或本质特性的情况下,本发明可以其他具体方式体现。无论从哪个方面来看,都应将所述实施例视为仅为示例性的而非限制性的。因此,本发明的范围由所附权利要求书指明而非上述说明内容指明。落入权利要求等同物的意义和范围内的所有变化都包括在其范围内。