加快去分配命令处理的方法与存储设备
技术领域
本发明涉及存储技术领域,尤其涉及一种处理去分配命令、读命令的方法、存储设备和计算机程序。
背景技术
主机同存储设备之间可通过多种方式相耦合,耦合方式包括但不限于通过例如SATA、IDE、USB、PCIE、NVMe(NVM Express)、SAS、以太网、光纤通道、无线通信网络等连接主机与存储设备。主机可以是能够通过上述方式同存储设备相通信的信息处理设备,例如,个人计算机、平板电脑、服务器、便携式计算机、网络交换机、路由器、蜂窝电话、个人数字助理等。
图1为存储设备的框图。固态存储设备102同主机相耦合,用于为主机提供存储能力。主机同固态存储设备102之间可通过多种方式相耦合,耦合方式包括但不限于通过例如SATA(Serial Advanced Technology Attachment,串行高级技术附件)、SCSI(SmallComputer System Interface,小型计算机系统接口)、SAS(Serial Attached SCSI,串行连接SCSI)、IDE(Integrated Drive Electronics,集成驱动器电子)、USB(Universal SerialBus,通用串行总线)、PCIE(Peripheral Component Interconnect Express,PCIe,高速外围组件互联)、NVMe(NVM Express,高速非易失存储)、以太网、光纤通道、无线通信网络等连接主机与固态存储设备102。主机可以是能够通过上述方式同存储设备相通信的信息处理设备,例如,个人计算机、平板电脑、服务器、便携式计算机、网络交换机、路由器、蜂窝电话、个人数字助理等。存储设备102包括接口103、控制部件104、一个或多个NVM(非易失存储器,Non-Volatile Memory)芯片105以及DRAM(Dynamic Random Access Memory,动态随机访问存储器)110。NAND闪存、相变存储器、FeRAM、MRAM等是常见的NVM。接口103可适配于通过例如SATA、IDE、USB、PCIE、NVMe、SAS、以太网、光纤通道等方式与主机交换数据。控制部件104用于控制在接口103、NVM芯片105以及DRAM 110之间的数据传输,还用于存储管理、主机逻辑地址到闪存物理地址映射、擦除均衡、坏块管理等。可通过软件、硬件、固件或其组合的多种方式实现控制部件104。控制部件104可以是FPGA(Field-programmable gate array,现场可编程门阵列)、ASIC(Application Specific Integrated Circuit,应用专用集成电路)或者其组合的形式。控制部件104也可以包括处理器或者控制器,在处理器或控制器中执行软件来操纵控制部件104的硬件来处理IO命令。控制部件104还耦合到DRAM110,并可访问DRAM 110的数据。在DRAM可存储FTL表和/或缓存的IO命令的数据。
控制部件104包括闪存接口控制器(或称为闪存通道控制器)。闪存接口控制器耦合到NVM芯片105,并以遵循NVM芯片105的接口协议的方式向NVM芯片105发出命令,以操作NVM芯片105,并接收从NVM芯片105输出的命令执行结果。NVM芯片105的接口协议包括“Toggle”、“ONFI”等公知的接口协议或标准。
存储器目标(Target)是NAND闪存封装内的共享芯片使能(CE,Chip Enable)信号的一个或多个逻辑单元(Logic Unit)。每个逻辑单元具有逻辑单元号(LUN,Logic UnitNumber)。NAND闪存封装内可包括一个或多个管芯(Die)。典型地,每个逻辑单元对应于单一的管芯。逻辑单元可包括多个平面(Plane)。逻辑单元内的多个平面可以并行存取,而NAND闪存芯片内的多个逻辑单元可以彼此独立地执行命令和报告状态。在可从http://www.micron.com/~/media/Documents/Products/Other%20Documents/ONFI3_0Gold.ashx获得的“Open NAND Flash Interface Specification(Revision 3.0)”中,提供了目标(target)、逻辑单元、LUN、平面(Plane)的含义参见,其为现有技术的一部分。
存储介质上通常按页来存储和读取数据,而按块来擦除数据。块包含多个页。存储介质上的页(称为物理页)具有固定的尺寸,例如17664字节。当然,物理页也可以具有其他的尺寸。
在固态存储设备中,逻辑地址构成了操作系统等上层软件所感知到的固态存储设备的存储空间。物理地址是用于访问固态存储设备的物理存储单元的地址。
在ATA8-ACS2中定义了Trim(修剪)命令,具有相同或类似含义的命令在SCSI(Small Computer System Interface,小型计算机系统接口)规范中被称为UNMAP(解除映射),而在NVMe规范中被称为Deallocate(去分配)。下文中,用“去分配”来指示具有同ATA8-ACS2的“修剪”、SCSI的“解除映射”、NVMe的“去分配”具有相同或相似功能的数据集管理命令,以及也指示在其他或将来的协议、规范或技术中出现的具有相同或相似功能的命令。
在去分配命令中,描述了逻辑地址范围。在执行了去分配命令后,可以有不同的效果。例如,(1)执行去分配命令后,再读取去分配命令所指示的逻辑地址范围时,所得到的是确定的(执行对该逻辑地址范围的其他写入操作之前);(2)执行去分配命令后,再读取去分配命令所指示的逻辑地址范围时,所得到的结果是全0(执行对该逻辑地址范围的其他写入操作之前);(3)执行去分配命令后,再读取去分配命令所指示的逻辑地址范围时,所得到的结果可以是任意值(执行对该逻辑地址范围的其他写入操作之前)。在去分配命令或者其他命令中可设置或选择去分配命令的执行效果。
通过使用去分配命令,主机能够告知固态硬盘哪些逻辑地址空间不再存储有效数据,从而固态硬盘在回收存储空间时,不必搬移已经失效的数据。然而,现有技术中,在执行去分配命令过程中,需要大量的内存访问操作,这严重延长了对去分配命令进行处理的时间,并影响固态硬盘的性能,进而影响同时发生的IO命令的执行。
发明内容
本发明的目的在于提供一种去分配方法、存储设备和计算机程序,用于在高速对去分配命令进行处理时,不影响同时发生的IO命令的执行。
本发明的第一方面提供一种去分配方法,该方法包括:根据去分配命令获取去分配命令指示的逻辑地址范围;更新去分配表,将去分配命令指示的逻辑地址范围对应的去分配表的表项设置为第一指定值;其中去分配表用于记录FTL表中的逻辑地址是否被分配的信息;指示去分配命令执行完成。
结合本发明的第一方面,在第一种可能的实现方式中,去分配方法还包括:更新FTL表,将去分配命令指示的逻辑地址范围对应的FTL表的表项设为第一指定值。
结合本发明的第一方面的第一种可能的实现方式,在第二种可能的实现方式中,去分配方法还包括:更新有效数据单元表,有效数据单元表用于记录存储设备的各物理数据单元的数据的状态;更新有效数据单元计数表,其中,有效数据单元计数表用于记录物理块、大块或物理块组中处于有效状态的物理数据单元的数量。
结合本发明的第一方面的第二种可能的实现方式,在第三种可能的实现方式中,有效数据单元表为有效数据单元位图,有效数据单元位图中每个比特用于指示存储设备的各物理数据单元的数据的状态。
结合本发明的第一方面的第二种或者第三种可能的实现方式,在第四种可能的实现方式中,物理数据单元是物理页或物理页的部分。
结合本发明的第一方面的第二种至第四种可能的实现方式之一,在第五种可能的实现方式中,去分配方法还包括:依据有效数据单元计数表,更新物理块、大块或物理块组的第一优先级,该第一优先级为用于执行垃圾回收操作的优先级;依据第一优先级执行垃圾回收操作。
结合本发明的第一方面的第五种可能的实现方式,在第六种可能的实现方式中,含有更少有效数据单元的物理块、大块或物理块组具有更高的第一优先级。
结合本发明的第一方面的第一种至第六种可能的实现方式之一,在第七种可能的实现方式中,更新FTL表期间,阻止其他组件访问正在被更新的FTL表的表项,或者,使其他组件不访问正在被更新的FTL表的表项。
结合本发明的第一方面的第一种至第七种可能的实现方式之一,在第八种可能的实现方式中,更新FTL表包括每次更新FTL表的多个表项。
结合本发明的第一方面的第一种至第八种可能的实现方式之一,在第九种可能的实现方式中,更新FTL表包括使用DMA操作更新存储FTL表的多个表项的内存空间。
结合本发明的第一方面的第一种至第九种可能的实现方式之一,在第十种可能的实现方式中,去分配方法还包括:更新FTL表之前,将去分配命令指示的逻辑地址范围对应的FTL表的表项加锁;更新FTL表之后,将去分配命令指示的逻辑地址范围对应的FTL表的表项解锁。
结合本发明的第一方面的第一种至第十种可能的实现方式之一,在第十一种可能的实现方式中,去分配方法还包括:响应于收到读命令,通过去分配表判断所述读命令所读取的逻辑地址是否被分配,其中,若所读取的逻辑地址未被分配,则以第二指定值作为对读命令的响应,若所读取的逻辑单元地址被分配,则查询FTL表获得要读取的逻辑地址对应的物理地址,从物理地址读取数据作为对读命令的响应。
结合本发明的第一方面的第一种至第十种可能的实现方式之一,在第十二种可能的实现方式中,去分配方法还包括:响应于收到读命令,通过去分配表判断所述读命令所读取的逻辑地址是否被分配,其中,若所读取的逻辑地址未被分配,以状态信息向主机告知所读取的逻辑地址无效、非法或处于一种或多种去分配状态。
结合本发明的第一方面的第十二种可能的实现方式,在第十三种可能的实现方式中,去分配方法还包括:主机的驱动程序基于被告知的状态信息,生成提供给读取所述逻辑地址的应用的读取结果或者数据。
结合本发明的第一方面的第二种至第十三种可能的实现方式之一,在第十四种可能的实现方式中,去分配方法还包括:响应于收到写命令,为写命令分配物理地址,根据所分配的物理地址更新FTL表以及去分配表。
结合本发明的第一方面的第十四种可能的实现方式,在第十五种可能的实现方式中,去分配方法还包括:响应于收到写命令,在更新FTL表完成后,向物理地址写入数据,并向主机反馈写命令处理完成。
在使用本发明的第一方面提供的去分配方法处理时,先根据去分配命令获取去分配命令指示的逻辑地址范围,再更新去分配表,将去分配命令指示的逻辑地址范围对应的去分配表的表项设置为第一指定值,其中去分配表用于记录FTL表中的逻辑地址是否被分配的信息,然后指示去分配命令执行完成,从而可以高速对去分配命令进行处理,并且对去分配命令的处理不影响同时发生的IO命令的执行。
本发明的第二方面提供一种处理读命令的方法,该方法包括:响应于收到读命令,通过去分配表判断所述读命令所读取的逻辑地址是否被分配,其中,若所读取的逻辑地址未被分配,则以第二指定值作为对读命令的响应,若所读取的逻辑单元地址被分配,则查询FTL表获得要读取的逻辑地址对应的物理地址,从物理地址读取数据作为对读命令的响应。
本发明的第三方面提供一种处理读命令的方法,该方法包括:响应于收到读命令,通过去分配表判断所述读命令所读取的逻辑地址是否被分配,其中,若所读取的逻辑地址未被分配,以状态信息向主机告知所读取的逻辑地址无效、非法或处于一种或多种去分配状态。
结合本发明的第三方面,在第一种可能的实现方式中,处理读命令的方法还包括:主机的驱动程序基于被告知的状态信息,生成提供给读取所述逻辑地址的应用的读取结果或者数据。
本发明的第四方面提供一种处理写命令的方法,该方法包括:响应于收到写命令,为写命令分配物理地址,用所分配的物理地址更新FTL表、有效数据单元表、有效数据单元计数表以及去分配表。
结合本发明的第四方面,在第一种可能的实现方式中,处理写命令的方法还包括:响应于收到写命令,在更新FTL表完成后,向物理地址写入数据,并向主机反馈写命令处理完成。
本发明的第五方面提供一种存储设备,该存储设备包括获取模块、更新模块和指示模块,其中,获取模块用于根据去分配命令获取去分配命令指示的逻辑地址范围;更新模块用于更新去分配表,将去分配命令指示的逻辑地址范围对应的去分配表的表项设置为第一指定值,其中去分配表用于记录FTL表中的逻辑地址是否被分配的信息;指示模块用于指示去分配命令执行完成。
本发明的第六方面提供一种存储设备,该存储设备包括控制部件、接口、DRAM和一个或多个NVM,其中,DRAM中存储有去分配表和FTL表,接口用于与控制部件交换数据,控制部件根据去分配命令获取去分配命令指示的逻辑地址范围,并更新去分配表,将去分配命令指示的逻辑地址范围对应的去分配表的表项设置为第一指定值,其中去分配表用于记录FTL表中的逻辑地址是否被分配的信息,并指示去分配命令执行完成。
本发明的第七方面提供一种计算机程序,当被载入存储设备并在存储设备的控制部件上执行时,计算机程序包括的计算机程序代码使控制部件执行第一方面或者第一方面的第一种至第十五种可能的实现方式之一所述的去分配方法。
本申请的第八方面提供一种去分配方法,该去分配方法包括:步骤S1、根据去分配命令获取去分配命令指示的逻辑地址范围;步骤S2、更新FTL表,将去分配命令指示的逻辑地址范围对应的FTL表的表项设为预设值,其中,FTL表的表项用于指示逻辑地址与物理地址的对应关系;步骤S3、响应于FTL表的更新,更新有效页表,有效页表用于记录存储设备的物理页所存储的数据的状态;步骤S4、响应于有效页表的更新,更新有效页计数表,其中,有效页计数表用于记录物理块、大块或物理块组中处于有效状态的物理页的数量。
结合本发明的第八方面,在第一种可能的实现方式中,去分配方法还包括:步骤S5、响应于有效页计数表的更新,更新物理块、大块或物理块组的优先级,该优先级为对物理块、大块或物理块组在执行垃圾回收操作时的优先级;步骤S6、对优先级最高的物理块、大块或物理块组执行垃圾回收操作。
结合本发明的第八方面或者第八方面的第一种可能的实现方式,在第二种可能的实现方式中,步骤S2包括:每次更新FTL表的多个表项。
结合本发明的第八方面的第二种可能的实现方式,在第三种可能的实现方式中,在一个CPU更新FTL表的多个表项期间,阻止其他CPU访问正在被更新的FTL表的表项,或者,使其他CPU不要访问正在被更新的FTL表的表项。
结合本发明的第八方面的第三种可能的实现方式,在第四种可能的实现方式中,每次更新存储空间连续的多个FTL表的表项,并且在一个CPU更新存储空间连续的多个FTL表的表项期间,阻止其他CPU访问正在被更新的FTL表的表项,或者,使其他CPU不要访问正在被更新的FTL表的表项。
结合本发明的第八方面或者第八方面的第一种至第四种可能的实现方式之一,在第五种可能的实现方式中,步骤S2中,使用DMA操作更新存储多个FTL表的表项的内存空间。
结合本发明的第八方面或者第八方面的第一种至第五种可能的实现方式之一,在第六种可能的实现方式中,步骤S2中,预设值为0。
结合本发明的第八方面或者第八方面的第一种至第六种可能的实现方式之一,在第七种可能的实现方式中,步骤S2中,逻辑地址为逻辑页的地址,物理地址为物理页的地址。
结合本发明的第八方面的第七种可能的实现方式,在第八种可能的实现方式中,若逻辑页对应的存储空间和物理页的存储空间相同,在有效页表中,每个比特用于指示一个物理页的有效性。
结合本发明的第八方面的第七种可能的实现方式,在第九种可能的实现方式中,若物理页的存储空间可容纳多个逻辑页,在有效页表中每个比特用于指示同逻辑地址相对应的物理存储区域的有效性。
结合本发明的第八方面或者第八方面的第一种至第九种可能的实现方式之一,在第十种可能的实现方式中,步骤S4中,有效页计数表是数组、线性表或者链表。
结合本发明的第八方面的第一种至第十种可能的实现方式之一,在第十一种可能的实现方式中,步骤S6中,有效页数为0的物理块、大块或物理块组为优先级最高的物理块、大块或物理块组。
结合本发明的第八方面或者第八方面的第一种至第十一种可能的实现方式之一,在第十二种可能的实现方式中,去分配方法还包括:在步骤S2之后,向主机反馈去分配命令处理完成;或者,在步骤S4之后,向主机反馈去分配命令处理完成。
结合本发明的八方面或者第八方面的第一种至第十二种可能的实现方式之一,在第十三种可能的实现方式中,去分配方法还包括:在步骤S1和步骤S2之间,将去分配命令指示的逻辑地址范围对应的FTL表的表项加锁;在步骤S2和步骤S3之间,将去分配命令指示的逻辑地址范围对应的FTL表的表项解锁。
结合本发明的第八方面或者第八方面的第一种至第十三种可能的实现方式之一,在第十四种可能的实现方式中,去分配方法还包括:在步骤S1和步骤S2之间,将去分配表的表项清零,其中,去分配表的表项用于存储每个逻辑地址是否被分配的信息。
结合本发明的第八方面的第十四种可能的实现方式,在第十五种可能的实现方式中,去分配方法还包括:在将去分配表清零后,向主机反馈去分配命令处理完成。
结合本发明的第八方面的第十四种或者第十五种可能的实现方式,在第十六种可能的实现方式中,去分配方法还包括:通过DMA操作对去分配表进行更新。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为存储设备的框图;
图2为本发明实施例二中处理去分配命令前的FTL表的示意图;
图3为本发明实施例二中的处理去分配命令前的有效页表的示意图;
图4为本发明实施例二中的处理去分配命令前的有效页计数表的示意图;
图5为本发明实施例二中的处理去分配命令的方法的流程图;
图6为本发明实施例二中处理去分配命令后的FTL表的示意图;
图7为本发明实施例二中的处理去分配命令后的有效页表的示意图;
图8为本发明实施例二中的处理去分配命令后的有效页计数表的示意图;
图9为本发明实施例二中处理读命令的流程图;
图10为本发明实施例三中处理去分配命令前的去分配表的示意图;
图11为本发明实施例三中处理去分配命令后的去分配表的示意图;
图12A为本发明实施例三中处理去分配命令的方法的流程图;
图12B为本发明实施例三中响应读命令的方法的流程图;
图12C为本发明实施例三中响应写命令的方法的流程图;
图13为本发明实施例四中大块的示意图;
图14为本发明实施例四中处理去分配命令前的FTL表的示意图;
图15为本发明实施例四中的处理去分配命令前的有效页表的示意图;
图16为本发明实施例四中的处理去分配命令前的有效页计数表的示意图;
图17为本发明实施例四中的处理去分配命令的方法的流程图;
图18为本发明实施例四中处理去分配命令后的FTL表的示意图;
图19为本发明实施例四中的处理去分配命令后的有效页表的示意图;
图20为本发明实施例四中的处理去分配命令后的有效页计数表的示意图;
图21为本发明实施例五中处理去分配命令的方法的流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
存储了从逻辑地址到物理地址的映射信息的表结构被称为FTL表。FTL表是固态存储设备中的重要元数据。FTL表记录了存储设备中以数据页为单位的地址映射关系。FTL表包括多个FTL表的表项(或称条目)。在一个例子中,每个FTL表的表项中记录了一个逻辑页地址与一个物理页的对应关系。在另一个例子中,每个FTL表的表项中记录了连续的多个逻辑页地址与连续的多个物理页的对应关系。在又一个实施例中,每个FTL表的表项中记录了逻辑块地址与物理块地址的对应关系。在依然又一个例子中,FTL表中记录逻辑块地址与物理块地址的映射关系,和/或逻辑页地址与物理页地址的映射关系。
在去分配命令中,描述了逻辑地址范围。在执行了去分配命令后,可以有不同的效果。例如,(1)执行去分配命令后,在读取去分配命令所指示的逻辑地址范围时,所得到的是确定的(执行对该逻辑地址范围的其他写入操作之前);(2)执行去分配命令后,在读取去分配命令所指示的逻辑地址范围时,所得到的结果是全0(执行对该逻辑地址范围的其他写入操作之前);(3)执行去分配命令后,在读取去分配命令所指示的逻辑地址范围时,所得到的结果可以是任意值(执行对该逻辑地址范围的其他写入操作之前)。在去分配命令或者其他命令中可设置或选择去分配命令的执行效果。通过使用去分配命令,主机能够告知固态硬盘哪些逻辑地址空间不再存储有效数据,从而固态硬盘在回收存储空间时,不必搬移已经失效的数据。
在固态硬盘中,有多种执行去分配命令的方法。为执行去分配操作,将FTL表中,由去分配命令所描述的逻辑地址范围所指示的FTL表项设置为特殊标记(例如,0)。例如,去分配命令指示的逻辑地址范围包括0-7与100-103。为执行该去分配命令,将FTL表中记录了逻辑地址0-7以及100-103的条目的内容设置为0。从而接下来要读取逻辑地址LBA 0-7或LBA100-103中的一个或多个时,在FTL表中查询到这些逻辑地址对应的物理地址为0(含义为特殊标记),从而以符合去分配命令的指定效果的结果(例如,全0)作为对读命令的响应。可以理解的是,去分配命令所指示的逻辑地址范围可以与FTL表的表项的具有不同的单位大小。例如,去分配命令中,一个逻辑地址对应512字节的存储空间,而在FTL表中,一个表项对应4KB(千字节)的存储空间。
在根据本发明的实施例中,以物理块、大块或者物理块组为单位执行擦除或者垃圾回收操作,下文对以物理块为单位执行擦除或者垃圾回收操作,以及以大块为单位执行擦除或者垃圾回收操作相对应的处理去分配命令的方法进行详细描述,以物理块组为单位执行擦除或者垃圾回收操作相对应的处理去分配命令的方法可以参照二者内容获得,文中不再进行赘述。
实施例二
在本实施例中,存储设备中以物理块为单位执行擦除或垃圾回收操作。在本实施例中,每个FTL表的表项中记录了一个逻辑页地址与一个物理页的对应关系。在固态硬盘中,维护FTL表、有效页表以及有效页计数表。其中,图2为本实施例中的处理去分配命令前的FTL表的示意图,FTL表指示逻辑页地址与物理页地址的对应关系。图3为本实施例中的处理去分配命令前的有效页表的示意图(图3中仅示出与图2中的FTL表相关的物理块的有效页表),有效页表记录对应物理块中存储的对应于逻辑页的数据的状态。图4为本实施例中的处理去分配命令前的有效页计数表的示意图,在有效页计数表中记录了各个物理块中处于有效状态的物理页的数量。需要说明的是,图3示出的有效页表中由横线所标注的有效比特指示了图2中示出的逻辑地址LBA0-LBA7对应的物理页,未标注横线的其他有效比特指示了其他逻辑地址对应的物理页,而无效比特所对应的物理页没有被任何逻辑地址所引用。在图3的例子中,用位图作为数据结构来指示物理块的各个物理页的有效性,应当理解,也可以使用多种其他数据结构。
参看图2,以物理块1为例,其物理地址为“PBA 1-4”的物理页中存储了逻辑地址为“LBA 0”的数据,因而在图3所示的物理块1的有效页表中,物理地址为“PBA 1-4”的物理页的状态为有效(图3中,在第2行第1列的位置用“1”指示)。而图2所示的物理块1的物理地址为“PBA 1-0”的物理页没有被任何逻辑地址所引用,因而在图3所示的物理块1的有效页表中,物理地址为“PBA 1-0”的物理页的状态为无效(图3中,在第1行第1列的位置用“0”指示)。其他类似,此处不再一一描述。与之对应地,图4中的有效页计数表指示物理块0中当前有5个物理页有效,物理块1中当前有9个物理页有效,物理块2中当前有0个物理页有效,物理块3中当前有11个物理页有效。
本实施例中,可以根据逻辑页对应的存储空间和物理页的存储空间的关系,确定在有效页表中,每个比特用于指示有效性的物理存储区域。
在一个例子中,逻辑页对应的存储空间和物理页的存储空间相同,则在有效页表中,用1比特来指示对应的一个物理页的状态,以减少对内存空间的占用。例如,FTL表中的逻辑页对应4KB存储空间,而物理页的存储空间也为4KB(还包括附加的带外存储空间),在此情况下,有效页表中,每个比特指示一个物理页的状态。
在另一个例子中,逻辑页对应的存储空间和物理页的存储空间不相同,例如物理页的存储空间可容纳多个逻辑页,逻辑页对应4KB的存储空间,而物理页的存储空间能够容纳多个逻辑页(例如4个),在此情况下,有效页表中,每个比特指示同逻辑地址相对应的物理存储区域的有效性。例如,若物理块1包括512个物理页,那么物理块1的有效页表中包括2048个比特。类似地,有效页计数表中记录物理块中当前存储的为FTL表中的逻辑地址所引用的4KB存储空间的数量。例如,若物理块1包括512个16KB大小物理页,而在FTL表中有9个LBA所对应的物理地址属于物理块1,那么物理块1的有效页计数为9。
图5为本实施例提供的处理去分配命令的方法的流程图,如图5所示,本实施例提供的处理去分配命令的方法包括:响应于收到去分配命令,获取去分配命令指示的(一个或多个)逻辑地址范围(例如,LBA0-LBA3)。
将(一个或多个)逻辑地址(例如,LBA0-LBA3)对应的FTL表的表项(也参看图2)加锁,以避免垃圾回收(GC,Garbage Collection)或其他任务会同时访问FTL表的这些表项,避免引起错误。当然,加锁并不是必需的,如果不存在多个任务同时访问FTL表的同一表项的可能,则即使不加锁,也不会引起错误。
将(一个或多个)逻辑地址(例如,LBA0-LBA3)对应的FTL表的表项清零,或者将FTL表的表项设置为指定值。此时,零或其他指定值作为物理地址,指示读取该物理地址将获取到为执行去分配命令所指定的值(例如,全0的值或者全为指定值的值)。
作为一种可选的方式,当去分配命令指示的(一个或多个)逻辑地址范围为LBA0-LBA3时,在完成对关联于逻辑地址LBA0-LBA3的FTL表表项的清零后,即可向主机反馈去分配命令处理完成。
将加锁的FTL表的表项解锁,从而允许其他任务访问FTL表的这些表项。
作为另一种可选的方式,根据FTL表的表项的更新,相应更新同被更新的FTL表的表项的物理地址对应的物理块的有效页表。例如,图6为本实施例中的处理去分配命令后的FTL表的示意图。而图2展示的是处理去分配命令前的FTL表。参看图6,响应于LBA0-LBA3对应的FTL表的表项被清零,物理地址PBA 1-4、PBA 3-6、PBA 1-9与PBA 1-10不再存储有效数据。图7为本实施例中的处理去分配命令后的有效页表的示意图。而图3展示的是处理去分配命令前的有效页表。相应地,如图7所示,物理块1的有效页表中,物理块1的地址为PBA1-4、PBA1-9与PBA1-10的物理页变为无效(例如,对应的比特被设置为0),而物理块3的有效页表中,物理块3的地址为PBA3-6的物理页变为无效。
由于物理块中的有效页发生变化,相应更新有效页计数表。例如,图8为本实施例中的处理去分配命令后的有效页计数表的示意图。而图4为本实施例中的处理去分配命令前的有效页计数表的示意图。如图8所示,响应于LBA0-LBA3对应的FTL表的表项被清零,物理块1的有效页计数从9变为6,而物理块3的有效页计数从11变为10。有效页计数可用于指示垃圾回收操作的优先级。例如,在执行垃圾回收操作时,优先回收有效页计数低的物理块。进一步地,对有效页计数为0的物理块,可立即执行擦除操作以回收存储空间。作为另一个例子,响应于对有效页计数表的更新,还更新有效页数量被更新的物理块的用于垃圾回收的优先级。从而在执行垃圾回收操作时,依照物理块的垃圾回收优先级来选择要被回收的物理块。其中,有效页数量越少的物理块,垃圾回收优先级越高,越先被回收。为维护有效页计数表,有效页计数表可以为数组、线性表、链表等多种数据结构。可选地,在有效页计数表更新完成后,向主机反馈去分配命令处理完成。
在使用上述处理去分配命令的方法对去分配命令处理完成后,向去分配命令所指示的逻辑地址范围写入数据前,如图9所示,响应于收到读命令,查询FTL表获得要读取的逻辑地址对应的物理地址,若物理地址为零,以全0作为对读命令的响应。此时,当主机读取应用了去分配命令的地址时,将得到预定的结果,例如是全0。当然,也可用其他方式向主机指示所读取的逻辑地址被去分配,例如,不向主机提供读取的数据,而以状态信息向主机告知所读取的逻辑地址无效、非法或处于一种或多种去分配状态。进一步地,主机的驱动程序基于存储设备告知的状态信息,生成提供给读取这些地址的应用的读取结果或数据。
在上述处理去分配命令的方法中,若去分配命令指示了大量的逻辑地址范围时(例如,LBA 10000-LBA 20000),对多个FTL表表项的清零是耗时的,因此,可以通过多种方式加快对FTL表表项的更新操作。例如,每次更新多个FTL表表项,并且在1个CPU更新多个FTL表表项期间,阻止其他CPU访问被更新的FTL表表项,或使其他CPU不要尝试访问被更新的FTL表表项。作为另一个例子,使用DMA操作来更新存储多个FTL表表项的内存空间。在依然另一个例子中,每次更新存储空间连续的FTL表表项,并且在更新存储空间连续的FTL表表项期间,阻止其他访问FTL表表项的操作,以减少对内存的随机访问,以加快对FTL表表项的更新操作。
示例性地,本实施例中的FTL表、有效页表与有效页计数表均可存储在DRAM中。
实施例三
实施例三中,为高效处理去分配命令,还维护去分配表。进一步地,还将去分配表写入NVM,从而在异常掉电后重新启动时,能够通过去分配表记录的信息获得正确的FTL表。
图10和图11为去分配表的示意图,其中,图10为本发明实施例中处理去分配命令前的去分配表的示意图;图11为本发明实施例中处理去分配命令后的去分配表的示意图。如图10和图11所示,去分配表中,存储对应于FTL表中的每个逻辑地址是否被分配的信息。作为举例,在去分配表中为FTL表的每个逻辑地址提供1比特的存储空间。
如图11所示,当逻辑地址已经被分配(即在FTL表中该逻辑地址具有有效的物理地址),在去分配表中,将该逻辑地址标记为“被分配”(例如,将对应的1比特存储空间设置为0);当逻辑地址未被分配或者已经应用了去分配命令时,该逻辑地址在去分配表中被标记为“去分配”(例如,将对应的1比特存储空间设置为1)。
示例性地,在与图2所示的处理去分配命令前的FTL表对应的图10所示的去分配表中,FTL表中逻辑地址LBA 0-LBA 7都被分配了有效的物理地址,因而在如图10所示的去分配表中,LBA 0-LBA 7都被标记为“被分配”(对应的1比特存储空间均设置为0)。响应于收到去分配命令,对LBA 0–LBA 3的逻辑地址范围执行去分配命令的过程中,如图11所示,去分配表中LBA 0-LBA 3都被标记为“去分配”(对应的1比特存储空间均设置为1),而去分配表中LBA4-LBA 7依然被标记为“被分配”(对应的1比特存储空间均设置为0)。在如图6所示的处理去分配命令后的FTL表中,对应逻辑地址LBA 0-LBA 3的表项的物理地址被设置为0。与之对应地,相应地修改有效页表与有效页计数表。参照图3和图7可知,物理块0与物理块1的有效页表也做了相应更新,类似地,参照图4和图8可知,有效页计数表也做了相应更新。
示例性地,本实施例中的去分配表存储在DRAM中。可选地,通过DMA操作更新DRAM中的去分配表。
图12A为本发明实施例三中处理去分配命令的方法的流程图。响应于收到去分配命令(参看图12A中1210),获取去分配命令所指示的逻辑地址范围(参看图12A中1212),例如,要对LBA 0–LBA 3的逻辑地址范围执行去分配。根据去分配命令所指示的逻辑地址范围,更新去分配表(参看图10与图11)的表项(参看图12A中1214),例如将图11所示的去分配表中与逻辑地址LBA0-LBA3对应的表项标记为“去分配”(具有1值)。在更新了去分配表后,即可向主机指示去分配命令执行完成。从而在实施例三中,去分配命令的执行速度得到了极大的提升。
接下来,依据去分配命令所指示的逻辑地址范围,更新FTL表的表项,例如,将去分配命令所指示的一个或多个逻辑地址对应的FTL表项清零,或设置为指定值(参看图12A中1218)。可选地,在更新FTL表前,还对要更新的一个或多个逻辑地址对应的FTL表的表项加锁(参看图12A中1216),从而避免FTL表项被更新期间,其他任务读取这些FTL表项。以及在更新FTL表后,还对被更新的一个或多个逻辑地址对应的FTL表的表项解锁(参看图12A中1220)。
相应地,还更新同被更新的FTL表的表项的物理地址对应的物理块的有效页表(参看图7以及图12A中1222)与有效页计数表(参看图8以及图12A中1224)。
图12B为本发明实施例三中响应读命令的方法的流程图。在实施例三中,参看图12A,当去分配表更新完成后,即向主机告知去分配命令执行完成。此后主机读取被去分配的逻辑地址时,应当收到诸如全0的指定指示。在图12B中,响应于收到读命令(参看图12B中1230),查询去分配表(参看图11),判断读命令所读取的逻辑地址是否被去分配(参看图12B中1232)。若去分配表指示所读取的逻辑地址处于去分配状态,则以全0或者其他指定的指示作为对读命令的响应(参看图12B中1234)。只有当区分配表指示所读取的逻辑地址已被分配时,才查询FTL表获得要读取的逻辑地址对应的物理地址(参看图12B中1236),并从获得的物理地址读取数据作为对读命令的响应(参看图12B中1238)。
可选地,查询去分配表将增加读操作的延迟,对于访问已被分配的逻辑地址的读命令,查询去分配表是没有积极意义的。为此,还记录固态存储设备正在执行去分配命令的状态。响应于收到去分配命令(参看图12A中1210),标记存储设备正在执行去分配命令。在此情况下,若收到读命令,则首先查询去分配表(参看图12B中1232)。而当去分配命令执行完成后,例如在图12A所示的步骤1218或步骤1220执行完成后,标记存储设备已经完成对去分配命令的执行。在此情况下,若收到读命令,则不必执行图12B中步骤1232,而直接执行图12B中步骤1236。
图12C为本发明实施例三中响应写命令的方法的流程图。对于未被写入数据的固态存储设备,其去分配表中指示所有的逻辑地址均处于去分配状态。响应于逻辑地址被写入数据,去分配表与被写入数据的逻辑地址对应的表项被修改为已分配状态。而响应于执行去分配命令,被去分配的逻辑地址在去分配表中的表项被再次修改为去分配状态。参看图12C,当收到写命令(参看图12C中1240),为写命令分配物理地址,并用写命令所指示的逻辑地址与分配的物理地址更新FTL表(参看图12C中1242)。向被分配的物理地址写入数据,并向主机反馈写命令处理完成(参看图12C中1244)。可选地,为降低写命令处理延迟,在步骤1242之后,在将数据写入物理地址之前,即向主机反馈写命令处理完成。还更新有效页表与有效页计数表(参看图12C中1246),以作为物理块被写入数据的响应。还更新去分配表,将被写入的逻辑地址在去分配表中的表项设置为已分配(参看图12C中1248)。图12C中,步骤1244、步骤1246与步骤1248的顺序可以调整,也可以并行或同时被执行。优选地,步骤1244、步骤1246与步骤1248发生在步骤1242之后。
实施例四
在本实施例中,存储设备中以大块为单位执行擦除或者垃圾回收操作。图13为大块的示意图,作为举例,如图13所示,在每16个逻辑单元(LUN)上构造大块。每个大块包括16个物理块,来自16个逻辑单元(LUN)的每一个。在图13的例子中,大块0包括来自16个逻辑单元(LUN)的每个的物理块0,大块1包括来自每个逻辑单元(LUN)的物理块1。
在本实施例中,每个FTL表的表项中记录了一个逻辑地址与一个大块中的物理单元的对应关系。示例性地,在FTL表中,每个逻辑地址对应4KB的存储空间,而NVM中的每个物理页包括4个物理单元,每个物理单元容纳对应1个逻辑地址的数据(可选地,还包括诸如校验数据的带外数据)。图14为本实施例中的处理去分配命令前的FTL表的示意图,参看图14,FTL表中记录的PBA 0-4指示大块0的地址为4的物理单元,PBA1-6指示大块1的地址为6的物理单元,FTL表中记录的PBA0-9指示大块0的地址为9的物理单元,而PBA0-15指示大块0的地址为15的物理单元。当然,也可以有多种其他方式来构造大块,此处不再一一进行赘述。
作为一种可选的方式,在大块中构造页条带,每个逻辑单元(LUN)内相同物理地址的物理页构成了“页条带”。如图13所示,物理页0-0、物理页0-1……与物理页0-x构成了页条带0。其中物理页0-0、物理页0-1……物理页0-14用于存储用户数据,而物理页0-15用于存储根据条带内的所有用户数据计算得到的校验数据。当然,用于存储校验数据的物理页可以位于页条带中的任意位置,以上只是举例而非限定。类似地,图13中,物理页2-0、物理页2-1……与物理页2-x构成了页条带2。
在本实施例中,为每个大块提供有效页表,用于记录对应大块中存储的对应于逻辑地址的数据(数据单元)的状态。图15为本实施例中处理去分配命令前的有效页表,需要说明的是,图15中,有效页表中由横线所标注的有效比特指示了图14的FTL表中逻辑地址LBA0-LBA7对应的物理单元,未标注横线的其他有效比特指示了其他逻辑地址对应的物理单元,而无效比特所对应的物理单元没有被任何逻辑地址所引用。
参看图15,以大块0为例,其物理地址为“PBA 0-4”的物理单元中存储了逻辑地址为“LBA 0”的数据,因而在大块0的有效页表中,地址为“PBA 0-4”的物理单元的状态为有效(图15中,由有效页表(大块0)的第2行第1列的“1”指示)。而图15所示的大块0的地址为“PBA0-0”的物理单元没有被任何逻辑地址所引用,因而在大块0的有效页表中,地址为“PBA 0-0”的物理单元的状态为无效(图15中,由有效页表(大块0)的第1行第1列的“0”指示)。其他类似,此处不再一一描述。可选地,在有效页表中,用1比特来指示对应的一个物理单元的状态,以减少对内存空间的占用。
图16为本实施例中处理去分配命令前的有效页计数表,在有效页计数表中记录了各个大块中处于有效状态的物理单元的数量。与之对应地,如图16所示,大块0中当前有9个物理单元有效,大块1中当前有11个物理单元有效,大块2中有0个物理单元有效,大块3中有11个物理单元有效。
图17为本实施例提供的处理去分配命令的方法的流程图,如图17所示,本实施例提供的处理去分配命令的方法包括:响应于收到去分配命令(参看图17中1710),获取去分配命令指示的(一个或多个)逻辑地址范围(例如,LBA0-LBA3)(参看图17中1720)。
将(一个或多个)逻辑地址(例如,LBA0-LBA3)对应的FTL表的表项(参看图14)加锁(参看图17中1730),以避免垃圾回收(GC,Garbage Collection)或其他任务会同时访问FTL表的这些表项,避免引起错误。当然,加锁并不是必需的,如果不存在多个任务同时访问FTL表的同一表项的可能,则即使不加锁,也不会引起错误。
将(一个或多个)逻辑地址(例如,LBA0-LBA3)对应的FTL表的表项清零,或者将FTL表的表项设置为指定值(参看图17中1740)。此时,零或其他指定值作为物理地址,指示读取该物理地址将获取到为执行去分配命令所指定的值(例如,全0的值或者全为指定值的值)。
作为一种可选的方式,当去分配命令指示的(一个或多个)逻辑地址范围为LBA0-LBA3时,在完成对关联于逻辑地址LBA0-LBA3的FTL表表项的清零后,即可向主机反馈去分配命令处理完成。
将加锁的FTL表的表项解锁(参看图17中1750),从而允许其他任务访问FTL表的这些表项。
作为另一种可选的方式,根据FTL表的表项的更新,相应更新同被更新的FTL表的表项的物理地址对应的大块的有效页表(参看图17中1760)。例如,图18为本实施例中的处理去分配命令后的FTL表的示意图。而图14为本实施例中的处理去分配命令前的FTL表的示意图。参看图18,响应于LBA0-LBA3对应的FTL表的表项被清零,物理地址PBA0-4、PBA 1-6、PBA 0-9与PBA 0-10不再存储有效数据。相应地,图19为本实施例中的处理去分配命令后的有效页表的示意图。而图15为本实施例中的处理去分配命令前的有效页表的示意图。如图19所示,大块0的有效页表中,大块0的物理地址为PBA 0-4、PBA 0-9与PBA0-10的物理单元变为无效(例如,对应的比特被设置为0),而大块1的有效页表中,大块1的地址为PBA 1-6的物理单元变为无效。
由于大块中的有效物理单元发生变化,相应更新有效页计数表(参看图17中1770)。例如,响应于LBA0-LBA3对应的FTL表的表项被清零,图20为本实施例中的处理去分配命令后的有效页计数表的示意图。而图16为本实施例中的处理去分配命令前的有效页计数表的示意图。如图20所示,大块0的有效页计数从9变为6,而大块1的有效页计数从11变为10。有效页计数可用于指示垃圾回收操作的优先级。例如,在执行垃圾回收操作时,优先回收有效页计数低的大块。进一步地,对有效页计数为0的大块,可立即执行擦除操作以回收存储空间。作为另一个例子,响应于对有效页计数表的更新,还更新有效页数量被更新的大块的用于垃圾回收的优先级(参看图17中1780),从而在执行垃圾回收操作时,依照大块的垃圾回收优先级来选择要被回收的大块。其中,有效页数量越少的大块,垃圾回收优先级越高,越先被回收。为维护有效页计数表,有效页计数表可以为数组、线性表、链表等多种数据结构。可选地,在有效页计数表更新完成后,向主机反馈去分配命令处理完成。
在使用根据本发明实施例四提供的处理去分配命令的方法对去分配命令处理完成后,向去分配命令所指示的逻辑地址范围写入数据前,响应于收到读命令,查询FTL表获得要读取的逻辑地址对应的物理地址,若物理地址为零,以全0作为对读命令的响应。此时,当主机读取处理去分配命令时对应的地址时,将得到预定的结果,例如是全0。当然,也可用其他方式向主机指示所读取的逻辑地址被去分配,例如,不向主机提供读取的数据,而以状态信息向主机告知所读取的逻辑地址无效、非法或处于一种或多种去分配状态。进一步地,主机的驱动程序基于存储设备告知的状态信息,生成提供给读取这些地址的应用的读取结果或数据。
在根据本发明实施例四提供的处理去分配命令的方法中,若去分配命令指示了大量的逻辑地址范围时(例如,LBA 10000-LBA 20000),对多个FTL表表项的清零是耗时的。可以通过多种方式加快对FTL表表项的更新操作。例如,每次更新多个FTL表表项,并且在1个CPU更新多个FTL表表项期间,阻止其他CPU访问被更新的FTL表表项,或使其他CPU不要尝试访问被更新的FTL表表项。作为另一个例子,使用DMA操作来更新存储多个FTL表表项的内存空间。在依然另一个例子中,每次更新存储空间连续的FTL表的表项,并且在更新存储空间连续的FTL表表项期间,阻止其他访问FTL表表项的操作,以减少对内存的随机访问,以加快对FTL表表项的更新操作。
示例性地,本实施例中的FTL表、有效页表与有效页计数表均可存储在DRAM中。
实施例五
实施例三中,为高效处理去分配命令,还维护去分配表。进一步地,还将去分配表写入NVM,从而在异常掉电后重新启动时,能够通过去分配表记录的信息获得正确的FTL表。
在实施例五中,使用图10和图11示出的去分配表。去分配表中,存储对应于FTL表中的每个逻辑地址是否被分配的信息。作为举例,在去分配表中为FTL表的每个逻辑地址提供1比特的存储空间。
图21为本发明实施例五中处理去分配命令的方法的流程图。响应于收到去分配命令(参看图21中2110),获取去分配命令所指示的(一个或多个)逻辑地址范围(参看图21中2112),例如,要对LBA 0–LBA 3的逻辑地址范围执行去分配。根据去分配命令所指示的逻辑地址范围,更新去分配表(参看图10与图11)的表项(参看图21中2114),例如将图11所示的去分配表中与逻辑地址LBA 0-LBA 3对应的表项标记为“去分配”(具有1值)。在更新了去分配表后,即可向主机指示去分配命令执行完成。从而在实施例五中,去分配命令的执行速度得到了极大的提升。
接下来,依据去分配命令所指示的逻辑地址范围,更新FTL表的表项,例如,将去分配命令所指示的一个或多个逻辑地址对应的FTL表项清零,或设置为指定值(参看图21中2118)。可选地,在更新FTL表前,还对要更新的一个或多个逻辑地址对应的FTL表的表项加锁(参看图21中2116),从而避免FTL表项被更新期间,其他任务读取这些FTL表项。以及在更新FTL表后,还对被更新的一个或多个逻辑地址对应的FTL表的表项解锁(参看图21中2120)。
相应地,还更新同被更新的FTL表的表项的物理地址对应的大块块的有效页表(参看图7以及图21中2122)与有效页计数表(参看图8以及图21中2124)。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。