在系统的整体性能中,系统能将数据写至永久存储器以及从永久存储器读取数据的速度常常是一个关键因素。向永久存储器读取和写入数据的传统方法需要通过系统核心中的多个层以及硬件中的多个实体进行处理。结果,向永久存储器读取和写入数据导致系统中的明显延迟,且最终降低系统的整体性能。
具体实施方式
现在将参考附图详细描述本发明的具体实施方案。在以下本发明实施例的详细描述中,提出了许多具体的细节,以提供本发明的更深入的理解。然而,对本领域的普通技术人员明显的是,本发明可以在没有这些具体的细节的情况下实施。在其他情况下,公知的特征未被详细描述,以避免使描述不必要地复杂化。
在以下图1A-8的描述中,在本发明的各种实施例中,针对某一附图描述的任何组件可等同于针对任何其他附图描述的一个或多个同名组件。为简洁起见,这些组件的描述将不在针对每一附图而重复。因此,每一附图的诸组件的每一和每个实施例都被结合作为引用,并被假定为可选地出现于具有一个或多个同名组件的所有其他附图之内。另外,根据本发明的各种实施例,某一附图的诸组件的任何描述要被解释为一个可选实施例,该可选实施例可以除了、连同或代替结合任何其他附图中的相应同名组件所描述的那些实施例。
在一般情况下,本发明的实施例涉及存储系统。更具体地说,本发明的实施例涉及包括自描述数据的存储系统。此外,本发明的实施例涉及其中需要存取存储在存储系统中的用户数据的所有元数据是用它所描述的用户数据来定位的。此外,该元数据是用来填充(populate)存储器内数据结构,该存储器内数据结构允许存储系统仅使用该存储器内数据结构来直接存取用户数据。
图1A-1E示出根据本发明的一个或多个实施例的系统。参考图1A,该系统包括可操作地连接到存储装置(102)的一个或多个客户端(客户端A(100A)、客户端M(100M))。
在本发明的一个实施例中,客户端(100A、100M)对应于包括发出一读取请求至存储装置(102)和/或发出一写入请求至存储装置(102)的功能的任何系统。虽然未示出于图1A中,客户端(100A、100M)中的每一个都可包括客户端处理器和客户端存储器。以下图1D描述了有关客户端中的诸组件的附加细节。在本发明的一个实施例中,客户端(100A、100M)被配置为与存储装置(102)通信,该通信使用以下协议中的一个或多个:外围组件互连(PCI)、PCI Express(PCIe)、PCI-eXtended(PCI-X)、非易失性存储器快线(UVMe)、PCI-Express架构(Fabric)上的非易失性存储器快线(UVMe)、以太网架构上的非易失性存储器快线(UVMe)以及无限带宽(Infiniband)架构上的非易失性存储器快线(UVMe)。本领域技术人员会明白:本发明并不限于上述协议。
在本发明的一个或多个实施例中,如果客户端实现PCI、PCIExpress或UVMe,则该客户端包括根组件(root complex)(未示出)。在本发明的一个实施例中,根组件是将客户端处理器和客户端存储器连接至PCIe架构的设备。在本发明的一个实施例中,根组件被集成入客户端处理器。
在本发明的一个实施例中,PCIe架构包括经由交换机(例如,图1D中的客户端交换机(116)和交换机架构内的交换机,交换机架构是例如图2A中的交换机架构(206))连接的根组件和端点。在本发明的一个实施例中,端点是除了根组件或交换机之外的可以始发PCI交换(例如,读取请求、写入请求)或者作为PCI交换的目标的设备。
在本发明的一个实施例中,单个客户端和单个存储装置可以被视为单个PCIe架构的一部分。在本发明的另一实施例中,一个或多个客户端以及一个或多个存储装置的任何组合可以被视作是单个PCIe架构的一部分。此外,如果存储装置内的个别组件使用PCIe进行通信,且客户端中的个别组件(参见图1D)使用PCIe进行通信,则存储装置和客户端中的所有组件可以被视为单个PCIe架构的一部分。本领域技术人员会明白:可以使用另一类型的架构来实现本发明的各种实施例,而不脱离本发明。
继续图1A,在本发明的一个实施例中,存储装置(102)是一个系统,该系统包括易失性存储器和永久存储器并被配置成服务来自一个或多个客户端(100A、100M)的读取请求和/或写入请求。该存储装置(102)的各种实施例在以下图2A-2D中描述。
参考图1B,图1B示出了其中客户端(100A、100M)连接到网格组态(在图1B中标示为存储装置网格(104))中设置的多个存储装置(104A、104B、104C、104D)的系统。如图1B所示,该存储装置网格(104)被显示在一个完全连接的网格组态中--即,存储装置网格(104)中的所有存储装置(104A、104B、104C、104D)直接连接到存储装置网格(104)中的所有其他存储装置(104A、104B、104C、104D)。在本发明的一个实施例中,每一客户端(100A、100M)可以直接连接到存储装置网格(104)中的一个或多个存储装置(104A、104B、104C、104D)。本领域技术人员会明白:存储装置网格可以使用其他网格组态(例如,部分连接的网格)来实现,而不背离本发明。
参考图1C,图1C示出一系统,在该系统中,客户端(100A、100M)连接到按扇出(fan-out)组态排列的多个存储装置(104A、104B、104C、104D)。在这种组态中,每一客户端(100A、100M)被连接到存储装置(104A、104B、104C、104D)中的一个或多个;然而,各个存储装置(104A、104B、104C、104D)之间没有通信。
参考图1D,图1D示出了根据本发明的一个或多个实施例的客户端。如图1D所示,客户端(110)包括客户端处理器(112)、客户端存储器(114)和客户端交换机(116)。这些组件中的每一个描述如下。
在本发明的一个实施例中,客户端处理器(112)是一组具有被配置成执行指令的单核或多核的电子电路。在本发明的一个实施例中,客户端处理器(112)可以使用复杂指令集体系(CISC)体系结构或精简指令集(RISC)体系结构实现。在本发明的一个或多个实施例中,客户端处理器(112)包括根组件(如通过PCIe协议定义的)(未示出)。在本发明的一个实施例中,如果客户端(110)包括根组件(其可以被集成入客户端处理器(112)),则客户端存储器(114)经由该根组件连接到客户端处理器(112)。或者,客户端存储器(114)使用另一个点对点的连接机制直接连接到客户端处理器(112)。在本发明的一个实施例中,客户端存储器(114)对应于任何易失性存储器,包括,但不限于,动态随机存取存储器(DRAM)、同步DRAM、SDR SDRAM和DDR SDRAM。
在本发明的一个实施例中,客户端存储器(114)包括下列一个或多个:客户端处理器的提交队列和客户处理器的完成队列。在本发明的一个实施例中,该存储装置存储器包括客户端处理器的一个或多个提交队列,其通过架构(fabric)对客户端可见,且该客户端存储器包括客户端处理器的一个或多个完成队列,其通过架构对存储装置可见。在本发明的一个实施例中,客户端处理器的提交队列被用于向客户端处理器发送命令(例如,读取请求、写入请求)。在本发明的一个实施例中,客户端处理器的完成队列被用于向该客户端处理器信令,告知它发出至另一实体的命令已被完成。可以使用其他的通知机制来实现本发明的诸实施例,而不背离本发明。
在本发明的一个实施例中,客户端交换机(116)只包括单个交换机。在本发明的另一实施例中,客户端交换机(116)包括多个互连的交换机。如果客户端交换机(116)包括多个交换机,则每一交换机可以连接到所有其他的交换机,可连接到交换架构中的诸交换机的一个子集,或者只连接到一个其他交换机。在本发明的一个实施例中,客户端交换机(116)中的每一交换机都是硬件和逻辑(例如,使用集成电路实现)的组合(如通过交换机架构实现的协议定义的交换机架构),其被配置为允许数据和消息在客户端(110)和存储装置(未示出)之间传递。
在本发明的一个实施例中,当客户端(100A、100M)实施下列协议中的一个或多个:PCI、PCIe或PCI-X,时,客户端交换机(116)是PCI交换机。
在这种实施例中,客户端交换机(116)包括许多端口,其中每一端口可被配置为透明桥或非透明桥。实现为透明桥的端口允许根组件继续发现连接(直接或间接)至该端口的设备(可以是其他根组件、交换机、PCI桥或端点)。相反,当根组件遇到实现为非透明桥的端口时,该根组件无法继续发现连接到该端口的设备,相反该根组件将这样的端口当作端点处理。
当端口被实现为非透明桥时,非透明桥的任一侧上的设备只能使用邮箱系统和门铃中断(由客户端交换机实现)进行通信。该门铃中断允许该非透明桥的一侧上的处理器发出一个中断至该非透明桥的另一侧上的处理器。此外,该邮箱系统包括一个或多个寄存器,该寄存器对于交换机架构的任一侧上的处理器是可读和可写的。上述寄存器使客户端交换机的任一侧上的处理器能够跨该非透明桥传递控制和状态信息。
在本发明的一个实施例中,为了把PCI交换从非透明桥的一侧上的设备发送至该非透明桥的另一侧上的设备,该PCI交换必须寻址到实现该非透明桥的端口。在接收到该PCI交换时,客户端切换执行地址翻译(使用直接地址翻译机制或基于查找表的翻译机制)。随后,由此获得的地址被用于向该非透明桥的另一侧上的合适设备路由分组(packet)。
在本发明的一个实施例中,客户端交换机(116)被配置成使得客户端存储器(114)的至少一部分为存储装置直接可存取。换言之,客户端交换机的一侧上的存储装置可以经由客户端交换机直接存取客户端交换机的另一侧上的客户端存储器。
在本发明的一个实施例中,客户端交换机(116)包括DMA引擎(118)。在本发明的一个实施例中,该DMA引擎(118)可以由连接到客户端交换机的客户端处理器或存储装置编程。如上面所讨论的,客户端交换机(116)被配置为使得客户端存储器(114)的至少一部分对于存储装置或存储模块是可存取的。因此,DMA引擎(118)可以被编程以从存储装置可存取的客户端存储器的该部分中的地址读取数据并且将这种数据的副本直接写至存储装置或存储模块中的存储器。此外,DMA引擎(118)可以被编程为从存储装置读取数据并且将这种数据的副本直接写至存储装置可存取的客户端存储器的该部分。
在本发明的一个实施例中,DMA引擎(118)支持组播。在这种实施例中,存储装置中的处理器(参见图2A)可创建组播组,其中该组播组的每一成员对应于存储装置上的存储器中的唯一目的地地址。该组播组的每一成员同一个描述符相关联,该描述符指定:(i)目的地地址;(ii)源地址;(iii)传递大小字段;以及(iv)控制字段。每个描述符的源地址保持不变,同时目的地地址对于每个描述符而改变。一旦创建了该组播组,通过靶向该组播组地址的交换机的任何数据传递(包括由DMA引擎启动的传递)将该数据的相同副本置于同该组播组相关联的所有目的地端口。在本发明的一个实施例中,交换机并行处理所有的组播组描述符。
继续图1D的讨论,本领域技术人员将会理解:虽然图1D示出了位于客户端(110)中的客户端交换机(116),但该客户端交换机(116)可以位于客户端外部,而不背离本发明。此外,本领域技术人员将会理解:DMA引擎(118)可以位于客户端交换机(116)外部,而不背离本发明。
参考图1E,图1E示出一系统,其中客户端(100A、100M)经由客户端交换机(108)连接至按照网格组态(图1E中标示为存储装置网格(104))排列的多个存储装置(104A、104B、104C、104D)。在图1E所示的实施例中,每一客户端(100A、100M)不包括其自己的客户端交换机–相反,所有的客户端共享一个客户端交换机(108)。如图1E所示,存储装置网格(104)按完全连接的网格组态加以显示--即存储装置网格(104)中的所有存储装置(104A、104B、104C、104D)直接连接到该存储装置网格(104)中的所有其他存储装置(104A、104B、104C、104D)。在本发明的一个实施例中,客户端交换机(108)可以直接连接到存储装置网格(104)中的一个或多个存储装置(104A、104B、104C、104D)。本领域技术人员将会理解:存储装置网格可以使用其他网格组态(例如,部分连接的网格)实现,而不背离本发明。
虽然未在图1E中示出,但每一客户端可包括自己的客户端交换机(如图1D所示),但可以使用交换机架构(定义见下文)连接到存储装置网格(104)。
本领域的技术人员将会理解:虽然图1A-1E示出了存储装置连接至有限数量的客户端,但存储装置可以连接到任何数量的客户端,而不背离本发明。本领域技术人员将会理解:虽然图1A-1E示出了各种系统配置,但本发明并不限于上述的系统配置。此外,本领域技术人员将会理解:客户端(不管系统的配置如何)可以使用交换机架构(未示出)连接到(多个)存储装置(如下所述),而不背离本发明。
图2A-2D示出了根据本发明的一个或多个实施例的存储装置的实施例。参考图2A,存储装置包括控制模块(200)和存储模块组(202)。这些组件中的每一个描述如下。在一般情况下,控制模块(200)被配置成管理来自一个或多个客户端的读取和写入请求的服务。特别是,该控制模块被配置为经由IOM(下面讨论)从一个或多个客户端接收请求、处理该请求(该处理可包括发送请求到存储模块),以及在请求已被服务之后向客户端提供响应。以下包括了有关控制模块中的诸组件的附加细节。此外,下面参考图4A-7C来描述相对于服务读取和写入请求的控制模块的操作。
继续图2A的讨论,在本发明的一个实施例中,该控制模块(200)包括输入/输出模块(IOM)(204)、交换机架构(206)、处理器(208)、存储器(210)和,任选地,现场可编程门阵列(FPGA)(212)。在本发明的一个实施例中,IOM(204)是在客户端(图1A-1E中的100A、100M)和存储装置中的其他组件之间的物理接口。该IOM支持以下协议中的一个或多个:PCI、PCIe、PCI-X、以太网(包括,但不限于,在IEEE 802.3a-802.3bj下定义的各种标准)、无限带宽技术(Infiniband)和融合以太网(RoCE)上的远程直接存储器存取(RDMA)。本领域技术人员将会理解:该IOM可使用除了以上列举以外的其他协议实现,而不背离本发明。
继续图2A的讨论,交换机架构(206)仅包括单个交换机。在本发明的另一实施例中,交换机架构(206)包括多个互连的交换机。如果交换机架构(206)包括多个交换机,每一交换机可以连接到所有其他的交换机,可以连接到交换机架构中的诸交换机的子集,或可以仅连接到交换机架构中的一个其他交换机。在本发明的一个实施例中,在交换机架构(206)中的每一交换机是硬件和逻辑(例如,使用集成电路实现)的组合(如由交换机架构实现的协议定义交换机架构),其被配置为在存储装置中将各种部件连接在一起并在各种连接的组件之间路由分组(使用逻辑)。在本发明的一个实施例中,交换机架构(206)物理连接到IOM(204)、处理器(208)、存储模块组(202)和,如果存在,FPGA(212)。在本发明的一个实施例中,控制模块(200)中的所有组件间通信(除了在处理器(208)和存储器(210)之间)通过交换机架构(206)。此外,该控制模块(200)和存储模块组(202)之间的所有通信通过该交换机架构(206)。在本发明的一个实施例中,交换机架构(206)采用PCI协议(例如,PCI、PCIe、PCI-X或另一个PCI协议)实现。在这种实施例中,通过交换机架构(206)的所有通信使用相应的PCI协议。
在本发明的一个实施例中,如果交换机架构实现PCI协议,交换机结构(206)包括用于处理器的端口(或者,更具体地说,用于集成在处理器(208)中的根组件或用于连接到处理器的根组件的端口)、用于存储模块组(202)中的存储模块(214A、214N)(见图3)的一个或多个端口、用于FPGA(212)(如果存在的话)的端口以及用于IOM(204)的端口。在本发明的一个或多个实施例中,上述端口中的每一个可以配置为透明桥或非透明桥(如以上所讨论的)。本领域技术人员将会理解:虽然已联系PCI实现来描述交换机架构(206),但该交换机架构(206)可以使用其他协议来实现,而不背离本发明。
在本发明的一个实施例中,交换机结构(206)中的至少一个交换机被配置为实现组播。更具体地说,在本发明的一个实施例中,处理器(208)被配置为产生组播组,其中该组播组包括两个或更多成员,每一成员指定存储器(210)和/或存储模块(214A、214N)中的一地址。当创建该组播组时,将该组播组同组播地址相关联。为了实现组播,交换机架构中的至少一个交换机被配置为:当接收到将该组播地址指定为目的地地址的写入时,交换机被配置成为该组播组中的每一成员产生一个新的写入并发出该写入至存储装置中的合适地址。在本发明的一个实施例中,通过将特定偏移量(offset)加到该组播地址来确定由交换机产生的用于每一写入的地址。
继续图2A,处理器(208)是一组具有被配置成执行指令的单核或多核的电子电路。在本发明的一个实施例中,处理器(208)可以使用复杂指令集(CISC)体系结构或精简指令集(RISC)体系结构实现。在本发明的一个或多个实施例中,处理器(208)包括根组件(如通过PCIe协议定义)。在本发明的一个实施例中,如果控制模块(200)包括根组件(其可以被集成入处理器(208)),则存储器(210)经由该根组件连接到处理器(208)。或者,存储器(210)使用另一个点对点连接机制直接连接到处理器(208)。在本发明的一个实施例中,存储器(210)对应于任何易失性存储器,包括,但不限于,动态随机存取存储器(DRAM)、同步DRAM、SDR SDRAM和DDR SDRAM。
在本发明的一个实施例中,处理器(208)被配置为创建和更新存储器内数据结构(未示出),其中该存储器内数据结构被存储于存储器(210)中。在本发明的一个实施例中,存储器内数据结构包括存储模块组中的逻辑地址与物理存储地址之间的映射(直接或间接)。在本发明的一个实施例中,逻辑地址是从客户端的角度来看数据似乎驻留在此处的地址。在本发明的一个实施例中,逻辑地址是(或包括)通过将散列函数(例如SHA-1、MD-5等等)应用于n元组所产生的散列值。在本发明的一个实施例中,该n元组是<对象ID,偏移量ID>,其中在对象ID定义一文件且偏移量ID定义相对于文件的起始地址的位置。在本发明的另一实施例中,n元组是<对象ID,偏移量ID,出生时间>,其中出生时间对应于创建(使用对象ID标识)文件时的时间。或者,逻辑地址可包括逻辑对象ID和逻辑字节地址,或逻辑对象ID和逻辑地址偏移量。在本发明的另一实施例中,逻辑地址包括对象ID和偏移量ID。本领域技术人员将会理解:多个逻辑地址可被映射到单个物理地址且逻辑地址不限于上述的实施例。
在本发明的一个实施例中,物理地址可对应于:(i)存储器(210)中的位置,(ii)在弯曲存储器(vaulted memory)(例如图3中的324)中的位置,或(iii)在固态存储器模块(例如图3中的330A)中的位置。在本发明的一个实施例中,如果存储装置中有数据的多个副本,则存储器内数据结构可将单个散列值映射至多个物理地址。
在本发明的一个实施例中,存储器(210)包括以下的一个或多个:用于处理器的提交队列、用于处理器的完成队列、用于存储装置中的每一存储模块的提交队列以及用于存储装置中的每一存储模块的完成队列。在本发明的一个实施例中,该用于处理器的提交队列被用于发送命令(例如,读取请求和写入请求)至处理器。在本发明的一个实施例中,该用于处理器的完成队列被用于向该处理器发信号,告知它向另一实体发出的命令已被完成。用于存储模块的提交队列和完成队列以类似的方式运行。
在本发明的一个实施例中,处理器(经由交换机架构)被配置为卸下对FPGA(212)的各种类型的处理。在本发明的一个实施例中,该FPGA(212)包括计算正被写入至存储模块的数据和/或正从存储模块读取的数据的校验和的功能。此外,FPGA(212)可以包括出于用RAID方案(例如,RAID2-RAID 6)将数据存入存储模块的目的而计算P和/或Q的奇偶信息的功能和/或执行恢复使用RAID方案(例如,RAID2-RAID6)存储的损坏数据所必要的各种计算的功能。在本发明的一个实施例中,存储模块组(202)包括一个或多个存储模块(214A、214N),其中每一个存储模块都被配置用于存储数据。存储模块以下在图3中加以描述。
在本发明的一个实施例中,处理器(208)被配置为编程系统中的一个或多个DMA引擎。例如,处理器(208)被配置为编程客户端交换机中的DMA引擎(参见图1D)。处理器(208)也可以被配置成编程存储模块中的DMA引擎(参见图3)。在本发明的一个实施例中,编程客户端交换机中的DMA引擎可以包括创建组播组和为该组播组中的每一成员产生描述符。
转向图2B,图2B示出了根据本发明的一个或多个实施例的存储装置。存储装置包括控制模块(216)和至少两个存储模块组(236,238)。控制模块(216)包括交换机架构(234),其直接连接到IOM A(218)、IOMB(220)、处理器A(222)、处理器B(224)、(如果存在的话)FPGA A(230)、(如果存在的话)FPGA B(232)、存储模块组A(236)中的存储模块(236A,236N)以及存储模块组B(238)中的存储模块(238A,238N)。上述组件之间的所有通信(除了在处理器A(222)和处理器B(224)之间)通过交换机架构(234)。在本发明的一个实施例中,控制模块(216)内的处理器(222,224)能够使用例如点对点互连技术(比如QuickPath互连)直接通信。本领域技术人员将会理解:其他的点对点通信机制可以用于允许处理器(222,224)之间的直接通信,而不背离本发明。
继续图2B,在本发明的一个实施例中,控制模块(216)基本上类似于图2A中的控制模块(200)。在本发明的一个实施例中,交换机架构(234)基本上类似于图2A中的交换机架构(206)。本发明的一个实施例中,每一处理器(222,224)基本上类似于图2A中的处理器(208)。在本发明的一个实施例中,存储器(226,228)基本类似于的图2A中的存储器(210)。在本发明的一个实施例中,IOM(218,220)基本上类似于图2A中的IOM(204)。在本发明的一个实施例中,FPGA(230,232)基本上类似于图2A中的FPGA(212)。最后,存储模块组(236,238)基本上类似于图2A中的存储模块组(202)。
在本发明的一个实施例中,控制模块(216)中的两个IOM(218,220)使用于控制模块(216)的I/O带宽加倍(相比具有单个IOM的控制模块的I/O带宽)。此外,第二IOM的添加(或附加的IOM)增加了可以连接至给定控制模块的客户端的数量,以及通过扩展,可以连接至存储装置的客户端的数量。在本发明的一个实施例中,使用交换机架构(234)来处理各种连接的组件之间的通信(如上所述)允许处理器(222,224)中的每一个直接存取(经由交换机架构(234))连接到交换机架构(234)的所有FPGA(230,232)以及所有存储模块(236A,236N,238A,238N)。
参考图2C,图2C示出了一存储装置,其包括连接(经由交换机架构(246))至存储模块组(256,258,260,262)中的多个存储模块(未示出)的控制模块(240)。如图2C所示,控制模块(240)包括两个IOM(242,244)、两个处理器(248,250)以及存储器(252,254)。在本发明的一个实施例中,在控制模块(240)中的所有组件可以经由交换机架构(246)进行通信。此外,处理器(248,250)可以使用交换机架构(246)或直接连接(如图2C所示)彼此通信。在本发明的一个实施例中,控制模块(240)内的处理器(248,250)能够使用例如点对点互连技术(诸如 QuickPath互连)直接通信。本领域技术人员将会理解:其他的点对点通信机制可以被用于允许处理器(248,250)之间的直接通信,而不背离本发明。
在本发明的一个实施例中,处理器A(248)被配置为主要处理与来自存储模块组A和B(256,258)的数据的存储和检索相关的请求,同时处理器B(250)被配置为主要处理与来自存储模块组C和D(260,262)的数据的存储和检索相关的请求。然而,处理器(248,250)被配置为(经由交换机架构(246))与所有的存储模块组(256,258,260,262)通信。这种配置使控制模块(240)能在处理器之间传播I/O请求的处理和/或提供内置的冗余度来处理诸处理器之一发生故障的情况。
继续图2C,在本发明的一个实施例中,该控制模块(240)基本上类似于图2A中的控制模块(200)。在本发明的一个实施例中,交换机架构(246)基本上类似于图2A中的交换机架构(206)。本发明的一个实施例中,每一处理器(248,250)基本上类似于图2A中的处理器(208)。在本发明的一个实施例中,存储器(252,254)基本类似于图2A中的存储器(210)。在本发明的一个实施例中,IOM(242,244)基本上类似于图2A中的IOM(204)。最后,存储模块组(256,258,260,262)基本上类似于图2A中的存储模块组(202)。
参考图2D,图2D示出了一存储装置,其包括两个控制模块(264,266)。每一控制模块包括IOM(296,298,300,302)、处理器(268,270,272,274)、存储器(276,278,280,282)和FPGA(如果存在的话)(288,290,292,294)。控制模块(264,266)中的每一个包括交换机架构(284,286),控制模块内的诸组件通过该交换机架构(284,286)进行通信。
在本发明的一个实施例中,控制模块内的处理器(268,270,272,274)可以使用例如点对点互连技术(诸如QuickPath互连)直接彼此通信。本领域技术人员将会理解:其他的点对点通信机制可以用于允许处理器(268,270,272,274)之间的直接通信,而不背离本发明。此外,控制模块A中的处理器(268,270)可以经由与控制模块B中的交换机架构(286)的直接连接同控制模块B中的诸组件进行通信。类似地,控制模块B中的处理器(272,274)可以经由与控制模块A中的交换机架构(284)的直接连接同控制模块A中的诸组件进行通信。
在本发明的一个实施例中,每一控制模块连接到各种存储模块(由存储模块组(304,306,308,310)表示)。如图2D所示,每一控制模块可以与连接到控制模块中的交换机架构的存储模块通信。此外,控制模块A(264)中的处理器可以使用交换机架构B(286)与连接到控制模块B(266)的存储模块进行通信。类似地,控制模块B(266)中的处理器可以使用交换机架构A(284)与连接到控制模块A(264)的存储模块进行通信。
控制模块之间的互连允许存储控制来跨存储装置分配I/O负载,而无论哪个控制模块接收该I/O请求。此外,控制模块的互连使存储装置能处理大量的I/O请求。此外,控制模块的互连在控制模块(或其中的一个或多个组件)发生故障的情况下提供内置的冗余度。
参考图2B-2D,在本发明的一个或多个实施例中,存储器内数据结构跨控制模块中的存储器被镜像(mirrored)。在这种情况下,控制模块中的诸处理器发出必要的命令来更新存储装置内的所有存储器,以使该存储器内数据结构跨所有存储器被镜像。在这种方式中,任何处理器可以使用自己的存储器来确定数据在存储装置中的位置(如由n元组定义,如以上讨论的)。此功能允许任何处理器来服务有关存储模块内的数据位置的I/O请求。此外,通过镜像该存储器内数据结构,存储装置可以在存储器之一发生故障时继续工作。
本领域技术人员将会理解:虽然图2A-2D示出了连接到有限数量的存储模块的控制模块,但该控制模块可以连接到任何数目的存储模块,而不背离本发明。本领域技术人员将会理解:虽然图2A-2D示出了存储装置的各种配置,但该存储装置可以使用其他配置来实现,而不背离本发明。
图3示出了根据本发明的一个或多个实施例的存储模块。存储模块(320)包括存储模块控制器(322)、存储器(324)以及一个或多个固态存储器模块(330A,330N)。这些组件中的每一个描述如下。
在本发明的一个实施例中,存储模块控制器(322)被配置为接收从一个或多个控制模块读取数据和/或写入数据到一个或多个控制模块的请求。此外,存储模块控制器(322)被配置为使用存储器(324)和/或固态存储器模块(330A,330N)来服务该读取和写入请求。虽然图3中未示出,存储模块控制器(322)可以包括DMA引擎,其中该DMA引擎被配置为从存储器(324)或从固态存储器模块(330A,330N)之一读取数据并将该数据的副本写入到客户端存储器(图1D中的114)的物理地址。此外,该DMA引擎可以被配置为将来自存储器(324)的数据写入至固态存储器模块中的一个或多个。在本发明的一个实施例中,DMA引擎被配置成由处理器(例如图2A中的208)编程。本领域技术人员将会理解:存储模块可以包括在存储模块控制器外部的DMA引擎,而不背离本发明。
在本发明的一个实施例中,存储器(324)对应于任何易失性存储器,包括,但不限于,动态随机存取存储器(DRAM)、同步DRAM、SDR SDRAM和DDR SDRAM。
在本发明的一个实施例中,存储器(324)可以在逻辑上或物理上划分成弯曲存储器(326)和高速缓存(328)。在本发明的一个实施例中,存储模块控制器(322)被配置为:在通知存储模块中的电源故障的情况下(或者存储模块可能损失电力的另一种情况下)将弯曲存储器(326)的全部内容写出至固态存储器模块(330A,330N)中的一个或一个以上。在本发明的一个实施例中,存储模块控制器(322)被配置成:在通知电源故障的时间和存储模块实际断电的时间之间将弯曲存储器(326)的全部内容写入至固态存储器模块(330A,330N)中的一个或一个以上。相反,高速缓存(328)的内容在电源故障的情况下(或在存储模块可能损失电力的另一种情况下)是丢失的。
在本发明的一个实施例中,该固态存储器模块对应于任何使用固态存储器存储持久性数据的数据存储装置。在本发明的一个实施例中,固态存储器可以包括,但不限于,NAND闪存、NOR Flash存储器、磁随机存取存储器(M-RAM)、自旋磁随机存取存储器(ST-MRAM)、相变存储器(PCM)或任何其他被定义为非易失性存储级存储器(SCM)的存储器。
在本发明的一个实施例中,下列的存储位置是统一地址空间的一部分:(i)经由客户端交换机可存取的客户端存储器的一部分,(ii)控制模块中的存储器,(iii)存储模块中的存储器以及(iv)固态存储器模块。因此,从存储装置中的处理器的角度来看,上述存储位置(在物理上分开时)出现作为物理地址的单个池(pool)。换言之,该处理器可以发出针对存储于该统一地址空间中的任何物理地址的数据的读取和/或写入请求。上述存储位置可称为使用统一地址空间可存取的存储架构。
在本发明的一个实施例中,部分通过客户端交换机中的非透明桥来创建统一地址空间,允许控制模块中的处理器“看见”该客户端存储器的一部分。因此,控制模块中的处理器可以在它可以“看见”的那部分客户端存储器中执行读取和/或写入请求。
图4A示出了根据本发明的一个或多个实施例的存储模块。固态存储器模块(400)包括一个或多个块。在本发明的一个实施例中,块是固态存储器模块(400)内的最小可擦除存储单位。
图4B示出了根据本发明的一个或多个实施例的块。更具体地,每一块(402)包括一或多个页面。在本发明的一个实施例中,页面是固态存储器模块中用于读取和编程操作(包括对页面的初始写入)的最小可寻址单位。在本发明的一个实施例中,重写块内的页面要求整个块被重写。在本发明的一个实施例中,块内的每一页面是碎片页面(Frag Page)(参见图4C)或者TOC页面(参见图4D)。
图4C示出了根据本发明的一个或多个实施例的碎片页面。在本发明的一个实施例中,该碎片页面包括一个或多个碎片。在本发明的一个实施例中,碎片对应于有限量的用户数据。此外,给定页面内的碎片可以是统一大小或者不统一大小。此外,给定页面内的碎片可以是统一大小或者不统一大小。在本发明的一个实施例中,给定碎片可以小于页面的大小,可以正好是页面的大小,或者可以超出一个或多个页面。在本发明的一个实施例中,碎片页面仅包括碎片。在本发明的一个实施例中,每一碎片包括用户数据(即,客户端提供的用于存储在存储装置中的数据)。出于描述的目的,术语“碎片”和“用户数据”是可交换地使用的。
图4D示出了根据本发明的一个或多个实施例的TOC页面。在本发明的一个实施例中,该TOC页面(406)包括一个或多个TOC条目,其中每一TOC条目包括用于给定碎片的元数据。此外,该TOC页面(406)可以包括对块(402)中的另一TOC页面的引用。在本发明的一个实施例中,TOC页面仅包括TOC条目(以及,任选地,对块中的另一TOC页面的引用),但不包括任何碎片。在本发明的一个实施例中,每一TOC条目对应于块(402)中的一碎片(参见图4C)。TOC条目仅仅对应于块内的多个碎片。换言之,该TOC页面与一块相关联并仅包括用于该块中的多个碎片的TOC条目。在本发明的一个实施例中,每一固态存储器模块内的每一块中的没有缺陷的最后页面是TOC页面。
图4E示出了根据本发明的一个或多个实施例的块。更具体地,图4E示出了块(408),它包括TOC页面(410、412、414)和碎片页面(416、418、422、420、424、426)。在本发明的一个实施例中,块(408)在概念上从“顶”向“底”填充。此外,一旦碎片页面中的碎片的TOC条目的累计大小等于页面的大小,就产生和存储TOC页面。例如,转到图4E,碎片页面0(416)和碎片页面1(418)存储在块(408)中。用于碎片页面0(416)和碎片页面1(418)的多个碎片(未示出)的相应TOC条目(未示出)的总累计大小等于该块中页面的大小。因此,TOC页面(414)被产生(使用对应于块中的碎片的TOC条目)并被存储在块(408)中。碎片页面2(420)随后被写入至块(408)。因为对应于碎片页面2(420)中的多个碎片(未示出)的TOC条目的总累计大小等于块中页面的大小,所以TOC页面(412)被创建并被存储在块(408)中。此外,因为块(408)中已经有TOC页面,因此TOC页面(412)也包括对TOC页面(414)的引用。
重复该过程直到在块(408)中只留有一个页面待填充。在这一点,TOC页面(410)被创建并被存储在块(408)的最后页面中。本领域技术人员将会理解:TOC页面(410)中的TOC条目的总累计大小可以小于页面大小。在这种情况中,TOC页面可以包括填充(padding)以解决TOC条目的累计大小和页面大小之间的差。最后,因为块(408)中有其他TOC页面,TOC页面(410)包括对一个其他TOC页面(412)的引用。
如图4E所示,将TOC页面从该块的“底”链接到页面的“顶”,以便可以通过跟随来自该TOC页面下面的TOC页面的引用获得TOC页面。例如,TOC页面(412)可以用TOC页面(410)中的引用来存取。
本领域技术人员将会理解:虽然块(408)仅包括碎片页面和TOC页面,但块(408)可以包括除了碎片页面和TOC页面之外的其他页面(例如,包括奇偶校验数据的页面),而不背离本发明。这种其他页面可位于块内,且根据实施方式在TOC页面和碎片页面之间交叉存取。
图4F示出了根据本发明的一个或多个实施例的TOC条目。在本发明的一个实施例中,每一TOC条目(430)包括用于碎片的元数据(且特别是片段中的用户数据),并可以包括以下字段中的一个或多个:(i)对象ID(432),其标识正被存储的对象(例如文件);(ii)出生时间(434),其指定对应于TOC条目的碎片被写入至弯曲存储器的时间(例如,控制模块中的处理器的处理器时钟值);(iii)偏移量ID(436),其相对于对象(由对象ID标识)开始而标识碎片中的用户数据的起始点;(iv)片段(fragment)大小(438),其指定了碎片的大小;(v)页面ID(440),其标识其中存储了碎片的块中的页面;(vi)字节(442),其标识页面(由页面ID标识)中碎片的起始位置;(vii)逻辑长度(444),其指定碎片中的用户数据的未压缩长度;(vii)类型(type)(446),其指定碎片中的用户数据的类型(例如,坏页面(badpage)、数据、快照、池);(ix)种类(kind)(448),其指定该碎片是有效用户数据还是裁减(trim)(其表明在固态存储器模块执行无用存储单元收集(garbage collection)时可以擦除该碎片);以及(ix)保留(450),其对应于可用于存储其他用户数据的TOC条目中的空间。
在本发明的一个实施例中,<对象ID,偏移量ID>或<对象ID,偏移量ID,出生时间>标识客户端提供的用户数据。此外,<对象ID,偏移量ID>或<对象ID,偏移量ID,出生时间>由客户端用来标识特定用户数据,同时存储装置使用物理地址来标识存储装置内的用户数据。本领域技术人员将会理解:客户端可提供逻辑地址来代替对象ID和偏移量ID。
本领域技术人员将会理解:TOC条目可以包括与图4F所示的相比更多或更少的字段,而不背离本发明。此外,TOC条目中的字段可以按照不同的顺序和/或组合来安排,而不背离本发明。此外,虽然在图4F所示的TOC条目中的字段看起来都是相同的大小,但TOC条目中的各字段的大小可以是不统一的,其中任何给定字段的大小根据TOC条目的实现方式而变化。
图5示出了根据本发明的一个或多个实施例的数据结构。如以上所讨论的,控制模块中的存储器包括存储器内数据结构。在本发明的一个实施例中,该存储器内数据结构包括n元组(例如,<对象ID,偏移量ID>(500),<对象ID,偏移量ID,出生时间>(未示出))和固态存储器模块中的碎片的物理地址(502)之间的映射。在本发明的一个实施例中,该映射是n元组的散列和物理地址之间的映射。在本发明的一个实施例中,碎片的物理地址被定义为以下的n元组:<存储模块,通道,芯片使能,LUN,平面,块,页面,字节>。
在本发明的一个实施例中,该控制模块还跟踪每个块(504)的TOC条目(506)的数量。更具体地说,每次碎片被写入至拱形存储体时,就创建用于该碎片的TOC条目。控制模块跟踪新创建的TOC条目与哪个块相关联,并使用该信息来产生TOC页面。例如,控制模块使用该信息决定与给定块相关联的所有未被写入到TOC页面的TOC条目的累计大小是否等于块中的页面大小。如果与给定块相关联的所有未被写入到TOC页面的TOC条目的累计大小等于块中的页面大小,则控制模块可以使用上述条目产生TOC页面并发起将该TOC页面写入到存储模块。
图6A-6C示出了根据本发明的一个或多个实施例的流程图。更具体地说,图6A-6C示出根据本发明的一个或多个实施例的用于将用户数据存储于存储装置的方法。虽然流程图中的各个步骤被顺序地呈现和描述,但本领域的普通技术人员将会理解:这些步骤中的一些或者全部都可以按不同的次序执行,可以被组合或省略,且一些或所有的步骤可以并行执行。在本发明的一个实施例中,图6A所示的步骤可以同图6B中所示的步骤和图6C中所示的步骤并行执行。另外,图6B中所示的步骤可以同图6C中所示的步骤并行执行。
参考图6A,在步骤600中,客户端将写入命令(写入请求)写至控制模块(图2A中的208)中的处理器的提交队列(SQ)。在本发明的一个实施例中,该写入命令指定客户端存储器中的用户数据的逻辑地址(也可称为“源地址”)。在本发明的一个实施例中,该写入命令可以使用<对象ID,偏移量ID>指定用户数据。在本发明的一个实施例中,写入命令在到达处理器的SQ之前至少通过客户端交换机和交换机架构。
在步骤602中,客户端将新的SQ尾部写至SQ尾部门铃寄存器。在本发明的一个实施例中,通过写至SQ尾部门铃寄存器,客户端通知处理器在其SQ中有新的命令要处理。
在步骤604中,处理器获得来自SQ的写入命令。在步骤606中,处理器确定要将用户数据(作为碎片的一部分)要写至的(多个)物理地址。在本发明的一个实施例中,(多个)物理地址对应于固态存储器模块中的位置。在本发明的一个实施例中,处理器选择在这两个物理地址中写入用户数据的副本,其中该物理地址中的每一个是在分开的固态存储器模块中。
在步骤608中,处理器编程DMA引擎以发出一写入至一组播地址。在本发明的一个实施例中,该组播地址与组播组相关联,其中该组播组指定控制模块中的存储器中的第一存储器位置、第一弯曲存储器中的第二存储器位置以及第二弯曲存储器中的第三存储器位置。在本发明的一个实施例中,第一弯曲存储器与固态存储器模块位于同一存储模块中,固态存储器模块包括由处理器指定的物理地址。在本发明的一个实施例中,第二弯曲存储器按类似的方式确定。在本发明的一个实施例中,有一个在步骤606中为处理器所标识的每一物理地址选择的弯曲存储器位置。
在步骤610中,DMA引擎从客户端存储器中的源地址读取用户数据,并将该数据写入到组播地址,如由控制模块所引导的。在本发明的一个实施例中,交换机架构中的交换机与组播地址相关联。在收到该地址时,交换机对该组播地址进行必要翻译,以获得三个地址—上述每一个存储器位置各一个。随后,交换机发送用户数据的副本至该三个存储器位置。本领域技术人员将会理解:实现组播的特定交换机可以基于交换机架构的实现方式而变化。在这个实施例中,在客户端和存储装置之间只发出一个写入。
在本发明的另一实施例中,在步骤608中,处理器编程DMA引擎以并行发出三个写入请求--上述每一存储器位置各一个。在这个实施例中,在步骤610中,DMA引擎并行发出三个写入请求。在这个实施例中,客户端和存储装置之间发出三个写入。
继续图6A,在步骤612中,为弯曲存储器中存储的用户数据的每一副本创建TOC条目。另外,每一TOC条目中指定的页面和字节对应于在步骤606中标识的相应物理地址的页面和字节部分。因此,虽然在创建该相应TOC条目时该碎片不被写至固态存储器模块中的物理地址,但该碎片(作为碎片页面的一部分)意图在稍后的时间点被写至该物理地址。如上面所讨论的,每个TOC条目都被存储在TOC页面中,且该TOC页面最终被写入至固态存储器模块。然而,在创建TOC页面之前,TOC条目被创建并被暂时存储在控制模块中的存储器中并被存储在固态存储模块之一上的弯曲存储器中。
继续图6A,在步骤614中,步骤612中所创建的TOC条目被存入弯曲存储器中。更具体地说,每一TOC条目被存储在存储模块的弯曲存储器中,并包括相应的碎片将在稍后的时间点被写入其中的物理地址。
在步骤616中,处理器更新存储器内数据结构,以反映用户数据的三个副本被存储在存储装置中。该处理器还可更新该数据结构,其跟踪每个块的TOC条目(参见图5)。在步骤618中,处理器将SQ标识符(其标识处理器的SQ)和写入命令标识符(其标识客户端向处理器发出的特定写入命令)写入至客户端的完成队列(CQ)。
在步骤620中,处理器产生用于客户端处理器的中断。在本发明的一个实施例中,处理器使用由非透明桥提供的门铃中断以发出一中断至客户端处理器。在步骤622中,客户端处理其CQ中的数据。在这个阶段,客户端已被通知该写入请求已被服务。在步骤624中,一旦客户端已处理在完成队列头部处的数据,则该客户端将新的CQ头部写入至CQ头部门铃。这向处理器预示CQ中的下一个位置要用于在未来给客户的通知。
参考图6B,在步骤626中,控制模块中的处理器发起将来自弯曲存储器的用户数据的副本写至步骤608中标识的物理地址。在本发明的一个实施例中,控制模块中的处理器编程存储模块控制器中的DMA引擎以从弯曲存储器读取用户数据并将该用户数据的副本写入至固态存储器模块中的物理地址。如上所述,要将用户数据的副本写入其中的物理地址是先前在步骤606中由处理器确定的物理地址。
在步骤628中,紧接着步骤626,控制模块中的处理器请求移除弯曲存储器中的用户数据的与步骤626中被写入至固态存储器模块的用户数据相对应的全部副本。在步骤630中,通过将用户数据的副本包括在其各自弯曲存储器中(在步骤626中写入)的每一个存储模块,将移除确认发送至控制模块中的处理器。
参考图6C,图6C示出了每次创建TOC条目时执行的方法。在步骤632中,确定块中是否剩余有一个以上的空白页。换言之,确定用户数据是否已被写入到除了块中的最后页面之外的所有其它页面。如果块中剩余有一个以上的空白页,该过程行进至步骤636;否则该过程行进至步骤634。正如上面所讨论的,如果只有一个空白页面在要写入用户数据的块中,则TOC页面必须被写入至该块的最后一个页面。
在步骤634中,确定与块(其未被写入到块中的TOC页面)相关联的TOC条目的累积大小是否大于或等于页面大小。如果与该块(其未被写入到块中的TOC页面)相关联的TOC条目的累积大小大于或等于页面大小,则该过程行进到步骤636;否则该过程结束。
在步骤636中,将用于块(其未被写入到块中的TOC页面)的TOC条目结合,以创建TOC页面。在本发明的一个实施例中,如果要写入用户数据的块中只有一个空白页面,则这种情况下创建的TOC页面可包括填充(如上所述)。在步骤638中,确定该块是否包括另一个TOC页面。如果该块包括另一个TOC页面,则该过程行进到步骤640;否则该过程行进到步骤642。在步骤640中,对块中最近存储的TOC页面的引用被包含在步骤636中创建的TOC页面中(例如,图4E中的TOC页面(410)引用TOC页面(412))。
在步骤642中,该处理器发起将TOC页面写入至固态存储器模块。更具体地说,由处理器编程的DMA引擎将TOC页面的副本写入至固态存储器模块中的包括与TOC页面中的TOC条目相对应的碎片的块。
在步骤644中,处理器请求包括这样的TOC条目的所有存储模块:这些TOC条目被包含于在步骤642中被写入至固态存储器模块的TOC页面中,以便从它们各自的弯曲存储器中移除这种TOC条目。在步骤646中,处理器从存储模块接收上述TOC条目已被移除的确认。
图7A-7E示出根据本发明的一个或多个实施例的将用户数据存入存储装置的示例。该示例并非旨在限制本发明的范围。
转向图7A,考虑一种情况,其中客户端(700)发出将用户数据(由黑色圆圈标注)写至存储装置的请求。响应于该请求,控制模块(704)中的处理器(714)确定:用户数据的第一副本应被写至存储模块A(718)中的固态存储器模块A(726)中的第一物理位置,且用户数据的第二副本应被写至存储模块B(720)中的固态存储器模块B(728)中的第二物理位置。
处理器(714)在接收到该写入请求之前创建具有三个成员的组播组。第一成员具有弯曲存储器A(722)中的目的地地址,第二成员具有弯曲存储器B(724)中的目的地地址,且第三成员具有存储器(712)中的目的地地址。处理器(714)随后编程交换机架构(716)中的交换机(未示出)以实现该组播组。
DMA引擎继续发出一写入至与该组播组相关联的组播地址。该写入被发送到交换机架构并最终到达实现该组播组的交换机(未示出)。随后,该交换机创建三个写入(每一个都指向由组播组指定的一个目的地)并将这些写入发出至这些目标存储器位置。在本发明的一个实施例中,这三个写入是并行发生的。
要在各种目的地地址处被写入的碎片经过交换机架构(716)。一旦这些写入完成,该存储装置中就会有用户数据的三份副本。一旦这些写入完成,更新存储器(712)中的存储器内数据结构(未示出)以反映出用户数据已被存入存储装置内的三个位置。此外,向客户端(700)通知这些写入已完成。
参考图7B,一旦这些碎片都被写入至弯曲存储器,处理器就在存储器(712)中为弯曲存储器中存储的每一碎片产生一TOC条目(TE 1,TE 2)。TE 1是来自弯曲存储器A(722)中存储的碎片的TOC条目,且TE 2是用于弯曲存储器B(724)中存储的碎片的TOC条目。随后,处理器(经由DMA引擎,未示出)将TE 1的副本写至弯曲存储器A(722)并将TE 2的副本写至弯曲存储器B(724)。正如上面所讨论的,在这一阶段,TOC条目(TE 1和TE 2)被暂时存储在上述的弯曲存储器中,直到它们被添加到TOC页面并被写入到合适的固态存储器模块。
此外,独立于存储装置的操作,客户端(700)可以将用户数据(已经被写入存储装置)从客户端存储器(708)移除。
参考图7C,在稍后的某一时间点,处理器(714)发出一请求到存储模块A(718),以将当前在弯曲存储器A(722)中的用户数据的副本写入至固态存储器模块(726)中的物理地址。响应于该请求,存储模块控制器(未示出)将弯曲存储器A(722)中的用户数据的副本写入至固态存储器模块A(726)。一旦该写入完成,就通知处理器(714)。处理器(714)可在接收到来自存储模块A(718)的通知后更新存储器内数据结构。
参考图7D,在稍后的某一时间点,处理器(714)确定TE 1和用于同一块(即,其中存储有对应于TE 1的碎片的块)中的碎片的其他TOC条目(未示出)的累计总大小等于页面大小。基于该确定,处理器创建TOC页面,且随后(经由DMA引擎(未示出))将TOC页面写入至固态存储器模块中包括与TE 1相对应的碎片的块(未示出)。
参考图7E,在稍后的某一时间点,一旦碎片已被写入固态存储器模块A,处理器(714)发出一请求至包括弯曲存储器中的用户数据的副本的所有存储模块,以将该用户数据的副本从它们各自的弯曲存储器中移除。此外,一旦TOC页面已被写入固态存储器模块A,处理器(714)发出一请求至包括前述TOC页面中写入的任何TOC条目的副本的所有存储模块,以从它们各自的弯曲存储器中移除这种TOC条目。当这些请求完成时,存储模块的每一个通知控制模块。图7E示出在所有存储模块已完成上述请求后的系统状态。在接收到来自存储模块的告知弯曲存储器中的用户数据的所有副本已被移除的通知后,处理器(714)可更新存储器内数据结构。
在本发明的一个或多个实施例中,为用户数据的每一副本创建TOC条目,且该TOC条目被存储在弯曲存储器中,以便在TOC条目之一损坏、丢失或者其他不可用的情况下可以存取用户数据的每一副本。此外,在发生电力故障的情况下,弯曲存储器内的所有TOC条目都被写入到相应的固态存储器模块。此外,对应于前述TOC条目的碎片被写入到在客户端的写入请求被处理时处理器原始确定的物理地址。
图8示出了根据本发明的一个或多个实施例的流程图。更具体地,图8示出了根据本发明的一个或多个实施例的一种产生存储器内数据结构的方法。虽然流程图中的各个步骤按照顺序被呈现和描述,但本领域的普通技术人员将会理解:一些或所有的步骤都可以按不同的次序执行,可以被组合或省略,且一些或所有的步骤可以并行执行。
在步骤800中,选择一块。在步骤802中,获得该块中的最后页面。例如,该处理器读取最后页面的内容。如以上所讨论的,固态存储模块中的每个块的最后页面是TOC页面。在步骤804中,TOC条目是从TOC页面中提取的。
在步骤806中,步骤804中获得的每一TOC条目都被处理以填充存储器内数据结构。更具体地说,处理每一TOC条目可包括以下的一个或多个:(i)从TOC条目中提取页面ID和字节信息;(ii)结合(i)中的信息和<存储模块,通道,芯片使能,LUN,平面,块>,以获得物理地址;(iii)从TOC条目提取对象ID和偏移量ID(且可选的出生时间);(iv)将散列函数应用于<对象ID,偏移量ID>(或,任选的,<对象ID,偏移量ID,出生时间>),以产生一个散列值;以及(v)用散列值和物理地址的映射填充存储器内数据结构。
在本发明的一个实施例中,处理器已经包括关于<存储模块,通道,芯片使能,LUN,平面,块>的信息,因为处理器需要这个信息来获得块的最后页面。在本发明的一个实施例中,处理器可以(i)使用TOC条目中的类型字段来确定该碎片是否在坏页面中。如果该碎片被存储在坏页面中,处理器可以不产生用于TOC条目的存储器内数据结构中的映射。
在步骤808中,一旦TOC页面中的所有TOC条目已被处理,确定TOC页面是否包括对块(即,步骤800中选择的块)中的另一个TOC页面的引用。如果TOC页面包含对该块中的另一个TOC页面的引用,则该过程行进到步骤810;否则该过程结束。在步骤810中,获得引用的TOC页面。在步骤812中,TOC条目是从TOC页面中提取的。然后,该过程行进到步骤806。
在本发明的一个实施例中,在启动系统的时候,图8中的方法可以对存储装置内的所有块(或块的子集)并行执行。紧接着该处理,在将新的用户数据写入到存储装置时,所得到的存储器内数据结构可以由处理器更新。
本领域技术人员将会理解:虽然已相对于被保留作为TOC页面的每一块中的最后页面描述了本发明,但本发明的实施例也可以通过设置块中的另一个页面作为经保留的TOC页面实施,而不背离本发明。
在本发明的一个实施例中,在对固态存储器模块中存储的任何数据进行的任何操作(例如,读取操作、写入操作和/或擦除操作)之前产生存储器内数据结构。
本发明的一个或多个实施例提供一种系统和方法,其中存储装置中存储的所有用户数据是与元数据共处的。在这种方式中,存储装置中存储的所有用户数据是自描述的。通过根据本发明的各种实施例来安排用户数据和相应的元数据,可以更好地保护存储装置,应对给定固态存储器模块(或其子集)的故障。换句话说,如果给定固态存储器模块(或其子集)故障,则该系统中的其他固态存储器模块中的用户数据仍可存取,因为存取其他固态存储器模块中的用户数据所需的元数据本身就位于其他固态存储器模块中。
进一步,本发明的实施例使能在存储器内数据结构的建立,其允许控制模块在单个查找步骤中存取用户数据。换言之,控制模块可使用存储器内数据结构来直接确定存储装置中的用户数据的(多个)物理地址。使用此信息,控制模块能够直接存取用户数据而不需要为了获取用户数据而通过任何中间元数据层次。
本发明的一个或多个实施例可以使用由系统中的一个或多个处理器执行的指令实现。另外,这种指令可对应于存储在一个或多个非暂时性计算机可读介质上的计算机可读指令。
虽然已相对有限数量的实施例来描述本发明,但本领域技术人员,受益于该公开内容,将会理解:也可设计不背离这里所公开的本发明的范围的其它实施例。因此,本发明的范围应仅由所附的权利要求书限定。