用于直接存储器存取的数据缓冲器指针找取的制作方法

文档序号:15517770发布日期:2018-09-25 18:45阅读:303来源:国知局

本公开涉及非易失性储存器的技术。



背景技术:

一种类型的非易失性储存器是半导体存储器。例如,非易失性半导体存储器用于固态驱动器、移动计算装置、非移动计算装置和其它存储器系统中。典型地,存储器系统具有控制器,其通过通信接口来控制在存储器系统和主机系统之间的数据传送。主机系统可以是计算机系统、蜂窝电话、服务器等。存储器系统和主机系统可以例如通过外围计算机接口快速(pcie)总线来交换数据。非易失性存储器快速(nvme)是用于存取经由pcie总线附连的非易失性储存器的逻辑器件接口规范。nvme利用了半导体存储器(例如但不限于固态驱动器)所提供的并行性的优势。



技术实现要素:

本文公开的一个实施例包含非易失性储存器系统,包括多个非易失性存储器单元、命令上下文储存器、以及与命令上下文储存器和多个非易失性存储器单元通信的控制电路。控制电路配置为从主机系统存取命令,以存取非易失性储存器系统中的非易失性存储器单元。命令包括对列表的列表指针,其包括对主机系统中的数据缓冲器的数据缓冲器指针。控制电路配置为基于列表指针来找取对主机系统的数据缓冲器的数据缓冲器指针。控制电路配置为在非易失性储存器系统和主机系统中的由找取的数据缓冲器指针所指向的数据缓冲器之间进行第一dma。控制电路配置为响应于第一dma不存取整个数据缓冲器,将数据缓冲器指针保存到命令上下文储存器中。控制电路配置为存取所存取的数据缓冲器指针。控制电路配置为使用保存的数据指针来进行第二dma,以存取主机数据缓冲器的由数据缓冲器指针所指向、第一dma未存取的部分。

本文公开的一个实施例包含操作非易失性储存器系统的方法。该方法包括从主机系统存取命令,以读取储存在非易失性储存器系统中的数据。命令包括第一字段和第二字段,该第一字段具有对数据缓冲器的数据缓冲器指针和进入数据缓冲器中的非零偏移,该第二字段具有对主机系统中的数据缓冲器的数据缓冲器指针的列表的列表指针。该方法包括对于非易失性储存器系统中的非易失性存储器单元的读取或写入操作来找取主机系统的用于直接存储器存取(dma)的对数据缓冲器的数据缓冲器指针。数据缓冲器指针从主机系统找取。该方法包括,响应于dma的第一dma没有存取由第一数据缓冲器指针所指向的整个主机数据缓冲器,在非易失性储存器系统中储存用于dma的数据缓冲器指针的第一个。该方法包括,响应于确定用于不同读取或写入操作的第二dma是存取主机数据缓冲器的由第一数据缓冲器指针所指向、未被第一dma所存取的部分,存取储存在非易失性储存器系统中的第一数据缓冲器指针。该方法包括对第二dma使用所储存的第一数据缓冲器指针,以存取主机数据缓冲器的被第一数据缓冲器指针所指向、未被第一dma存取的部分。

本文公开的一个实施例包含非易失性储存器系统,其包括非易失性存储器单元的多个存储器裸芯。非易失性储存器系统包括用于从主机系统存取命令的构件,以存取非易失性存储器单元。非易失性储存器系统包括用于解析命令的构件,以确定命令是否具有第一字段和第二字段,该第一字段具有对数据缓冲器的指针和进入数据缓冲器中的非零偏移,该第二字段具有对主机系统中的数据缓冲器的数据缓冲器指针的列表的列表指针。非易失性储存器系统包括用于响应于命令来初始化非易失性储存器系统中的存储器裸芯中的非易失性存储器单元的存储器阵列操作的构件。非易失性储存器系统包括用于对于存储器阵列操作来找取主机系统的用于直接存储器存取(dma)的对数据缓冲器的数据缓冲器指针的构件。非易失性储存器系统包括用于使用找取的数据缓冲器指针来进行主机系统中的存储器的dma的构件。非易失性储存器系统包括用于响应于dma的第一个dma不存取由第一数据缓冲器指针所指向的整个主机数据缓冲器,而在非易失性储存器系统中保存用于dma的数据缓冲器指针的第一个的构件。非易失性储存器系统包括用于响应于确定用于不同存储器阵列操作的第二dma将存取主机数据缓冲器的由第一数据缓冲器指针所指向的部分,而进行存取第一数据缓冲器指针的构件,该第一数据缓冲器指针保存在非易失性储存器系统中。非易失性储存器系统包括用于对第二dma使用所保存的第一数据缓冲器指针来存取主机数据缓冲器的被第一数据缓冲器指针所指向、未被第一dma存取的部分的构件。

在一个实施例中,用于从主机系统存取命令以存取非易失性存储器单元的构件包含,控制器122、处理器122c、前端模块208、命令找取器246、和/或其它硬件和/或软件中的一个或多个。

在一个实施例中,用于解析命令以确定命令是否具有第一字段和第二字段的构件包含,控制器122、处理器122c、命令解析器248、命令找取器246、和/或其它硬件和/或软件中的一个或多个,该第一字段具有对数据缓冲器的指针和进入数据缓冲器中的非零偏移,该第二字段具有对主机系统中的数据缓冲器的数据缓冲器指针的列表的列表指针。

在一个实施例中,响应于命令来初始化非易失性储存器系统中的存储器裸芯中的非易失性存储器单元的存储器阵列操作的构件包含,控制器122、处理器122c、后端模块210、命令调度器226、命令执行器228、和/或其它硬件和/或软件中的一个或多个。

在一个实施例中,用于对于存储器阵列操作来找取主机系统的用于直接存储器存取(dma)的对数据缓冲器的数据缓冲器指针的构件包含,控制器122、处理器122c、前端模块208、缓冲器指针管理器250、和/或其它硬件和/或软件中的一个或多个。

在一个实施例中,使用找取的数据缓冲器指针来进行主机系统中的存储器的dma的构件包含,控制器122、处理器122c、dma253、缓冲器指针管理器250、和/或其它硬件和/或软件中的一个或多个。

在一个实施例中,响应于dma的第一个dma不存取由第一数据缓冲器指针所指向的整个主机数据缓冲器而在非易失性储存器系统中保存用于dma的数据缓冲器指针的第一个的构件包含控制器122、处理器122c、dma253、缓冲器指针管理器250、和/或其它硬件和/或软件中的一个或多个。

在一个实施例中,响应于确定用于不同存储器阵列操作的第二dma将存取主机数据缓冲器的由第一数据缓冲器指针所指向的部分而进行存取第一数据缓冲器指针的构件包含,控制器122、处理器122c、dma253、缓冲器指针管理器250、和/或其它硬件和/或软件中的一个或多个,该第一数据缓冲器指针保存在非易失性储存器系统中。

在一个实施例中,对第二dma使用所保存的第一数据缓冲器指针来存取主机数据缓冲器的由第一数据缓冲器指针所指向、未被第一dma存取的部分的构件包含,控制器122、处理器122c、dma253、缓冲器指针管理器250、和/或其它硬件和/或软件中的一个或多个。

附图说明

图1a是3d堆叠的非易失性存储器装置中的区块的集合的透视图。

图1b是诸如图1a的3d堆叠的非易失性存储器装置的存储器装置的功能框图。

图2a是示例存储器系统的框图,其描绘了控制器和主机的更多细节。

图2b是企业环境的一个实施例的图。

图3a是主机命令、主机数据缓冲器和数据缓冲器指针的列表的一个实例的图。

图3b示出了主机命令、主机数据缓冲器和数据缓冲器指针的列表的一个示例的图,其中第一数据缓冲器指针具有非零偏移。

图4是操作非易失性储存器系统的过程的一个实施例的流程图。

图5是对读取命令从存储器系统到主机系统进行dma的过程的一个实施例的流程图。

图6是对写入命令从存储器系统到主机系统进行dma的过程的一个实施例的流程图。

图7是命令上下文储存器、环缓冲器、缓冲器指针管理器和主机存储器的一个实施例的图。

图8是管理列表指针的过程的一个实施例的流程图。

图9是存取数据缓冲器指针的过程的一个实施例的流程图。

图10是当第一数据缓冲器指针具有非零偏移时的过程的一个实施例的流程图。

具体实施方式

本文描述了用于操作非易失性储存器的技术。一个实施例是非易失性存储器系统中的控制器,该控制器将指针找取到主机系统存储器中的数据缓冲器。在一个实施例中,数据缓冲器指针被及时地找取。例如,如果数据缓冲器指针过早被找取,则非易失性存储器系统中的存储器可能浪费储存的指针。如果数据缓冲器指针太晚被找取,则由于数据传送中的延迟使性能可能劣化。

在一些实施例中,数据缓冲器指针是物理区域页(prp)列表中的nvme物理区域页(prp)条目,其可以存在于连接到非易失性存储器系统的主机系统的存储器中。在一个实施例中,数据缓冲器指针(例如,nvmeprp条目)通过主机系统和非易失性存储器系统之间的外围组件互连快速(pcie)总线进行找取。本文中公开的实施例高效地使用了pcie总线的带宽。在一些实施例中,所找取的数据缓冲器指针(例如,nvmeprp条目)的数量导致了pcie总线之上的高效传送。

本文中公开的实施例通过主机系统和存储器系统之间的物理接口(例如,pcie总线)在用于传送数据的数据信息包中高效地找取数据缓冲器指针。例如,可以使用事务层信息包(tlp)通过pcie总线来传送数据。在一些实施例中,选择tlp的信息包的大小以用于高效的传送。例如,可以为高效的传送来选择在数据载荷中的缓冲器指针(例如,nvmeprp条目)的数量。

本文中公开的实施例减少或者消除了对相同的数据缓冲器指针(例如,nvmeprp条目)的多于一次的找取。一些常规的技术可能多于一次地找取相同的数据缓冲器指针(例如,nvmeprp条目),这是低效的。在一个实施例中,响应于非易失性存储器系统确定可能第二次需要数据缓冲器指针(例如,对于不同的dma),保存该数据缓冲器指针使得其可以重新使用。因此,不需要第二次找取数据缓冲器指针。然而,注意,如果非易失性存储器系统确定将不再需要数据缓冲器指针,则可以从存储器系统中的储存器移除(或者覆写)数据缓冲器指针。因此,高效地使用了存储器。这可以帮助减少高速缓存大小,其可以减少装置面积。

即使在特定命令内,本文中公开的实施例允许数据不按顺序地传送。例如,来自主机系统的单个读取命令可以造成对若干存储器裸芯的分别的读取操作。读取操作可以并行进行,其中存储器裸芯完成其读取操作的顺序可以是不确定的。在一个实施例中,恰好在由读取操作导致的向存储器裸芯所读取的数据准备传输到主机系统前,存储器系统找取数据缓冲器指针。这允许不按顺序的数据传送(以及不按顺序地找取数据缓冲器指针)。注意,不按顺序的数据传送允许下一个准备好的数据接下来被传送。由于其可以减少储存在存储器系统中的数据缓冲器指针的数量,因此这也提供了存储器系统中储存空间的高效利用。

本文所描述的技术可以采用各种类型的非易失性存储器来使用。一个示例是三维(3d)非易失性存储器系统。然而,还可以在二维(2d)非易失性存储器系统中实施实施例。图1a是3d堆叠的非易失性存储器装置中的区块的集合的透视图。存储器系统100包含衬底101。存储器单元(储存元件)的示例区块blk0、blk1、blk2和blk3和具有区块所使用的电路的外围区域104在衬底上。例如,电路可以包含电压驱动器105,其可以连接于区块的控制栅极层。在一种方法中,通常驱动在区块中的公共高度处的控制栅极层。衬底101还可以连同以导电路径进行图案化以承载电路信号的一个或多个下部的金属层,来承载在区块的下方的电路。区块可以形成在存储器装置的中间区域102中。在存储器装置的上部区域103中,一个或多个上部的金属层以导电路径进行图案化,以承载电路信号。每个区块包括存储器单元的堆叠区域,其中堆叠体的交替的级别代表控制栅极层。在一种可能的方法中,每个区块的在公共高度的控制栅极层相互连接,并且连接到电压驱动器。尽管作为示例描绘了四个区块,但是可以使用在x-和/或y-方向上延伸的两个或更多的区块。

平面在x-方向上的长度可以代表在一个或多个上部的金属层中延伸到字线的信号路径的方向(例如,字线或sgd线的方向),并且平面在y-方向上的宽度代表了在一个或多个上部的金属层中延伸到字线的信号路径的方向(例如,位线方向)。z-方向代表存储器装置的高度。

图1b是诸如图1a的3d堆叠的非易失性存储器系统100的存储器装置的功能框图。功能区块图还可以用于2d非易失性存储器系统。存储器系统100可以包含一个或多个存储器裸芯108。图1a的区块的集合可以在一个裸芯上。存储器裸芯108包含存储器单元的存储器结构126(诸如存储器单元的阵列)、控制电路110和读取/写入电路128。在3d配置中,存储器结构可以包含图1a的区块。存储器结构126通过字线经由行解码器124并且通过位线经由列解码器132是可寻址的。读取/写入电路128包含多个感测区块sb1、sb2、...、sbp(感测电路),并且允许存储器单元的页并行读取或编程。典型的控制器122与一个或多个存储器裸芯108被包含在相同的存储器系统100(例如,可移除的储存卡)中。命令和数据经由数据总线120在主机140和控制器122之间传送,并且经由线118在控制器和一个或多个存储器裸芯108之间传送。

可以配置结构126中的多个存储器元件,以便它们串联连接或者使得每个元件可单独地存取。通过非限制性的示例,nand配置中的闪速存储器装置(nand存储器)典型地含有串联连接的存储器元件。nand串是包括存储器单元和选择栅极晶体管的串连晶体管的集合。

可以配置nand存储器阵列,使得阵列由存储器的多个串组成,在存储器中串由共享单个位线的多个存储器元件构成并且成组地存取。替代地,可以配置存储器元件,使得每个元件是可单独地存取的,例如,nor存储器阵列。nand和nor存储器配置是示例性的,并且存储器元件可以以其它方式进行配置。

还可以使用除了nand闪速存储器之外的其它类型的非易失性存储器。半导体存储器装置包含易失性存储器装置,诸如动态随机存取存储器(dynamicrandomaccessmemory,”dram”)或静态随机存取存储器(staticrandomaccessmemory,”sram”)设备,非易失性存储器装置,诸如电阻式随机存取存储器(resistiverandomaccessmemory,”reram”)、电可擦除可编程只读存储器(electricallyerasableprogrammablereadonlymemory、”eeprom”)、闪速存储器(其也可以被认为是eeprom的子集)、铁电随机存取存储器(ferroelectricrandomaccessmemory,”fram”)和磁阻随机存取存储器(magnetoresistiverandomaccessmemory,”mram”),以及其它能够储存信息的半导体元件。每种类型的存储器装置可以具有不同的配置。例如,闪速存储器装置可以配置为nand或nor配置。

存储器元件可以由无源和/或有源元件以任何组合形成。通过非限制性示例,无源半导体存储器元件包含reram装置元件,其在一些实施例中包含电阻性开关储存元件——诸如反熔丝或相变材料,以及可选的操纵元件(steeringelement)——诸如二极管或晶体管。进一步通过非限制性示例,有源半导体存储器元件包含eeprom和闪速存储器装置元件,其在一些实施例中包含含有电荷储存区域的元件,诸如浮置栅极、导电纳米颗粒或者电荷储存介电材料。

存储器结构126可以是二维(2d)或者三维(3d)。存储器结构126可以包括存储器元件(也被称为存储器单元)的一个或多个阵列。在二维存储器结构中,半导体存储器元件布置在单个平面或单个存储器装置级别中。典型地,在二维存储器结构中,存储器元件布置在实质上平行于支撑存储器元件的衬底的主表面延伸的平面中(例如,在x-y方向的平面中)。衬底可以是晶片,存储器元件的层形成在晶片上或晶片中,或者衬底可以是载体衬底,在形成存储器元件之后载体衬底被附接至存储器元件。作为非限制性的示例,衬底可以包含诸如硅的半导体。

三维存储器阵列被布置使得存储器元件占据多个平面或者多个存储器装置级别,从而以三维的方式形成结构(即在x、y和z方向上,其中z方向实质上垂直于衬底的主表面,且x方向和y方向实质上平行于衬底的主表面)。

存储器结构可以包括单片三维存储器结构,其中多个存储器级别形成在单个衬底(诸如晶片)的上方(并且不再单个衬底中),而不具有介入的衬底。存储器结构可以包括任何类型的非易失性存储器,该非易失性存储器单片地形成在存储器单元的阵列的一个或多个物理级别中,该一个或多个物理级别具有设置在硅衬底的上方的高效区。存储器结构可以在具有与存储器单元的操作相关联的电路的非易失性存储器装置中,不管相关联的电路是在衬底的上方还是在衬底内。

典型地,在单片三维存储器阵列中,一个或多个存储器装置级别形成在单个衬底的上方。可选地,单片三维存储器阵列还可以具有至少部分在单个衬底处的一个或多个存储器层。作为非限制性的示例,衬底可以包含诸如硅的半导体。在单片三维阵列中,构成阵列的每个存储器装置级别的层典型地形成在阵列的下卧的存储器装置级别的层上。但是,单片三维存储器阵列的相邻的存储器装置级别的层可以被共享或者具有在存储器装置级别之间的中间层。

作为非限制性的示例,三维存储器结构可以被垂直地布置成多个二维存储器装置级别的堆叠体。作为另一个非限制性的示例,三维存储器阵列可以被布置成多个垂直列(例如,实质上垂直于衬底的主表面(即在y方向上)延伸的列),而每个列具有多个存储器元件。可以以二维配置(例如在x-z平面中)来布置列,造成具有在多个垂直堆叠的存储器平面上的元件的存储器元件的三维布置。三维形式的存储器元件的其它配置还可以构成三维存储器阵列。

通过非限制性的示例,在三维nand存储器阵列中,存储器元件可以被耦接在一起以形成在单个水平(例如,x-y)存储器装置级别内的nand串。替代地,存储器元件可以被耦接在一起以形成横穿多个水平存储器装置级别的垂直的nand串。可以设想其它的三维配置,其中一些nand串在单个存储器级别中含有存储器元件,而其它串含有跨越过多个存储器级别的存储器元件。

其次,二维阵列可以分开形成并且然后封装在一起,以形成具有存储器的多个层的非单片存储器装置。例如,可以通过在分开的衬底上形成存储器级别并且然后在彼此顶部堆叠存储器级别来构建非单片堆叠存储器。衬底在堆叠前可以变薄或者从存储器装置级别移除,但是随着最初在分开的衬底上形成存储器装置级别,得到的存储器阵列不是单片三维存储器阵列。此外,多个二维存储器阵列或三维存储器阵列(单片的或非单片的)可以在分开的芯片上形成,并且然后封装在一起,以形成堆叠芯片存储器装置。

本领域技术人员将认识到,本技术不限于所描述的二维和三维示例性结构,而是覆盖如本文所描述并如本领域技术人员所理解的在本技术的精神和范围内的所有相关存储器结构。

对于存储器元件的操作以及与存储器元件的通信通常需要相关联的电路。作为非限制性的示例,存储器装置可以具有用于控制和驱动存储器元件以完成诸如编程和读取的功能的电路。该相关联的电路可以与存储器元件在相同的衬底上和/或在分开的衬底上。例如,用于存储器读取-写入操作的控制器可以位于分开的控制器芯片上和/或在与存储器元件相同的衬底上。

控制电路110与读取/写入电路128协作以在存储器结构126上进行存储器操作,并且包含状态机112、片上地址解码器114和功率控制模块116。状态机112提供了存储器操作的芯片级别的控制。可以为用于操作存储器装置的参数——诸如,不同行或者存储器单元的其它组的编程参数,提供储存区域113。这些编程参数可以包含位线电压和验证电压。

片上地址解码器114向由解码器124和132所使用的硬件地址提供了由主机或存储器控制器之间使用的地址接口。功率控制模块226控制在存储器操作期间供应给字线和位线的电力和电压。其可以包含用于以3d配置的字线层(wll)、sgs和sgd选择栅极以及源极线的驱动器。在一种方法中,感测区块可以包含位线驱动器。sgs选择是nand串的源极端部处的栅极晶体管,并且sgd选择栅极是nand串的漏极端部处的晶体管。

在一些实现方式中,可以组合一些组件。在各种设计中,除了存储器结构126之外的一个或多个组件(单独的或者组合的)可以被认为是配置为进行本文所描述的行为的至少一个控制电路。例如,控制电路可以包含控制电路110、状态机112、解码器114/132、功率控制模块116、感测区块sb1、sb2、...、sbp、读取/写入电路128、控制器122等等中的任一个或者其组合。

芯片外控制器122可以包括处理器122c以及诸如rom122a和ram122b的储存装置(存储器)。储存装置包括诸如指令集的代码,并且处理器可操作为执行指令集以提供本文所描述的功能。替代地或附加地,处理器可以从存储器结构的储存装置126a(诸如存储器单元在一个或多个字线中的保留区域)存取代码。

代码由控制器122用于存取存储器结构126,诸如用于编程、读取或者操作操作。代码可以包含启动代码和控制代码(例如,指令集)。启动代码是在启动或开启过程期间初始化控制器并且使控制器能够存取存储器结构的软件。代码可以由控制器用于控制一个或多个存储器结构。在上电时,处理器122c从rom122a或者储存装置126a找取启动代码来执行,并且启动代码初始化系统组件并且将控制代码加载到ram122b中。一旦控制代码加载到ram中,其由处理器执行。控制代码包含驱动器以进行基本任务,诸如控制和分配存储器、区分指令处理的优先级、以及控制输入和输出端口。

图2a是示例存储器系统100的框图,其描绘了控制器122和主机系统140的一个实施例的更多细节。在一个实施例中。图2a的系统是固态驱动器。如本文所用的,存储器控制器是管理储存在存储器系统上的数据并且与主机系统进行通信的装置,诸如计算机或电子装置。存储器控制器可以具有除了本文所描述的特定功能之外的各种功能。例如,存储器控制器可以格式化存储器,以确保适当地操作存储器,映射出坏的闪速存储器单元,以及分配空闲单元来替换未来失效的单元。空闲单元的一些部分可以用于将固件保持为操作存储器控制器并且实现其它特征。在操作中,当主机需要从闪速存储器读取数据或者将数据写入到闪速存储器时,其将与存储器控制器通信。如果主机提供要读取/写入数据的逻辑地址(la),则闪速存储器控制器可以将从主机接收的逻辑地址转换为存储器中的物理地址。(替代地,主机可以提供物理地址)。存储器控制器还可以进行各种存储器管理功能,诸如但不限于,损耗均衡(分布写入以避免损耗存储器的特定区块,否则将重复写入到该特定区块)和垃圾收集(在区块满了后,仅将数据的高效页移动到新的区块,所以可以擦除和重复使用满的区块)。

主机系统140具有主机存储器160。在一个实施例中,主机存储器160包含命令提交队列(sq)162和命令完成队列(cq)164。存取非易失性存储器108的命令可以由主机放置到提交队列162中。例如,命令可以是读取或写入非易失性存储器108。在一个实施例中,提交队列162是具有固定大小的间隙的圆形缓冲器。在一个实施例中,主机告知存储器系统何时新的命令已经放置在提交队列162上。这样的一种机制被称为“门铃”。

控制器122可以写入到相关联的完成队列164,以发布所完成的命令的状态。在一个实施例中,完成队列164是具有固定大小的间隙的圆形缓冲器。

数据缓冲器168可以用于储存要被写入到非易失性存储器108的数据,或者储存从非易失性存储器108读取的数据。控制器122可以从数据缓冲器168进行数据的dma,作为将数据写入到非易失性存储器108的部分。例如,控制器122可以将写入数据从数据缓冲器168传送到存储器系统中的写入缓冲器。控制器122可以将数据的dma进行到数据缓冲器168,作为从非易失性存储器108读取数据的部分。例如,控制器122可以将读取数据从存储器系统中的读取缓冲器传送到数据缓冲器168。

主机存储器160还可以包含数据缓冲器指针166。数据缓冲器指针166在数据缓冲器168中识别位置。在实施例中,存储器控制器122使用数据缓冲器指针166来进行dma,以满足读取或写入命令。

在一个实施例中,提交队列(sq)162、完成队列(cq)和数据缓冲器指针166符合nvm快速(nvmexpress)。在一个实施例中,数据缓冲器指针166是nvme“物理区域页(prp)条目”。然而,提交队列(sq)162、完成队列(cq)和数据缓冲器指针166不需要符合nvm快速。

控制器122和非易失性存储器裸芯108之间的接口可以是任何适当的接口。在一个实施例中,存储器系统100可以是基于系统的卡,诸如安全数字(sd)或微型安全数字(micro-sd)卡。在替代实施例中,存储器系统100可以是嵌入式存储器系统的部分。例如,存储器可以嵌入在主机内,诸如以安装在个人计算机中的固态硬盘(ssd)的形式。

在一些实施例中,非易失性存储器系统100包含在控制器122和非易失性存储器裸芯108之间的单一通道,本文所描述的主题不限于具有单一存储器通道。例如,在一些存储器系统架构中,根据控制器的能力,2、4、8或更多个nand通道可以存在于控制器和存储器裸芯之间。在本文所描述的实施例的任一个中,即使在附图中示出了单一通道,但是多于一个通道可以存在于控制器和存储器裸芯104之间。

如图2a中所描绘的,控制器122包含与主机系统104接口的前端模块208、与一个或多个非易失性存储器裸芯108相结合的后端模块210、以及进行现在将详细描述的功能的各种其它模块。

图2a中描绘的控制器122的组件可以例如采用以下形式:为与其它组件一起使用所设计的封装的功能性硬件单元(例如,电路)、由通常进行相关功能的特定功能的(微)处理器或处理电路(或者一个或多个处理器)所执行的程序代码的部分(例如,软件或固件)、或者与更大的系统接口的自包含的硬件或软件组件。例如,每个模块可以包含特定集成电路(asic)、现场可编程门阵列(fpga)、电路、数字逻辑电路、模拟电路、分立电路的组合、门电路、或者任何其它类型的硬件、或其组合。替代地或附加地,每个模块可以包含或者包括储存在处理器可读装置(例如,存储器)中的软件,以编程控制器122的一个或多个处理器来进行本文所描述的功能。图2a中描绘的架构是一个示例实现方式,该实现方式可以(或不可以)使用图1b中描绘的控制器122的组件(例如,ram122b、rom122a、处理器122c)。

控制器122可以与一个或多个存储器裸芯108接口。在一个实施例中,控制器122和多个存储器裸芯(同时包括非易失性储存器系统100)实现固态驱动器(ssd),其可以模拟、替换或者用于代替主机内侧的硬盘驱动器作为nas装置等。此外,ssd不需要作为硬盘驱动器工作。

再次参照控制器122的模块,读取/编写(r/w)缓冲器管理器214管理随机存取存储器(ram)中的缓冲器。这些缓冲器可以包含写入缓冲器和读取缓冲器。ram可以用作临时缓冲器来储存来自主机140的数据,以写入到非易失性存储器108。ram还可以用作临时缓冲器来储存从非易失性存储器108读取的数据,以传送到主机140。r/w缓冲器管理器214还可以对控制器122的内部总线判优进行控制。只读存储器(rom)储存器系统启动代码。

ram和rom未在图2a中描绘。在一个实施例中,ram和/或rom位于控制器122内。在一个实施例中,ram和/或rom位于控制器122的外部。在其它实施例中,ram和rom的部分可以既位于控制器122内又位于控制器的外侧。另外,在一些实现方式中,控制器122、ram和rom可以位于分开的半导体裸芯上。

前端模块208包含主机接口220和物理层接口(phy)222,其提供与主机或下个级别的储存控制器的电接口。在一个实施例中,phy222是外围组件互连快速(peripheralcomponentinterconnectexpress,pcie)。然而,phy222不限于pcie。

主机接口220典型地促进数据、控制信号和时间信号的传送。主机接口220的类型的选择可以取决于正在使用的存储器的类型。在一些实施例中,主机接口220符合nvm快速(nvme)。nvme是逻辑装置接口,其可以用于当使用主机140和存储器系统100之间的pcie总线时存取所附连的非易失性储存器。然而,注意,主机接口220不限于nvme。主机接口220包含命令上下文储存器242、接口寄存器244、命令找取器246、命令解析器248、缓冲器指针管理器250、以及数据缓冲器指针储存器252。

命令上下文储存器242用于储存来自主机的目前正在被存储器控制器处理的命令的信息。该信息可以包含主机存储器160中的指针的列表的指针。在一个实施例中,对于来自主机系统140的每个显著的读取或写入命令存在分开的命令上下文。然而,不需要的是,来自主机系统140的所有类型的命令具有储存在命令上下文中的信息。图7进一步示出了命令上下文储存器242的一个实施例的细节。

接口寄存器244包含在提供主机接口中使用的各种寄存器。在一个实施例中,寄存器中的一个是“门铃寄存器”,在一个实施例中主机可以写入该“门铃寄存器”以通知存储器系统在sq162中有新的命令。命令找取器246配置为从sq162找取新的命令。命令解析器248配置为解析新的命令。在一个实施例中,命令解析器248分析命令中的数据指针字段,以确定存储器控制器应该如何处理存取数据缓冲器指针。

数据缓冲器指针储存器252用于将指针储存到主机存储器中的数据缓冲器。在一个实施例中,数据缓冲器指针储存器252用于储存nvmeprp条目。prp条目可以用在nvme中作为对主机存储器中的数据缓冲器的指针。在一个实施例中,对于每个存储器裸芯108存在一个数据缓冲器指针储存器252。缓冲器指针管理器250可以配置为从主机存储器存取数据缓冲器指针,并且将它们传送到数据缓冲器指针储存器252。

后端模块210包含调度器226、命令执行器228、误差校正控制器(ecc)引擎224和存储器接口230。

命令调度器226产生要发送到非易失性存储器裸芯108的命令序列,诸如编程、读取和擦除命令序列。命令执行器228监督这些命令的执行。

存储器接口230将命令序列提供给非易失性存储器裸芯108并且从非易失性存储器裸芯108接收状态信息。在一个实施例中,存储器接口230可以是双数据速率(ddr)接口。在一些实施例中,存储器接口203是闪速存储器接口。然而,非易失性存储器108中的存储器单元不限于闪速存储器。因此,存储器接口230不限于闪速存储器接口。在存储器108是闪速存储器的事件中,后端模块210可以包含闪速控制层,其控制后端模块210的整体操作。

ecc引擎224对从主机系统140接收的数据字节编码,并且对从非易失性存储器108读取的数据字节进行解码和误差校正。在一个实施例中,ecc引擎224包括低密度奇偶检查(ldpc)解码器。

dma253配置为控制数据在存储器系统100和主机系统140中的存储器160之间的直接存储器存取(dma)传送。例如,dma253可以从主机数据缓冲器168存取数据,并且将其传送到ram中的写入缓冲器(例如,图1b,122b)。dma253可以使用数据缓冲器指针166,该数据缓冲器指针166从主机接口220提供,以存取位于主机数据缓冲器168中的正确位置。dma253可以从ram122b中的读取缓冲器传送数据,并且传送到主机数据缓冲器168。dma253可以使用数据缓冲器指针166,该数据缓冲器指针166从主机接口220提供,以存取位于主机数据缓冲器168中的正确位置来传送从非易失性存储器108读取的数据。注意,对于读取和写入两者,后端模块210可以进行数据的附加处理,诸如误差校正、加扰等。因此,例如,向主机数据缓冲器168传送的数据通常不是从非易失性存储器108读取的原始数据。

图2b是企业环境的一个实施例的图。在该实施例中,sq162、cq和数据缓冲器指针166储存在储存器264(也被称为“储存单元”)中。储存器264可以通过(但不限于)ram、dram、reram来实现。在一个实施例中,储存器264是非易失性存储器108的部分。例如,储存器264可以是存储器阵列中的闪速存储器单元。储存器264通过一些物理通信链路来耦接到控制器122。储存器的储存sq162、cq和数据缓冲器指针166的部分可以充当控制器存储器缓冲器(cmb)。在一个实施例中,cmb符合nvme规范的cmb。在一个实施例中,储存器264中的提交队列(sq)162允许主机系统140将命令直接写入到存储器控制器的内部存储器空间。这减轻了存储器控制器从主机存储器存取命令的需要。在一个实施例中,储存器264中的数据缓冲器指针166允许主机系统140将数据缓冲器指针直接写入到存储器控制器的内部存储器空间。基于cmb的sq162、cq和数据缓冲器指针166可以以相似的方式使用,并且sq162、cq和数据缓冲器指针166储存在主机系统上。不同的是以存储器控制器的存储器空间来代替主机存储器使用。

控制器122具有储存控制器262,以管理在储存器264和控制器122中的储存器之间的传送数据。例如,来自储存器264的数据可以被传送到命令上下文储存器242、接口寄存器244和/或数据缓冲器指针储存器252。因此,命令上下文储存器242、接口寄存器244和/或数据缓冲器指针储存器252可以在控制器122的内部。该内部储存器可以是ram、寄存器等。

注意,在图2b的实施例中,可以存在任意数量的主机接口220。

在图2b的实施例中,主机存储器160含有数据缓冲器168。因此,控制器122可以基于数据缓冲器指针,将dma初始化到数据缓冲器168或者从数据缓冲器168初始化dma。然而,在一个实施例中,存储器控制器122首先将数据缓冲器指针从储存器264的区域166传送到数据缓冲器指针储存器252,该数据缓冲器指针储存器252在一个实施例中存在于控制器122内。

对于图2a和2b中描绘的实施例的其它变体是可能的。例如,sq162、cq164和数据缓冲器指针166的任何子集可以储存在存储器系统100的储存器264中。例如,在一个实施例中,sq162和cq164储存在储存器264中,但是数据缓冲器指针166储存在主机存储器160中。

图3a是主机命令320、主机数据缓冲器168和数据缓冲器指针的列表304的一个实例的图。在一个实施例中,主机数据缓冲器中的每一个是主机存储器中的物理页。另外,在一个实施例中,列表304中的每一个是主机存储器中的物理页。在一个实施例中,列表304存在于主机存储器160中的数据缓冲器指针166中。然而,注意,列表304可以存在于存储器系统100。例如,关于图2b的实施例,列表304可以存在于储存器264中的数据缓冲器指针166中,该储存器264通过物理通信链路来耦接到控制器122。

在一个实施例中,主机系统可以将主机命令320放置在主机存储器160中的sq162上。在一个实施例中,主机系统可以将主机命令320放置在储存器264中的sq162上。注意,主机命令302可以是用于存储器存取操作,诸如写入(还被称为“编程”)或者读取。命令标识符340可以用于识别命令。换言之,命令标识符340可以将一个读取命令与另一个读取命令进行区分等。存储器控制器122可以使用该命令标识符340来为完成队列(例如,图2a,164或者图2b,164)上的所完成的命令提供状态。命令类型342指示了命令的类型(例如,读取、写入等)。起始lba字段344指示了用于读取或者写入的起始逻辑区块地址(lba)。长度字段346是用于读取或者写入的长度。长度可以指定为逻辑区块的数量。注意,存储器控制器122可以将起始lba、以及由读取或写入的长度所指示的另一个lba,转换成非易失性存储器108中的物理地址。

主机命令320包含字段322和字段324。字段322和字段324可以包含数据指针。例如,字段322可以指向主机存储器中的数据缓冲器。在一个实施例中,字段324(如果使用)可以指向主机存储器中的数据缓冲器指针的列表。注意,在一些实施例中,字段324(如果使用)可以指向储存器264(参见图2b)中的数据缓冲器指针的列表。主机命令320还可以具有另一个字段。例如,各种字段可以用于数据管理——诸如数据是否是可压缩的,该命令是否是顺序请求、时延需求的一部分。

在该示例中,字段322含有主机存储器中的对第一数据缓冲器的指针。在一些实施例中,字段322具有零或者非零的偏移。偏移可以用于细化数据缓冲器的起始位置。图3b和10以及其描述提供了当在字段322中存在非零偏移时处理数据缓冲器指针的一个实施例的其它细节。

在该示例中,字段324含有对数据缓冲器指针304a的列表的指针。列表304a含有若干条目。除最后的条目之外的所有条目都含有主机存储器中的对数据缓冲器的指针。在本文中,主机系统的存储器中的对数据缓冲器的指针将被称为“数据缓冲器指针”。列表304a中的最后的条目含有对列表304b的指针。列表304b含有若干条目。除最后的条目之外的所有条目都含有主机存储器中的对数据缓冲器的指针。列表304b中的最后的指针含有对另一个列表304的指针(未在图3a中描绘)。在本文中,术语“列表指针”可以用于指代对包含数据缓冲器指针的列表的指针。然而,注意,列表还可以包含不是数据缓冲器指针的条目,诸如对另一个列表的指针。注意,最后的条目并不总是对另一个列表304的指针。最后的条目可以只是对主机数据缓冲器的指针。

在一个实施例中,当术语在nvme中使用时,字段322是物理区域页(prp)条目。物理区域页(prp)条目可以是主机存储器中的对物理存储器页的指针。prp可以用作存储器系统控制器和主机存储器之间的数据传送的分散/聚集机制。在一个实施例中,主机存储器中的物理存储器页的大小由主机系统配置。例如,主机系统可以指定每个物理存储器页是4kb、8kb、16kb或者一些其它大小。

在一个实施例中,prp条目可以是固定大小的。在一个实施例中,prp条目可以是64-位(例如,8字节)物理存储器页地址。然而,prp条目可以大于或小于64-位。prp条目可以具有页基底地址和偏移。在一个实施例中,prp条目的较低位指示主机存储器中的物理存储器页内的偏移。例如,如果存储器页是4kb,则位11:02可以形成偏移,如果存储器页是8kb,则位12:02可以形成偏移,等等。

在一个实施例中,字段324是对nvmeprp的列表的指针。因此,在一个实施例中,列表304是prp列表。作为一个示例,prp列表可以具有512个prp条目。例如,prp列表可以是4kb的大小,具有512个prp条目,该条目中的每一个是64位。然而,在prp列表304中可以存在更多或更少的prp条目。另外,prp列表可以大于或小于4kb。例如,8kbprp列表304可以含有1024个条目,该条目中的每一个是64位。在一个实施例中,prp列表304具有与主机存储器中的连续存储器的一个单个页相等的大小。

注意,主机命令320可以与数据缓冲器指针的多于一个列表304相关联。命令所需要的数据缓冲器指针的总数可以由命令参数和物理存储器页大小所隐含。列表304中的最后的条目可以是对数据缓冲器的指针或者是对下一个列表的指针。在最后的条目是对下一个列表的指针的事件中,该条目指向含有下一个列表304的主机存储器。注意,下一个列表304可以包括一个物理存储器页。

在一个实施例中,基于一个物理存储器页的大小,存储器控制器122能够确定给定列表304中的最后的条目的位置。在一个实施例中,基于是否需要更多数据缓冲器指针来满足读取或写入命令,存储器控制器122能够确定最后的条目是对另一个列表304的指针还是数据缓冲器指针。

可以存在大量的列表304。例如,命令可以是在非易失性储存器系统中读取256mb。如果每个数据缓冲器是4kb,则其可能需要约64,000个数据缓冲器——并且因此是64,000个列表条目。在每个列表条目是64位的情况下,这意味着数据缓冲器指针可以使用约512kb的储存器。

注意,对于一些读取或写入命令,不使用字段324。例如,如果读取仅对于一个数据缓冲器,则可以仅使用字段322。另外,在一些情形下,可以仅存在一个列表304。再次,同样,如果要读取或写入的数据量相对较少,则其可以是该情况。然而,当存在多个列表时,存储器控制器122更难以高效地管理来自例如主机存储器的数据缓冲器指针的存取。

本文公开的实施例足够快地找取数据缓冲器指针(例如,nvmeprp条目),以使得对主机存储器数据缓冲器的指针以及时的方式可用于dma。因此,实现了主机和存储器系统之间的高数据传送速率。然而,太快地找取数据缓冲器指针需要存储器装置上相当大的储存器。例如,当命令第一次由存储器系统接收时,是对要找取的命令的数据缓冲器指针的全部,这可能需要存储器装置的大量储存器。因此,本文公开的实施例避免了从主机存储器数据缓冲器找取数据缓冲器指针或者将数据缓冲器指针找取到主机存储器数据缓冲器,直到其马上被dma需要之前。因此,高效地使用了存储器系统上的存储器空间。例如,高效地使用了ram122b。

本文中公开的实施例在主机系统和存储器系统之间的物理接口(例如,pcie总线)之上高效地找取数据缓冲器指针。在一个实施例中,被一次存取的数据缓冲器指针的数量适合于pcie总线上的高效传输。

本文中公开的实施例通过主机系统和存储器系统之间的物理接口(例如,pcie总线)在用于传送数据的数据信息包中高效地找取数据缓冲器指针。例如,pcie可以使用事务层信息包(tlp)。例如,在一些配置中,64字节的tlp载荷大小可以是最佳效率。在这种情况下,在一个tlp信息包中找取的数据缓冲器指针的数量(例如,nvmeprp)可以包括64字节的数据。然而,在其它配置中,多于或少于64字节可以是tlp载荷大小的最佳效率。

在一个实施例中,来自主机的命令中的第一数据缓冲器指针可以具有偏移。图3b示出了与图3a相似的主机命令、主机数据缓冲器和数据缓冲器指针的列表的一个实例的图。未示出图3a中的列表304b以便简化该图。另外,图3b中的命令320中的字段322中的对第一数据缓冲器的指针具有非零偏移。通过这个偏移,第一主机缓冲器的大小少于其它缓冲器的大小。例如,缓冲器168(1)到168(24)每个可以是4kb。然而,缓冲器168(0)的使用部分通过偏移的大小可以少于4kb。注意,数据缓冲器可以由数据缓冲器的大小(其可以是由主机指定的固定值)和数据缓冲器指针所指向的主机存储器地址来限定。例如,在一个实施例中,对数据缓冲器168(1)、168(2)等的指针指向数据缓冲器的起点。

偏移可以使得主机系统和存储器系统之间的所有传送是不对齐的。例如,存储器系统可能想要传送第一个64kb。假设4kb数据缓冲器,这对应于八个完整的主机数据缓冲器。在该示例中,数据传送需要字段322中的对第一缓冲器的指针,以及第一列表304a中的八个数据缓冲器指针。这八个数据缓冲器指针指向数据缓冲器168(1)到168(8)。然而,与该示例的64kb传送相关联的最后的主机数据缓冲器(例如,168(8))由于偏移将不会从该64kb数据完全占据。

当传送在缓冲器中顺序地接续的64kb时,数据缓冲器168(8)的剩余部分可能被占据。为了避免数据缓冲器指针的多次找取,在一个实施例中使用了剩下的数据缓冲器指针储存器(图7,714)。剩下的数据缓冲器指针储存器714用于储存与未被完全占据的数据缓冲器相对应的数据缓冲器指针。例如,对数据缓冲器168(8)的数据缓冲器指针可以储存在剩下的数据缓冲器指针储存器714中。在一个实施例中,响应于对数据缓冲器指针找取的请求,缓冲器指针管理器250首先检查是否任何需要的数据缓冲器指针(例如,nvmeprp条目)储存在剩下的数据缓冲器指针储存器714中。如果是这样,不需要从主机存储器找取这些数据缓冲器指针。其通过不必再次找取这些数据缓冲器指针(例如,prp条目)而提供了相当大的性能改善。

注意,在以上的场景中,在剩下的数据缓冲器指针储存器714中保存的数据缓冲器指针是在64kb数据传送的结束处。另一个可能是在64kb传送的起点处保存数据缓冲器指针。例如,存储器控制器可以接着进行64kb数据传送,该数据传送部分填充了数据缓冲器168(16),完全填充了数据缓冲器168(17)到168(23),并且部分填充了数据缓冲器168(24)。在这种情况下,对数据缓冲器168(16)和168(24)两者指针可以保存在剩下的数据缓冲器指针储存器714中。后来的传送可以涉及数据缓冲器168(8)到168(16)(其中数据缓冲器168(8)被部分写入,并且数据缓冲器168(16)的剩余被填满)。在这种情况下,存储器控制器不需要再次传送对数据缓冲器168(16)的指针。因此,在该示例中,存储器控制器不需要在数据传送结束时来传送对数据缓冲器的数据缓冲器指针。

另外,在前面注意,避免了对一次传送九个数据缓冲器指针的需要。在一些实施例中,当传送八个数据缓冲器指针而不是九个数据缓冲器指针时,通过pcie总线的传送是更为高效的。

图4是操作非易失性储存器系统的过程400的一个实施例的流程图。过程400可以由存储器系统100中的控制电路进行。在一个实施例中,存储器控制器122进行过程400。在一个实施例中,过程400在诸如图2a所描绘的环境中进行,在该环境中主机系统140含有sq162、cq164和数据缓冲器指针166。在一个实施例中,过程400在诸如图2b所描绘的环境中进行,在该环境中存储器系统100含有sq162、cq164和数据缓冲器指针166。在一个实施例中,过程400在主机系统140含有数据缓冲器指针166的环境中进行,但是存储器系统具有sq162和cq164。在一些实施例中,主机系统140具有数据缓冲器166。在一些实施例中,数据缓冲器指针166是nvmeprp条目。

在步骤402处,存储器控制器122从主机系统存取命令,以在存储器系统100中进行非易失性储存器的存储器存取。该命令可以是读取操作或者写入操作。在一个实施例中,该命令指定了起始lba和长度。因此,命令可以是在一些lba处(根据长度)进行读取或写入。在一个实施例中,存储器控制器122从主机存储器160中的sq162存取命令。在一个实施例中,存储器控制器122从存储器系统100(例如,储存器264,图2b)上的sq162存取命令。在一个实施例中,命令具有列表指针。列表指针指向包含对主机系统中的数据缓冲器的数据缓冲器指针的列表。

在步骤404处,存储器控制器122确定主机系统数据缓冲器的dma需要什么数据缓冲器指针。可能的是,这些数据缓冲器指针中的一些从先前的dma保存。在一个实施例中,可能的是,保存了在先前的dma的起点和/或结束处的数据缓冲器指针。

在步骤406处,存储器控制器122确定是否所需的数据缓冲器指针中的任一个目前储存在存储器系统中。例如,存储器控制器122确定是否所需的数据缓冲器指针中的任一个保存在命令上下文储存器242中。如果是这样,在步骤408处,存储器控制器122存取所保存的(多个)数据缓冲器指针。注意,这减轻了通过例如pcie总线来存取该数据缓冲器指针的需求。这可以提供相当高效的操作。

在步骤410处,存储器控制器122为dma存取对主机数据缓冲器的数据缓冲器指针。在从先前的dma未保存任何指针的事件下,该步骤可以找取dma的数据缓冲器指针的全部。在存在一个或多个从先前的dma保存的指针的事件下,其可以找取dma所需的剩余数据缓冲器指针。

在一个实施例中,存储器控制器122仅存取dma所需的数据缓冲器指针。例如,如果dma需要八个数据缓冲器指针,则存储器控制器可以仅找取八个数据缓冲器指针。存储器控制器122可以将该找取基于命令中的列表指针。然而,注意,命令可以与数据缓冲器指针的多个列表相关联。在一个实施例中,存储器控制器使用命令中的列表指针来定位另一个列表指针,例如,在主机存储器中的。

在一个实施例中,在步骤410中,存储器控制器122从主机存储器160找取数据缓冲器指针。在一个实施例中,在步骤410中,存储器控制器122从储存器264(参见图2b)找取数据缓冲器指针。

步骤412用于存储器控制器122进行存储器系统100和由数据缓冲器指针所指定的主机存储器数据缓冲器之间的dma。在一个实施例中,dma是从存储器系统100中的读取缓冲器到主机存储器中的数据缓冲器。在一个实施例中,dma是从主机存储器中的数据缓冲器到存储器系统中的写入缓冲器。

步骤414是确定dma是否完全地存取了所有数据缓冲器。例如,对于读取操作,dma可以仅具有部分填充的数据缓冲器中的一个或多个。作为一个示例,数据缓冲器可以是4kb。dma可以将少于4kb的数据写入到数据缓冲器中的一个。对于写入操作,dma可以从数据缓冲器中的一个或多个的仅一部分来存取数据。在这种情况下,dma可以为数据缓冲器中的一个读取少于4kb。对于其它数据缓冲器(其被完全地存取),可以已经写入或读取4kb。

如果存在未完全存取的缓冲器,则对该数据缓冲器的数据缓冲器指针被保存在例如命令上下文储存器242中。过程400然后返回到步骤404,以处理另一个dma。

图5是对读取命令从存储器系统到主机系统进行dma的过程500的一个实施例的流程图。该处理500假设命令与数据缓冲器指针的多个列表(例如,多个nvmeprp列表)相关联。将相对于图3a或3b的示例命令320来讨论过程500,但是不限于此。

在步骤502中,“门铃”响起。门铃是一种机制,通过该机制,主机系统告知存储器系统:新的命令在提交队列(sq)162上准备好了。在一个实施例中,存储器控制器122具有门铃寄存器,其中主机系统写入以“响起门铃”。

在步骤504中,存储器控制器122响应于门铃从sq162找取新的命令。在一个实施例中,存储器控制器122从主机存储器160(例如,命令队列162,图2a)存取新的命令。在一个实施例中,存储器控制器122从存储器系统中的ram(例如,储存器264中的sq162,图2a)存取新的命令。

在步骤506中,存储器控制器122将字段322中的数据指针添加到该命令的命令上下文储存器。注意,这是在该示例中的对数据缓冲器的指针。存储器控制器122还将字段324中的列表指针添加到该命令的命令上下文储存器。

注意,命令解析器248可以解析命令,以基于字段324应该如何处理确定数据缓冲器指针(例如,nvmeprp条目)。例如,如果字段324不是列表指针,则数据缓冲器指针处理不需要使用过程500。

步骤508用于存储器控制器122来将命令发布到存储器裸芯,以进行读取操作。注意,其假设了来自主机的读取命令涉及多个存储器裸芯上的物理位置。读取不需要涉及多个存储器裸芯,在这种情况下存储器控制器可以将读取命令发布到一个存储器裸芯。

步骤510包含存储器控制器122接收指示,其指示从存储器裸芯中的一个所读取的数据即将准备好以用于dma。然而,注意,这不一定是来自存储器裸芯的原始数据。典型地,误差校正由ecc224进行。另外,可以采取其它步骤,诸如解密或加密。因此,在其被放置于读取缓冲器中用于传送到主机系统之前,从存储器裸芯所读取的数据可以通过存储器控制器中的管道。

在一个实施例中,dma是用于预定数量的主机数据缓冲器。例如,dma可以用于八个主机数据缓冲器。作为一个示例,每个主机数据缓冲器是4k字节,其可以是用于32k字节的dma。

步骤512包含存储器控制器存取用于读取的这部分的数据缓冲器指针(例如,nvmeprp)。这些数据缓冲器指针可以储存在存储器裸芯(数据从该存储器裸芯读取)的数据缓冲器指针储存器252中。

步骤514是等待,直到数据准备好被dmad。在一个实施例中,当其被放置到存储器系统100的ram122b中的读取缓冲器中时,数据准备好被dmad。如以上提到的,在其被放置到读取缓冲器中用于传送到主机系统之前,数据可以通过存储器控制器中的管道。

在步骤516中,存储器控制器使用数据缓冲器指针来从存储器控制器到主机数据缓冲器进行数据的dma。

在一个实施例中,存储器控制器利用了步骤510的指示和步骤514中准备好传送数据之间的短延迟的优势,来在步骤512中找取数据缓冲器指针。基于以下因素,可以容易地计算(或者至少估计)延迟:从将读取命令发布到存储器裸芯直到存储器裸芯将数据发送到存储器控制器通常将花费多长时间,处理数据(例如,ecc加密/解密等)通常将花费存储器控制器多长时间,以及从主机存储器(或者替代地储存器264)找取数据缓冲器指针通常将花费多长时间。存储器控制器122对找取计时,使得在数据准备好传送到主机数据缓冲器的时候,数据缓冲器指针准备好用于dma。因此,数据缓冲器指针可以被“恰好及时地”提供。

然而,存储器控制器122避免了过早地找取数据缓冲器指针(例如,nvmeprp)使得存储器空间为了保持dma还不需要的数据缓冲器指针而被浪费。另外,在实施例中,存储器控制器122避免了多于一次地找取数据缓冲器指针(例如,nvmeprp)。在一个实施例中,这可能是因为存储器控制器122不找取数据缓冲器指针,直到知道dma准备好。与此相反,可能找取大量数据缓冲器指针(不管它们是否需要)的一些技术可以结束数据缓冲器指针的覆写,并且因此需要重新找取该数据缓冲器指针。这不仅浪费了存储器系统上的存储器空间,也浪费了存储器系统和主机之间的数据总线的传输带宽。与此相反,本文公开的一些实施例通过仅通过总线来传送每个数据缓冲器指针(例如,每个nvmeprp)一次,高效地使用总线带宽。

图6是对写入命令从存储器系统到主机系统进行dma的过程600的一个实施例的流程图。该处理600假设命令与数据缓冲器指针的多个列表(例如,多个nvmeprp列表)相关联。将相对于图3a或3b的示例命令320来讨论过程600,但是不限于此。

在步骤602中,“门铃”响起。在步骤604中,响应于门铃,存储器控制器122从sq162找取新的命令。在步骤606中,存储器控制器122将字段322中的数据指针添加到该命令的命令上下文储存器。步骤602、604和606可以分别相似于过程500的步骤502、504和506。

在步骤608中,存储器控制器122确定写入缓冲器即将准备好用于新的数据。在一个实施例中,该写入缓冲器是存储器系统100中的缓冲器,该缓冲器用于储存要被写入到存储器裸芯108的数据。写入缓冲器可以用于储存从主机存储器160中的数据缓冲器存取的数据。

步骤610包含存取用于写入的部分的数据缓冲器指针(例如,nvmeprp)的存储器控制器。例如,存储器控制器可以确定,要被写入的数据的一些32k字节的部分需要怎样的数据缓冲器指针。这些数据缓冲器指针可以储存在存储器裸芯(数据要被写入到该存储器裸芯)的数据缓冲器指针储存器252中。

步骤612是确定写入缓冲器是否具有用于要从主机数据缓冲器传送的数据的空间。如果不是,过程等待。当充足的空间可用时,处理在步骤614处继续。

在步骤614中,存储器控制器使用数据缓冲器指针来从主机数据缓冲器到写入缓冲器进行数据的dma。

在步骤616中,存储器控制器将命令发布到要写入数据的存储器裸芯,以进行写入操作。过程600然后可以返回步骤608,其指示存储器控制器再次确定写入缓冲器即将准备好用于新的数据。

在一个实施例中,在步骤610中,存储器控制器利用了步骤608的指示和步骤612中准备好写入缓冲器之间的短延迟的优势来找取数据缓冲器指针。

图7是命令上下文储存器242、环缓冲器752、缓冲器指针管理器250和主机存储器160的一个实施例的图。环缓冲器752是数据缓冲器指针储存器252的一个实施例。

在一个实施例中,对于每个显著的读取或写入命令可以存在一个命令上下文储存器242(1)到242(n)。命令上下文储存器具有字段702,其可以用于储存来自主机命令的数据缓冲器指针。在一个实施例中,字段702用于储存来自图3的示例的命令320中的字段322的值。在图7中,该值被称为prp1,并且是被称为“data_ptr0”的数据缓冲器指针。这可以是主机存储器中的数据缓冲器的序列中的第一个。

字段704可以用于储存来自命令320的列表指针。在一个实施例中,字段704用于储存来自图3的示例的命令320中的字段324的值。在图7中,该值被称为prp2,并且是被称为“list_ptr0”的列表指针。注意,其指向主机存储器160中的数据缓冲器指针的第一列表304(1)。

prptr_a706可以用于储存对数据缓冲器指针的列表(例如,nvmeprp的列表)的指针。pptr_a_index708是用于prptr_a706中储存的指针的索引。索引是从零开始向上的整数,其指示了正在指向哪个列表304。零的值可以用于指示prptr_a706中的值未指向任何列表。如提到的,命令可以与数据缓冲器指针304的多个列表相关联。这些列表304可以基于其主机存储器地址来编号。

prptr_b710可以用于储存对prp的列表的指针。pptr_b_index712是用于prptr_b710中储存的指针的索引。索引是从零开始向上的整数,其指示了正在指向哪个列表304。零的值可以用于指示prptr_b710中的值未指向任何列表。

剩下的数据指针缓冲器可以储存当字段702中的第一数据缓冲器指针具有偏移时的相关的值。图10提供了使用剩下的数据指针缓冲器714的一个实施例的其它细节。在一个实施例中,剩下的数据指针缓冲器714储存剩下的nvmeprp条目。

主机存储器160包含数据缓冲器指针(例如,nvmeprp)的多个列表。在该示例中,存在列表304(1)和304(2)。与列表304相关联的值“1”(或“2”)是指索引。可以存在许多更多的列表304,其每个具有他们自身的索引。

在一个实施例中,对每个存储器裸芯都存在一个环缓冲器752。环缓冲器752每个都储存数据缓冲器指针。在一个实施例中,环缓冲器752储存nvmeprp。在一个实施例中,环缓冲器252(1)到252(m)每个都是圆形(环)缓冲器。在一个实施例中,从给定存储器裸芯读取的数据按顺序地传送到主机数据缓冲器。通过“按顺序”,其是指按照给定存储器裸芯的环缓冲器中的指针的顺序。然而,来自不同存储器裸芯的数据相对于其它存储器裸芯不必要按顺序传送。例如,如果这两个数据指针与从两个不同存储器裸芯读取的数据相关联,则在对被data_ptr2(两者都在列表304(1)中)所指向的数据缓冲器进行dma之前,存储器系统100可以对被data_ptrn所指向的数据缓冲器进行dma。因此,缓冲器指针管理器250可以配置为相对于其它存储器裸芯的环缓冲器不按顺序地进行对于给定存储器裸芯的环缓冲器的dma。

缓冲器指针管理器250配置为从命令上下文储存器242存取列表指针,并且使用这些来存取来自主机存储器160的数据指针和其它列表指针。缓冲器指针管理器250配置为将数据缓冲器指针传送到适当的环缓冲器252。例如,缓冲器指针管理器250配置为传送与存储器裸芯相关联的环缓冲器252的数据指针,该存储器裸芯将进行与这些数据指针相关联的读取或写入。缓冲器指针管理器250配置为向命令上下文储存器传送新的列表指针。

图8是管理列表指针的过程800的一个实施例的流程图。该过程800可以与图7的上下文储存器的一个实施例一起使用,但是不限于此。当来自主机系统140的新的命令正在由存储器控制器处理时,过程800开始。在一个实施例中,当存储器控制器122接收到具有与其相关联的数据缓冲器指针的多个列表的命令时,存储器控制器122进行过程800。例如,当存储器控制器122接收到具有与其相关联的多个nvmeprp列表的命令时,存储器控制器122可以进行过程800。

在步骤802中,存储器控制器122在pptr_a706中储存列表指针。此外,存储器控制器可以在字段702和704中储存指针。参考图3的示例,来自字段322的对第一缓冲器的指针可以储存在字段702中,并且来自字段324的列表指针可以储存在字段704中。来自字段324的列表指针还可以储存在pptr_a706中。

步骤804包含将pptr_a_index设定为识别哪个列表304储存在pptr_a706中。参考图7的示例,最初,pptr_a_index可以设定为“1”,以指示pptr_a706指向列表304(1)。注意,此时,pptr_b_index可以设定为“0”,以指示pptr_b710不包含高效列表指针。

在处理命令的某些点处,可以存在对列表304(对于该列表304,存储器系统不具有列表指针)中的数据缓冲器指针(例如,nvmeprp条目)的需求。换言之,存储器系统不具有对某一列表304的列表指针。这可以是因为字段704、706或者710中没有一个具有诸如列表指针。当其发生(步骤806=是)时,然后存储器控制器可以存取新的列表指针并且将其储存到pptr_b710。存储器控制器122可以确定以下需要哪个数据缓冲器指针(例如,nvmeprp条目)。参考图7的示例,第一列表304(1)含有若干数据指针(data_ptr1–data_ptrn)。存储器控制器122可以确定所需的数据缓冲器指针不在列表304(1)中的某处。为了如此进行,存储器控制器122知道多少数据缓冲器指针是在列表304(1)上以及多少逻辑区块与列表相关联。在一个实施例中,每个数据缓冲器指针与一个逻辑区块相关联。因此,存储器控制器可以确定逻辑区块的哪个范围对应于列表304(1)。这仅仅是用于确定所需的数据缓冲器指针是否在列表304(1)中的一个示例。

为了讨论,存储器控制器122确定dma需要列表304(2)内的数据缓冲器指针。存储器控制器存取来自列表304(1)的末端的list_ptr1。注意到list_ptr1指向列表304(2)。因此,list_ptr1可以储存在pptr_b710中。在一个实施例中,列表指针从主机存储器存取(例如,从主机存储器160中的数据缓冲器指针166,图2a)。在一个实施例中,列表指针从主机存储器存取(例如,从主机存储器264中的数据缓冲器指针166,图2b)。

另外,在步骤810中,索引“2”可以储存在pptr_b_index712中,以识别储存在pptr_b710中的列表指针指向列表304(2)。注意,pptr_b710可以指向一些其它列表,在这种情况下pptr_b_index712被设定为该列表304的相对索引。

在某些点处,dma可以需要另一个列表指针。当存储器控制器确定需要一个指针(步骤812=是)时,过程800返回到步骤802。这次,储存在pptr_a706中的列表指针以新的列表指针来覆写。例如,存储器控制器可以在pptr_a706中储存来自的列表304(2)的末端的list_ptr2。在这种情况下,存储器控制器可以在pptr_a_index708中储存索引”3”,以指示哪个prp列表通过pptr_a706指向。

过程800可以继续使用pptr_a706和pptr_b710来作为”乒乓”缓冲器(”ping-pong”buffer),其中当dma需要新的列表指针时覆写最老的列表指针。

注意,不需要顺序地使用列表304。当然,可能接下来可以需要跳过索引的列表304。另外,注意,多于或少于两个列表指针可以储存在一个命令的命令上下文中。例如,对第三列表指针可以存在pptr_c和pptr_c_index。另外,在一个实施例中,不需要pptr_b_index712和pptr_b710。

图9是存取数据缓冲器指针的过程900的一个实施例的流程图。过程900是过程400的步骤410的一个实施例。在一个实施例中,过程400用于存取nvmeprp条目。在一个实施例中,数据缓冲器指针从主机存储器存取(例如,从主机存储器160中的数据缓冲器指针166,图2a)。在一个实施例中,数据缓冲器指针从主机存储器存取(例如,从主机存储器264中的数据缓冲器指针166,图2b)。

在步骤902中,存储器控制器计算dma需要哪个数据缓冲器指针(例如,nvmeprp条目)。在一个实施例中,存储器控制器基于主机的逻辑地址来做出该计算。存储器控制器可以在主机系统所使用的逻辑地址和非易失性储存器中的物理地址之间进行转换。因此当例如存储器控制器即将传送从某些物理地址读取的一些数据单元时,存储器控制器可以将这些物理地址转换成逻辑地址。回想到,起始逻辑地址可以在来自主机系统的读取命令中指定。还回想到,数据缓冲器指针可以是某一大小(例如,64位)并且每个数据缓冲器可以是某一大小(例如,4kb)。采用这些信息,存储器控制器能够确定,所需的数据缓冲器指针(对于lba)存在于进入数据缓冲器指针的列表的多远处。

在步骤904处,存储器控制器确定与所需的数据缓冲器指针相关联的列表指针是否储存在存储器系统100中。在一个实施例中,缓冲器指针管理器250确定字段706或者710是否含有所需的列表指针。在一个实施例中,缓冲器指针管理器250计算哪个索引用于所需的列表304。换言之,缓冲器指针管理器250计算所需的数据缓冲器指针是否在第一列表304(1)、第二列表304(2)、第三列表、第四列表等中。缓冲器指针管理器250可以简单地检查字段708和712,以确定是字段708还是712含有所需的列表的索引。

如果所需的列表指针已经储存在存储器系统100中,则存储器控制器可以使用该列表指针来从主机存储器中的相关列表找取所需的数据缓冲器指针。例如,存储器控制器可以使用来自字段706的pptr_a或者来自字段710的pptr_b,来确定列表304的起始位置。然后,存储器控制器确定所需数据缓冲器指针存在于进入该列表的多远处。

在一个实施例中,存储器控制器仅从列表存取所需的数据缓冲器指针。例如,可能只需要512个数据缓冲器指针的列表之中的八个数据缓冲器指针。在一个实施例中,存储器控制器经由pcie总线通过获得单个事务层信息包(tlp)信息包来存取所需的数据缓冲器指针。因此,可以相对于pcie总线使用而非常高效地获得所需的数据缓冲器指针。注意,为了通过pcie总线的高效传送可以优化所获得的数据缓冲器指针的数量。在一些情况下,多于或少于八个数据缓冲器指针可以使得pcie总线更高效地使用。

在一个实施例中,所找取的数据缓冲器指针可以储存到适当的环缓冲器中。例如,数据缓冲器指针可以与某一存储器裸芯的读取操作相关联。因此,数据缓冲器指针可以放置到该存储器裸芯的环缓冲器中。

如果所需的列表指针还未储存在存储器系统100(步骤904=否)中,则在步骤908中,存储器控制器从主机存储器中的相关列表找取所需的列表指针。例如,存储器控制器可以使用来自字段706的pptr_a或者来自字段710的pptr_b,来确定列表304中的一个的起始位置。[注意,在该示例中,pptr_a或pptr_b都不是所需的列表指针。]然后,存储器控制器可以确定所需的列表指针存在于与该列表的起点相距多远的地方。参考图7,作为一个示例,假设所需的列表指针是在列表304(2)的末端处的list_ptr2。在这种情况下,存储器控制器可以基于列表304(2)的起点和列表304(2)的长度来确定list_ptr2的位置。注意,存储器控制器可以采用新的列表指针来覆写在字段706或字段710中的列表指针。

在步骤910中,存储器控制器从主机存储器中的相关列表找取所需的数据缓冲器指针。该步骤可以相似于步骤906,现在所需的列表指针是现在可用的。

图10是当第一数据缓冲器指针具有非零偏移时管理数据缓冲器指针的过程1000的一个实施例的流程图。图10提供了过程400的一个实施例的其它细节。在图10中,该示例是关于读取命令的。然而,该过程可以修改为写入命令。图7的命令上下文242可以用于过程1000中,但是过程1000不限于该示例。在一个实施例中,过程1000由图2a中的存储器控制器进行。在一个实施例中,过程1000由图2b中的存储器控制器进行。然而,过程1000不限于图2a或者2b。

在步骤1002中,存储器控制器确定给定的dma所需要的数据缓冲器指针(例如,nvmeprp条目)。这可以是例如64kbdma。然而,dma可以是一些其它的大小。其可以是写入或者读取。

在步骤1004中,存储器控制器确定prp1是否具有非零偏移。例如,缓冲器指针管理器250可以确定命令上下文储存器242的字段702中的“data_ptr0”是否具有非零偏移。该偏移可以位于这个字段702中的位的某一范围中。

如果不存在非零偏移(步骤1004=否),则可以如过程900中的步骤904-910来继续处理。如果存在非零偏移(步骤1004=是),则可以在步骤1006处继续处理。注意,图3b中描绘了非零偏移的示例。在步骤1006中,存储器控制器确定,是否任何所需要的数据缓冲器指针(例如,nvmeprp条目)储存在剩下的数据缓冲器指针储存器714中。例如,这些可以是上述示例中提到的数据传送的第一个和/或最后一个数据缓冲器指针。

如果所需要的数据缓冲器指针中的任一个是在剩下的数据缓冲器指针储存器714中,则在步骤1008中,从剩下的数据缓冲器指针储存器714来存取这些数据缓冲器指针。在一个实施例中,这些数据缓冲器指针可以传送到适当的环缓冲器。另外,从剩下的数据缓冲器指针储存器714所存取的数据缓冲器指针可以从剩下的数据缓冲器指针储存器714丢弃。在一个实施例中,由于将不再需要这些数据缓冲器指针,因此这节约了存储器空间。在本文中,“丢弃”数据缓冲器指针是指允许储存了数据缓冲器指针的存储器空间被释放,使得该空间可以用于另一个数据缓冲器指针。这可以通过将存储器空间标记为可用于另一个数据缓冲器指针来完成。这不需要存储器空间的物理改变。例如,在稍后的某些时间点,被丢弃的数据缓冲器指针可以被覆写。存储器控制器可以提示哪个存储器位置目前具有高效的(未丢弃的)数据缓冲器指针以及剩下的数据缓冲器指针储存器714中的哪个存储器位置是空闲的。然后,可以如过程900中的步骤904-910来继续处理,以便获得用于该数据传送的其它数据缓冲器指针。

如果所需的数据缓冲器指针中没有一个是在剩下的数据缓冲器指针储存器714中,则可以如过程900中的步骤904-910来继续处理,以便获得用于该数据传送的全部数据缓冲器指针。

在步骤1010中,存储器控制器确定是否存在将要在数据传送之后被完全占据的任何主机数据缓冲器。例如,在数据传送之后,第一个和/或最后一个主机数据缓冲器可能将不会被完全占据。如果如此,则在步骤1012中,与这些未被完全占据的数据缓冲器相关联的数据缓冲器指针储存在剩下的数据缓冲器指针储存器714中。完全占据是指,例如整个4kb数据缓冲器将具有写入到其中的数据。数据缓冲器可以是另外的大小。

如果主机数据缓冲器将被完全占据,则该过程可以结束,而不保存剩下的数据缓冲器指针储存器714中的任何数据缓冲器指针。另外,在进行步骤1012的事件下,任何被完全占据的对应于数据缓冲器的数据缓冲器指针不被储存在剩余数据缓冲器指针储存器714中。

在进行dma之后,dma中涉及的数据缓冲器指针的全部可以在环缓冲器752中。在一个实施例中,缓冲器指针管理器250确定,dma中涉及的环缓冲器752中的数据缓冲器指针现在可以被覆写。因此,在dma之后,无论是否进行步骤1012,环缓冲器752中的数据缓冲器指针可能丢失。

还可以提供相应的方法、系统以及具有用于进行本文中提供的方法的可执行代码的计算机-或处理器-可读储存装置。

已经为图示和描述的目的呈现了本发明的详细描述。其不意图穷举或将本发明限制为所公开的精确形式。鉴于以上教导,可以进行诸多修改和变体。选择所描述的实施例,以便最佳地解释本发明的原理及其应用,以由此使得本领域其它技术人员能够在各种实施例中且以如适合于预期的特定用途的各种修改中最佳地利用本发明。本发明的范围意图由所附权利要求限定。

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