存储器控制设备和包括其的计算设备的制作方法

文档序号:17924143发布日期:2019-06-15 00:18阅读:161来源:国知局
存储器控制设备和包括其的计算设备的制作方法

本申请要求于2017年12月6日提交的韩国专利申请第10-2017-0166935号和于2018年10月22日提交的韩国专利申请第10-2018-0126267号的优先权和利益,这两个专利申请的全部内容通过引用被并入本文。

背景

(a)领域

所描述的技术大体上涉及存储器控制设备以及包括其的计算设备。

(b)相关技术的描述

最近,持久存储器技术受到了相当大的关注,因为它们可以显著提高数据中心和高性能计算机的性能。具体地,在许多计算领域中,需要后端储存来从系统故障和崩溃中恢复。由于持久存储器可以自发并即时地恢复所有存储器状态,因此它可以消除对后端储存的大量访问以及相关的运行时间开销。

存在持久存储器技术的多种体现,包括nvdimm(非易失性双列直插式存储器模块),例如nvdimm-n和nvdimm-p。例如,nvdimm-n由dram(动态随机存取存储器)和电池组成,但需要某种软件支持,例如来自os(操作系统)的直接存取(dax)。nvdimm-n还集成用户不可见的小型闪存设备,且仅用于在电源故障出现时备份来自dram的数据。nvdimm-p是将具有储存级存储器(例如3dxpointtm或闪存)的电池支持的dram放置在同一模块上的仅硬件解决方案,并且不需要任何软件支持来受益于由储存级存储器提供的大容量。由于nvdimm提供具有类似dram的延迟和带宽的字节可寻址的持久性,因此它对各种数据密集应用(例如数据库管理系统(dbms)、事务处理和检验指示)可能是有用的。然而,由于电池技术的差的扩展,nvdimm的dram容量是有限的。例如,在过去的二十年里,dram的储存密度增加了大于很多数量级,而锂离子电池的能量密度仅增至三倍。

构建大而可扩展但持久的存储器空间的可能解决方案之一是将nvdimm与ssd(固态驱动器)和存储器映射文件(mmf)一起使用,这可以在存储器管理器中或文件系统中实现。这允许数据密集应用使用传统的加载/存储指令来访问大的存储空间。然而,与仅nvdimm解决方案相比,这种mmf辅助的持久存储器可使在用户级处的数据密集应用的性能平均下降48%。这种性能下降不仅由加载/存储指令所经历的长时间停顿而且也由软件开销以及在用户和系统存储器空间之间的大量数据复制操作引起。

概述

本发明的实施例提供了能够将存储器的存储器空间和储存设备的储存空间聚合成扩展的存储器空间的一种存储器控制设备和包括该存储器控制设备的计算机设备。

根据本发明的实施例,提供了一种计算设备的存储器控制设备,该计算设备包括中央处理单元(cpu)、存储器和基于闪存的储存设备。存储器控制设备包括地址管理器和用于访问存储器和储存设备的接口。地址管理器将存储器的存储器空间和储存设备的储存空间聚合成扩展的存储器空间,并且通过使用存储器的存储器空间作为对于储存设备的储存空间的高速缓存来处理来自cpu的对扩展的存储器空间的存储器请求。

存储器请求的地址可以是使用储存空间的容量作为主存储器的存储器空间的容量的主存储器的地址,并且地址管理器可以通过将储存设备的储存空间映射到存储器的存储器空间来处理存储器请求。

地址管理器可以通过使用基于存储器请求的地址查找在高速缓存中的命中或未命中的高速缓存逻辑来将存储器的存储器空间和储存设备的储存空间聚合成扩展的存储器空间。

通过使用硬件高速缓存逻辑作为高速缓存逻辑,地址管理器可以在没有软件的帮助的情况下将存储器的存储器空间和储存设备的储存空间聚合成扩展的存储器空间。

存储器控制设备还可以包括队列引擎。在这种情况下,接口可以包括用于存储器的存储器接口和用于储存设备的储存设备接口。当存储器请求是在高速缓存中的未命中时,地址管理器可以基于存储器请求来生成具有用于储存设备的命令结构的命令,并将该命令转发到队列引擎,并且队列引擎可以通过储存设备接口来将该命令传递到储存设备。此外,当存储器请求是高速缓存中的命中时,地址管理器可以从高速缓存逻辑中提取存储器的与存储器请求的地址相对应的存储器地址,并将具有存储器地址的存储器请求传递到存储器。

队列引擎可以通过将命令提交到提交队列并使门铃寄存器振铃来将命令传递到储存设备。

当存储器请求是读请求时,该命令可以包括将高速缓存数据从存储器逐出到储存设备的第一命令和将目标数据从储存设备读取到存储器的第二命令。当存储器请求是写请求时,该命令可以包括将高速缓存数据从存储器逐出到储存设备的第一命令。

第一命令可以包括指示存储在高速缓存逻辑中的多个集合当中的与存储器请求的地址相对应的集合中的存储器地址的指针,以及指示基于存储器请求的地址和存储在与存储器请求的地址相对应的集合中的值而生成的储存设备地址的地址。第二命令可以包括指示存储在对应于存储器请求的地址的集合中的存储器地址的指针,以及指示对应于存储器请求的地址的储存设备地址的地址。

存储器控制设备还可以包括储存设备命令生成器,当存储器请求是在高速缓存中的未命中时,该储存设备命令生成器基于存储器请求来为储存设备生成直接访问存储器的命令。在这种情况下,接口可以包括存储器接口。存储器接口可以通过基于寄存器的接口连接到存储器的寄存器和储存设备的寄存器。储存设备命令生成器可以通过存储器接口将命令传递到储存设备,使得储存设备通过基于寄存器的接口直接访问存储器。

该命令可以包括源地址、目的地址和请求类型。源地址可以指示存储器的存储器地址和储存设备的储存设备地址中的一个,目的地址可以指示存储器地址和储存设备地址中的另一个,并且请求类型可以指示读或写。可以根据储存设备的控制器的控制来将数据从源地址传输到目的地址。

存储器控制设备还可以包括在命令被传递到储存设备时被置位的锁定寄存器。当锁定寄存器被置位时,存储器控制设备可以被阻止访问存储器。

当存储器请求是在高速缓存中的未命中时,可以向储存设备传递命令,以便在储存设备和存储器中处理存储器请求。在这种情况下,命令可以包括日志标签。当命令被传递到储存设备时,日志标签可以被设置为第一值,并且当命令在储存设备中完成时,日志标签可以被设置为第二值。

存储器可以包括固定的存储器区域(pinnedmemoryregion),其中存储了高速缓存逻辑。

高速缓存逻辑可以包括分别对应于多个索引的多个集合,并且每个集合可以包括标签。在这种情况下,存储器请求的地址可以被分解成至少目标标签和目标索引。当存储在多个集合当中的具有与目标索引相同的索引的集合中的标签等于目标标签时,地址管理器可以确定命中,并且当所存储的标签不同于目标标签时,地址管理器可以确定未命中。

每个集合可进一步包括指示对应的高速缓存区域是否正在使用中的忙位。当根据存储器请求的未命中将高速缓存数据从存储器逐出到储存设备时,地址管理器可以将在多个集合当中的对应于存储器请求的地址的目标集合的忙位设置为预定值,将高速缓存数据复制到存储器的预定区域,并且更新用于逐出高速缓存数据的指针以指向预定区域。

当从cpu接收到对对应于目标集合的高速缓存区域的写请求时,地址管理器可以参考目标集合的忙位,当忙位是预定值时允许写请求等待,并且在预定区域中完成高速缓存数据的逐出之后处理写请求。

根据本发明的另一实施例,提供了包括上述存储器控制设备、cpu、存储器和储存设备的计算设备。

根据本发明的又一实施例,提供了一种计算设备的存储器控制设备,计算设备包括cpu、存储器和基于闪存的储存设备。存储器控制设备包括地址管理器、管理用于储存设备的队列的队列引擎、用于存储器的存储器接口和用于储存设备的储存设备接口。地址管理器将存储器的存储器空间和储存设备的储存空间聚合成扩展的存储器空间,并且通过使用存储器的存储器空间作为用于储存设备的储存空间的高速缓存来处理来自cpu的对扩展的存储器空间的存储器请求。地址管理器使用基于存储器请求的地址来查找在高速缓存中的命中或未命中的高速缓存逻辑。当存储器请求是命中时,地址管理器基于高速缓存逻辑的与存储器请求的地址相对应的条目通过存储器接口来将存储器请求传递到存储器。当存储器请求是未命中时,地址管理器基于高速缓存逻辑的与存储器请求的地址相对应的条目来从存储器请求生成具有用于储存设备的命令结构的命令,并且队列引擎通过储存设备接口来将该命令传递到储存设备。

通过使用硬件高速缓存逻辑作为高速缓存逻辑,地址管理器可以在没有软件的帮助的情况下将存储器的存储器空间和储存设备的储存空间聚合成扩展的存储器空间。

根据本发明的又一实施例,提供了计算设备的存储器控制设备,计算设备包括cpu、存储器和基于闪存的储存设备。存储器控制设备包括:存储器,其包括第一寄存器和存储器区域;储存设备,其包括第二寄存器和闪存介质;地址管理器;储存设备命令生成器;以及存储器接口。地址管理器将存储器的存储器空间和储存设备的储存空间聚合成扩展的存储器空间,并且通过使用存储器的存储器空间作为用于储存设备的储存空间的高速缓存来处理来自cpu的对扩展的存储器空间的存储器请求。存储器接口是用于存储器的接口,并通过基于寄存器的接口连接到第一寄存器和第二寄存器。地址管理器使用基于存储器请求的地址来查找在高速缓存中的命中或未命中的高速缓存逻辑。当存储器请求是命中时,地址管理器基于高速缓存逻辑的与存储器请求的地址相对应的条目通过存储器接口来将存储器请求传递到存储器。当存储器请求是未命中时,地址管理器基于高速缓存逻辑的与存储器请求的地址相对应的条目来为储存设备生成直接访问存储器的命令,并且通过基于寄存器的接口来将该命令传递给储存设备,使得储存设备通过基于寄存器的接口来直接访问存储器。

通过使用硬件高速缓存逻辑作为高速缓存逻辑,地址管理器可以在没有软件的帮助的情况下将存储器的存储器空间和储存设备的储存空间聚合成扩展的存储器空间。

附图说明

图1和图2各自是使用持久存储器的计算设备的示意性框图。

图3是示出用户应用为了扩展具有ssd的nvdimm而需要的软件支持和储存堆栈的图。

图4是示出ssd的结构的示意性框图。

图5是示出ssd的数据路径的图。

图6是示出在ssd中实现的软件架构的图。

图7是示出根据本发明的实施例的计算设备的示意性框图。

图8是示出根据本发明的实施例的存储器控制设备的操作的流程图。

图9是示出根据本发明的实施例的计算设备的存储器的图。

图10是示出根据本发明的实施例的存储器控制设备的高速缓存逻辑的图。

图11是示出根据本发明的实施例的在计算设备中的存储器和储存设备之间的数据传输的示例。

图12是示出根据本发明的实施例的在计算设备中的存储器和储存设备之间的数据传输的另一示例。

图13、图14和图15是示出根据本发明的实施例的在存储器控制设备中的电源故障恢复过程的图。

图16是示出根据本发明的另一实施例的计算设备的示意性框图。

图17是示出根据本发明的另一实施例的在计算设备中的基于寄存器的接口的图。

图18是示出根据本发明的另一实施例的存储器控制设备的操作的流程图。

实施例的详细描述

在以下详细描述中,仅通过例证的方式只显示和描述了本发明的某些示例性实施例。如本领域中的技术人员将认识到的,所描述的实施例可以以各种不同的方式被修改,而都不偏离本发明的精神或范围。相应地,附图和描述被视为是本质上是例证性的而不是限制性的。在整个说明书中,类似的参考数字表示类似的元件。

图1和图2各自是使用持久存储器的计算设备的示意性框图。

参照图1和图2,计算设备包括cpu(中央处理单元)110、持久存储器121或122、储存设备130和存储器控制设备140。

存储器控制设备140将持久存储器121或122以及储存设备130与cpu110连接,并且可以是例如北桥或存储器控制器集线器(mch)。

持久存储器121或122可以是例如nvdimm,并且经由存储器总线150连接到存储器控制设备140。存储器总线150可以是例如dimm(双列直插式存储器模块)存储器总线。

如图1所示,持久存储器121可以是nvdimm-n。nvdimm-n121是对于持久存储器模块的jedec(联合电子设备工程委员会)标准,并且包括dram模块121a、闪存模块121b、超级电容器121c、电源管理器121d、nvdimm控制器121e、dimm连接器121f和多路复用器(mux)121g。

nvdimm-n121集成dram模块121a和闪存模块121b。闪存模块121b作为dram模块121a的备份储存介质而具有与dram模块121a相同的容量,并且是用户不可见的。超级电容器121c被用作当电源故障出现时对于dram模块121a的备份操作的能量源,并且电源管理器121d管理超级电容器121c的功率。dimm连接器121f将nvdimm-n121连接到存储器总线。多路复用器121g位于dimm连接器121f和dram模块121a之间,并且在备份和恢复操作发生时将dram模块121a与存储器总线150隔离。nvdimm控制器121e控制对dram模块121a的访问以及在dram模块121a和闪存模块121b之间的备份和恢复操作。

如图2所示,持久存储器可以是nvdimm-p122。nvdimm-p122包括dram模块122a、储存级存储器(scm)122b、超级电容器122c、电源管理器122d、nvdimm控制器122e和dimm连接器122f。

与nvdimm-n121不同,nvdimm-p122集成dram模块122a和scm模块122b,并将scm模块122b的储存空间展现给用户。scm模块122b可以是例如具有板载控制器的3dxpointtm

由于在正常操作模式中dram模块121a或122a服务于对nvdimm121或122的存储器请求,因此nvdimm121或122可以提供像dram一样的延迟和协议管理。当意外的电源故障出现时,dram模块121a或122a从超级电容器121c或122c分接电力,并保持该状态,直到nvdimm控制器121e或122e完成从dram模块121a或122a到闪存模块121b或scm模块122b的备份操作为止。在电力恢复之后,nvdimm控制器121e或122e开始从闪存模块121b或scm模块122b到dram模块121a或122a的恢复操作。

储存设备130可以是例如ssd,特别是诸如超低延迟闪存(ull闪存)的高性能ssd。ssd130连接到存储器控制设备140的另一部分,即pcie(外围部件互连标准)根复合体141。pcie接口在现代计算机系统中被视为存储器总线,但是在cpu110和ssd130之间传输4kb或更大的数据包用于i/o(输入/输出)事务。由于i/o访问的粒度是页或块,用户应用只能通过穿过os的整个储存堆栈来访问ssd130,该储存堆栈包括在nvme(非易失性存储器标准)驱动器的顶部上的i/o运行时间库、文件系统和块层。nvme驱动器通过pcie来管理数据包的传输,并通过pcie基线地址寄存器(bar)来与在ssd130中的nvme控制器通信,该pcie基线地址寄存器包括门铃寄存器、队列属性、对于每个队列的目标地址和nvme控制器信息。

图3是示出用户应用为了扩展具有ssd的nvdimm而需要的软件支持和储存堆栈的图。

在linux系统中的存储器映射文件(mmf)模块(被称为“mmap”)可用于扩展具有ssd306的nvdimm的持久存储器空间。如图3所示,如果过程301在步骤s310中调用具有用于ssd306的文件描述符(fd)的mmap,则mmf模块通过向存储器管理结构(例如,mm_struct)分配虚拟存储器区域(vma)来在它的由该结构表示的过程地址空间(虚拟空间)中创建新的映射。换句话说,在步骤s320中,mmf模块通过在过程存储器和目标文件之间建立映射来将fd链接到vma。在步骤s330中,当过程301通过加载/存储指令(ld/st)来访问由vma指定的存储器时,如果数据在nvdimm中不可用,则这触发页错误。

当页故障出现时,在步骤s340中,存储器管理单元(mmu)处理程序302被调用并将新页分配给vma。新页从空闲页池中被分配。由于vma链接到目标文件,因此在步骤s350中,mmu处理程序302检索与fd相关联的文件元数据(例如索引节点),并获取对它的访问的锁。然后,mmu处理程序302与相应文件系统(fs)303的故障处理程序通信,以从ssd306读取页。在步骤s360中,文件系统303初始化被称为bio的块i/o请求结构,并将它提交给多队列块i/o排队(blk-mq)层304,该层304在多个软件队列上调度i/o请求。根据目标系统的设计,一个或更多个软件队列可以映射到由nvm驱动器305管理的硬件派发队列。在步骤s370中,blk-mp层304将i/o请求传递给nvme驱动器305,并且在步骤s380中,nvme驱动器305根据i/o请求来向ssd306发出命令。一旦i/o请求(即,bio)的服务在ssd306中完成并且实际数据被加载到所分配的页存储器的新区域,mmu处理程序302就在步骤s390中创建页表项(pte),在pte中记录新的页地址,并重新开始该过程。

因此,mmf模块可用于扩展具有一个或更多个ssd的nvdimm的持久存储器空间。然而,由于由页错误、文件系统访问、上下文切换和数据拷贝引起的高开销,这种方法可能使由高性能ssd带来的相当大一部分的好处无效。

接下来,参照图4至图6描述ssd。

图4是示出ssd的结构的示意性框图,图5是示出ssd的数据路径的图,以及图6是示出在ssd中实现的软件架构的图。

参照图4,最新技术的ssd(例如ull闪存)通常采用大量闪存封装410作为闪存介质(闪存复合体),并通过被称为通道ch1、ch2、ch3和ch4的多个系统总线连接到闪存封装410。为了方便起见,在图4中示出了四个通道ch1至ch4和连接到每个通道chi的两个闪存封装410。

每个闪存封装410包括用于快速响应时间和低延迟的多个管芯420,并且管芯420连接到共享总线421。每个管芯420可以包括多个平面430。为了方便起见,在图4中示出了一个闪存封装410包括三个管芯420,并且每个管芯420包括两个平面430。通道ch1至ch4连接到ssd的控制器440,并且控制器440可以采用dram450作为高速缓存。为了提供大规模并行性和高i/o性能,ssd的控制器440跨越多个通道ch1至ch4、封装410、管芯420和平面430散布来自主机的i/o请求的给定集合。

此外,ssd采用这种多通道和多路架构,但优化数据路径和通道条带化(channelstripping)。具体地,ull闪存将来自主机的4kbi/o请求分成两个操作,并将它们同时发到两个通道;这样做可以有效地将直接存储器存取(dma)延迟减少一半。虽然大多数高性能ssd采用多层单元(mlc)或三层单元(tlc),但ull闪存采用被称为z-nand的新型的闪存介质。z-nand运用3d-闪存结构来提供单层单元(slc)技术,但优化i/o电路和存储器接口以实现短延迟。具体地,z-nand使用被称为垂直nand(v-nand)架构的48个堆叠的字线层,以体现slc存储器。由于它的独特的nand闪存架构和先进的制造技术,z-nand的读和写延迟(即3μs和100μs)分别比现有的v-nand闪存存储器低15倍和7倍。

此外,ull闪存在它的多个通道前实现大的dram模块,并支持基于nvme的i/o服务,这些服务由多个接口控制器和固件模块管理。ull闪存通过nvme接口展现巨大的并行性、低延迟和高带宽。dram模块的管理与nvm协议处理紧密结合,并且在ull闪存控制器或固件对数据执行dma之后,相同的数据可以在主机侧dram和ssd内部的dram中。

参照图5,nvme接口可以创建每cpu一个队列。这个队列由一对提交队列(sq)和完成队列(cq)组成,每个对都具有64k个条目。这些是简单的fifo(先进先出)队列,且每个条目都被物理区域页(prp)指针引用。如果i/o请求的大小大于4kbnvme包,则数据可以由prp的列表而不是单个prp指针引用。

在图5中假设sq和cq的头部指针和尾部指针从条目0(即h0和t0)开始。当请求到达sq时,主机(即,主机的nvme驱动器501)在步骤s510中将sq尾部指针增加到t1,并且在步骤s520中用新尾部指针使相应的门铃寄存器503振铃,使得在ssd内的nvme控制器502可以使与主机侧sq配对的ssd侧sq同步。在步骤s530中,ssd的nvme控制器从由sq头部指针h0指向的条目(条目0)获取i/o请求。因此,sq头部指针h1指向下一个条目(条目1)。由于对于每个条目的数据存在于由prp指向的主机侧dram中,因此ssd处理对于i/o请求的dma,且然后在步骤s540中闪存介质和固件为该请求服务。

一旦服务完成并且完成结果被提交给与sq配对的cq,nvme控制器502就在步骤s550将cq尾部指针从t0移动到t1,并且在步骤s560向主机通知在消息信号中断(msi)上的事件。然后在步骤s570中,主机跳到中断服务例程(isr)并使cq尾部指针同步。isr在步骤s570中完成请求并更新(即增加)cq头部指针,并且在步骤s580中用新头部指针使相应的门铃寄存器504振铃以通知主机侧i/o处理已经完成。最后,ssd的nvme控制器502释放内部数据并增加cq头部指针。nvme接口不知道缓存在主机侧dram中的数据,而对于每个i/o请求的数据可以驻留在主机侧dram中。因此,即使i/o请求可以由主机侧dram服务,nvme接口也将使请求排队并处理它们。

参照图6,在ssd内的固件层的顶部处,主机接口层(hil)610负责解析nvme队列611的nvme命令(cmd),并通过与内部nvme控制器协作来管理nvme队列611。

所解析的nvme命令(cmd)可以包括i/o请求、长度和用于指示读/写的请求类型(r/w)。hil610可以将可以具有任何长度的i/o请求分成子请求。子请求的大小可以与固件模块管理的单元i/o大小匹配。所解析的(和单独的)请求被转发到闪存转换层(ftl)620。ftl620将给定的逻辑地址(例如逻辑块地址(lba))转换成物理地址(例如物理页码(ppn))。在每个子请求的地址被转换成ppn之后,闪存接口层(fil)630提交请求并管理事务,这构成了多个闪存命令,例如行/列地址、i/o命令、管理命令和dma传输。在该i/o处理期间,ftl620或fil630根据其实现和设计策略而可以跨越多个内部资源(例如通道、封装、管芯、平面等)对请求进行条带化,从而实现低延迟和高带宽。

接下来,参考图7到图15描述根据本发明的实施例的计算设备的存储器控制器设备。

图7是示出根据本发明的实施例的计算设备的示意性框图,并且图8是示出根据本发明的实施例的存储器控制设备的操作的流程图。图7示出可能的计算设备的示例,并且根据本发明的实施例的计算设备可以由各种结构实现。

参照图7,根据本发明的实施例的计算设备包括cpu710、存储器720、储存设备730和存储器控制设备740。

存储器720可以是由cpu710访问和使用的主存储器。在一个实施例中,存储器720可以是易失性存储器,例如dram。在另一实施例中,存储器720可以是持久存储器,并且持久存储器可以是例如nvdimm。

储存设备730是基于闪存的储存设备,例如ssd,并且可以是例如ull闪存。

存储器控制设备740将存储器720和储存设备730与cpu710连接,并且可以是例如北桥或存储器控制器集线器(mch)。存储器控制设备740提供将存储器720的存储器容量和储存设备730的储存器容量聚合成扩展的存储器空间(例如单个存储器空间)的储存器上存储器(memory-over-storage)(mos),并且该扩展的存储器空间可以用作工作存储器扩展。在一些实施例中,存储器控制设备740可以自动化必要的硬件,以便通过聚合存储器720的存储器容量和储存设备730的储存器容量来扩展存储器空间。在一些实施例中,当存储器720是持久存储器时,扩展的存储器空间可以用作持久存储器扩展。

存储器控制设备740通过将储存设备730的储存空间映射到存储器720的存储器空间来处理来自主机(例如,cpu710的存储器管理单元(mmu))的所有存储器请求。因此,在一些实施例中,存储器请求的地址可以指示储存设备730的地址。在一些实施例中,mmu可以是管理由cpu710访问的存储器的硬件单元,并且可以在与cpu710相同的芯片上实现,但是也可以以与cpu710分离的芯片的形式实现。存储器控制设备740使用存储器720的存储器空间作为储存设备730的高速缓存。因此,cpu710的mmu或储存设备730可以访问存储器720以传输目标数据。在高速缓存未命中的情况下,存储器控制设备740在内部管理nvme命令和i/o请求队列,同时对os隐藏所有nvme相关协议和接口管理信息,使得由mmu请求的数据可以总是由存储器720服务。

再次参考图7,存储器控制设备740包括地址管理器741、存储器控制器742和队列引擎743。存储器控制器742通过存储器接口744连接到存储器720,并管理传输到存储器720或从存储器720传输的数据流。队列引擎743通过储存设备接口745连接到储存设备730。在一个实施例中,存储器接口744可以是ddr(双倍数据速率)接口,并且储存设备接口745可以是pcie根复合体和pcie接口。

地址管理器741通过将储存设备730的储存器容量展示给cpu710、特别是cpu710的mmu来提供字节可寻址地址空间。由于存储器720被用作高速缓存,因此地址管理器741可以使用高速缓存逻辑(例如硬件高速缓存逻辑)来决定进入的存储器请求被转发到哪里。此外,地址管理器741管理用于指示数据被存储在存储器720中的区域的prp。在一些实施例中,地址管理器741可以通过采用硬件高速缓存逻辑来实现硬件自动化,该逻辑决定进入的存储器请求被转发到哪里。

参照图7和图8,当在步骤s810中存储器控制设备740从主机接收到存储器请求时,地址管理器741在步骤s820中检查存储器请求的主机是谁。由于cpu710的mmu或储存设备730可以访问存储器720以传输目标数据,因此地址管理器741在步骤s820中检查存储器请求的主机是谁。

如果储存设备730在步骤s820中生成存储器请求,则地址管理器741在步骤s830中允许存储器请求直接访问存储器720。换句话说,储存设备730的控制器(例如nvme控制器)可以通过参考地址管理器741管理的prp来执行数据传输。

如果在步骤s820中由mmu生成存储器请求,则地址管理器741在步骤s840中以存储器的地址检索高速缓存逻辑。当在步骤s850中高速缓存逻辑的查找结果是高速缓存命中时,在步骤s860中将存储器请求传递到存储器控制器742。在一些实施例中,存储器请求的地址可以是在存储器空间的地址空间(即,mos地址空间)上的地址,存储器720的存储器容量和储存设备730的储存器容量聚合成该存储器空间。cpu710(即mmu)可以通过将储存设备730的储存器容量视为主存储器的存储器空间来生成存储器请求。换句话说,存储器请求的地址可以是具有储存设备730的储存器容量作为主存储器的存储器空间的主存储器的地址。存储器请求的地址可以是字节可寻址地址。例如,由于现有的计算设备使用具有2~64gb的空间的存储器720,而诸如ssd的储存设备730支持太字节规模的容量,因此计算设备可以像使用具有太字节规模的容量的主存储器一样操作。

在高速缓存命中的情况下,与存储器请求的地址相对应的存储器地址可以被获取并被转发到存储器控制器742。存储器地址是用于访问存储器720的地址。然后,在步骤s865中,存储器控制器742通过存储器接口744访问存储器720并传输数据。

当在步骤s850中高速缓存逻辑的查找结果是高速缓存未命中时,地址管理器741从存储器请求生成用于在存储器720和储存设备730之间的数据传输的新的i/o请求(即,命令),并且在步骤s870中向队列引擎743发出i/o请求。因此在步骤s880中,队列引擎743通过pcie根复合体和接口向储存设备730提供命令,使得数据从储存设备730传输到存储器720或者从存储器720传输到储存设备730。一旦数据传输完成,存储器控制设备740就在步骤s890中通过存储器系统总线(例如,axi(高级可扩展接口))向mmu通知完成,使得mmu可以重试停止的指令。换句话说,mmu可以在读请求的情况下从存储器720(即对应的高速缓存区域)读取目标数据,并且可以在写请求的情况下将目标数据写入到存储器720,即对应的高速缓存区域。

在一些实施例中,地址管理器741可以通过填充对于储存设备730的命令结构(例如nvme命令结构)的信息字段来构成要发到队列引擎743的i/o请求。在一个实施例中,地址管理器741可以将指示读或写的信息填充到指示读或写的字段中(例如操作码字段),并将存储器地址、储存设备地址和页大小(例如4kb)分别填充到相应的prp、lba和长度字段中。

所生成的命令(例如nvme命令)可以由队列引擎743排队在sq中。队列引擎743可以使门铃寄存器振铃以向储存设备730通知i/o请求的到达。每当从储存设备730的控制器传递相应的中断时,队列引擎743可以使相应的cq同步并清除cq和sq的目标条目。

图9是根据本发明的实施例的计算设备的存储器的图。

参照图9,在一些实施例中,存储器720的特定存储器区域可以被固定,并且固定的存储器区域721可以用于存储器控制设备(图7的740)的操作。除了固定的存储器区域721之外,存储器720还可以包括用于高速缓存的高速缓存存储器区域722。在一个实施例中,固定的存储器区域721可以被分配给存储器720的上部存储器区域(例如,512mb)。高速缓存存储器区域722可以被分配给存储器720的剩余区域,并且可以由存储器控制设备740的地址管理器(图7的741)映射到mos地址空间。

在一些实施例中,固定的存储器区域721可以包括用于sq和cq的缓冲器721a,例如环形缓冲器。

当设计存储器控制设备740时可能出现的问题之一可能是电源故障管理。尽管诸如ssd的储存设备被视为保证数据持久性和一致性的块储存设备,但它通过文件系统被访问。具体地,文件系统和其他相关部件使用日志记录来支持一致性。由于存储器控制设备740可以移除mmf和文件系统支持,因此在ssd内部的dram中的数据可能在电源故障时丢失。虽然存储器控制设备740可以通过标记每请求的力单元存取(forceunitaccess,fua)来实施数据持久性,但是这样做可以通过禁用nvme接口的所有队列特征来显著降低ssd性能。

为了解决这一挑战,一些实施例可以使固定的存储器区域721对于cpu的mmu不可见。在初始化过程期间,存储器控制设备740检查固定的存储器区域721的sq和cq及其指针。如果没有电源故障,则sq和cq尾部指针指它们的队列条目的相同位置,以避免在任何给定运行时间处的队列管理和一致性的违反。如果电源故障出现,则sq和cq尾部指针可以指向它们的队列条目的不同位置(即不同偏移)。因此,当在电源故障后电力被恢复时,存储器控制设备740检查在mmu不可见的空间(即,固定的存储器区域721)中的sq和cq尾部指针之间的偏移差。存储器控制设备740可以基于偏移差来检测未决的请求,并且再次将它们发到储存设备730。

在一些实施例中,固定的存储器区域721可以包括用于高速缓存逻辑的标签阵列721c。

在一些实施例中,固定的存储器区域721可以包括prp池721b。高速缓存存储器区域722的目标页可以被复制到prp池721b,并且复制页的条目可以被prp引用。

在一些实施例中,固定的存储器区域721可以包括msi(消息信号中断)表721d。msi表721d可以包括中断资源的信息,并且中断资源可以是例如中断向量、地址和掩码。当储存设备730被初始化时,储存设备730的控制器可以读取msi表721d并将所读取的信息填充到它的msi配置中。

图10是示出根据本发明的实施例的存储器控制设备的高速缓存逻辑的图。

参照图10,在一些实施例中,存储器控制设备的地址管理器(图7的741)可以使用包括标签阵列1000的高速缓存逻辑。标签阵列1000包括多个通路1011、1012、1013和1014,并且每个通路包括多个集合,每个集合对应于阵列索引。在图10的示例中,假设标签阵列1000包括四个通路1011至1014,并且每个通路包括128个集合。在一些实施例中,标签阵列1000可以在存储器(图9的720)的固定的存储器区域(图9的721)中形成。每个集合可以指示在存储器720中的预定大小的块,特别是存储器720的高速缓存存储器区域722中的预定大小的块,并且可以包括标签和存储器地址。从mmu接收的存储器请求的地址可以分解成标签、阵列索引和偏移。例如,当每个通路包括128个集合时,阵列索引可能具有7位。在这种情况下,64位地址可以分解为例如36位标签、7位阵列索引和21位偏移。

存储器控制设备的地址管理器741使用从进入的存储器请求的地址分解的阵列索引来从标签阵列1000的通路1011至1014检索对应于阵列索引的集合的条目。地址管理器741将从通路1011至1014的相应集合中提取的标签与从进入的请求的地址分解的标签进行比较。

作为比较结果,如果从任何一个通路提取的标签与进入的请求的标签匹配,则地址管理器741确定高速缓存命中,并从存储匹配标签的集合中得到存储器地址。在高速缓存命中的情况下,地址管理器741将从标签阵列1000得到的存储器地址发到存储器控制器(图7的742),使得进入的请求可以在存储器(即存储器的高速缓存区域(图9的722))中被处理。

如果进入的请求的标签与从所有通路提取的标签不匹配,则地址管理器741确定高速缓存未命中。在高速缓存未命中的情况下,地址管理器741生成新的i/o请求。

在一个实施例中,当存储器请求是读请求时,地址管理器741可以生成两个i/o请求。这两个i/o请求可以包括从存储器(即,存储器的高速缓存区域722)逐出数据并将数据写入储存设备(图7的730)的写请求,以及从储存设备730读取数据并将数据填充到存储器(即,存储器的高速缓存区域722)的读请求。在一些实施例中,写请求的prp(存储器地址)可以对应于存储在对应于阵列索引的集合中的存储器地址(即,对应的高速缓存区域的存储器地址),并且写请求的lba(储存设备地址)可以对应于基于存储器请求的阵列索引和存储在对应于阵列索引的集合中的标签而生成的储存设备地址。此外,读请求的prp(存储器地址)可以对应于存储在对应于阵列索引的集合中的存储器地址(即,对应高速缓存区域的存储器地址),并且读请求的lba(储存设备地址)可以对应于存储器请求的地址。在这种情况下,lba可以由储存设备730的ftl转换成物理地址(例如ppa)。储存设备730根据写请求将从高速缓存存储器区域722逐出的数据写入到储存设备730的闪存介质,并且根据读请求读取存储在储存设备730的闪存介质中的数据,使得数据被写入到高速缓存存储器区域722的相应区域。例如,储存设备730可以将由在写请求中包括的prp引用的高速缓存存储器区域722的数据写入到与在写请求中包括的储存设备地址(lba)相对应的储存设备730的闪存介质,并且可以从储存设备730的闪存介质中读取与在读请求中包括的储存设备地址(lba)相对应的目标数据,从而将目标数据写入到由在读请求中包括的prp引用的高速缓存存储器区域722。因此,一旦目标数据在高速缓存存储器区域722中是可用的,存储器控制设备740就可以将目标数据放置在系统总线上,并且通过设置mmu的相应命令和地址总线来向cpu通知完成。

在一个实施例中,当存储器请求是写请求时,地址管理器741可以生成写请求作为i/o请求。写请求可以是从存储器(即,存储器的高速缓存存储器区域722)逐出数据并将数据写入到储存设备730的请求。在一些实施例中,写请求的prp(存储器地址)可以对应于存储在对应于阵列索引的集合中的存储器地址,并且写请求的lba(储存设备地址)可以对应于基于存储器请求的阵列索引和存储在对应于阵列索引的集合中的标签而生成的储存设备地址。储存设备730根据写请求将从高速缓存存储器区域722逐出的数据写入到储存设备730的闪存介质。例如,储存设备730可以将由在写请求中包括的prp引用的高速缓存存储器区域722的数据写入到与在写请求中包括的储存设备地址(lba)相对应的储存设备730的闪存介质。因此,地址管理器741可将从标签阵列1000提取的存储器地址发到存储器控制器742,使得存储器请求的目标数据可被写入到高速缓存存储器区域722的逐出区域。

在一些实施例中,如图10所示,高速缓存逻辑可以进一步包括比较器1021、1022、1023和1024、或门1030、多路复用器1040和编码器1050。在一个实施例中,比较器1021至1024、或门1030、多路复用器1040和编码器1050可以在地址管理器741中实现。比较器1021至1024分别对应于通路1011至1014。比较器1021至1024中的每一个比较从通路1011至1014中的相应通路提取的标签与进入的存储器请求的标签,并根据比较结果来输出“1”或“0”。例如,比较器1021至1024中的每一个在两个标签相同时可以输出“1”(即,高速缓存命中),以及在两个标签不同时可以输出“0”(即,高速缓存未命中)。或门1030基于比较器1021至1024的输出来最终输出高速缓存命中或未命中。或门1030在比较器1021至1024中的任一个输出“1”时可以输出“1”(即,高速缓存命中),以及在所有比较器1021至1024输出“0”时可以输出“0”(即,高速缓存未命中)。编码器1050可以对从比较器1021至1024输出的值进行编码,以将指示在通路1011至1014当中对应于高速缓存命中的通路的值传送到多路复用器1040。多路复用器1040可以输出从在通路1011至1014当中对应于高速缓存命中的通路(即对应于比较器输出‘1’的通路)得到的存储器地址。

在一些实施例中,每个集合可以包括忙位作为条目,该忙位指示对应的高速缓存区域是否正在使用中。包括sq和cq的nvme数据结构可以被映射到存储器720的可以被应用或os盖写的区域。这可能潜在地为存储器控制设备740产生正确性问题。此外,在存储器控制设备740逐出数据的情况下,存储器720中的数据可能是不一致的,即使数据正通过prp被写入到储存设备730或从储存设备730加载。为了保护数据被传输到的存储器720,存储器控制设备740可以通过每个条目的忙位来跟踪数据传输状态。在一个实施例中,忙位可以每当队列引擎743发出命令时被置位,并且可以在根据命令的i/o服务被完成时(例如,当msi报告完成并更新cq头部指针时)被清除。因此,如果忙位被置位,则存储器控制设备740可以拒绝相应的数据被逐出。

如上所述,根据本发明的实施例,存储器的存储器容量和储存设备的储存器容量可以聚合成扩展的存储器空间,并且扩展的存储器空间可以用作工作存储器扩展或持久存储器扩展。在这种情况下,cpu可以以字节可寻址地址访问扩展的存储器空间,其使用储存器容量作为主存储器的存储器容量。在一些实施例中,扩展的存储器空间可以在不修改现有储存设备、存储器和接口的情况下聚合。在一些实施例中,可以使用硬件高速缓存逻辑等通过硬件自动化来在没有软件的帮助的情况下聚合扩展的存储器空间。

图11是示出根据本发明的实施例的在计算设备中的存储器和储存设备之间的数据传输的示例的图,以及图12是示出根据本发明的实施例的在计算设备中的存储器和储存设备之间的数据传输的另一示例的图。

参照图11,在步骤s1110中,mmu1101可以请求在mos地址空间的0xf0处的读取,0xf0的阵列索引和标签分别为0x0和0xf。假设在高速缓存逻辑的标签阵列(图10的1000)中,对应于0x0的阵列索引的集合将0xe存储为标签并将0xa存储为存储器地址。然后,由于高速缓存未命中出现,在步骤s1120和s1130中,地址管理器741生成要传输到储存设备(图7的730)的控制器(例如nvme控制器)731的写请求和读请求。由于0xe被存储为对应于在标签阵列1000中的0x0的阵列索引的集合的标签,写请求可以是将存储在高速缓存中的数据(例如在mos地址空间的0xe0处的页,其阵列索引和标签分别是0x0和0xe,即,在存储器的0xa处的页)逐出到储存设备730的闪存介质732的请求,并且读请求可以是将闪存介质的对应于0xf0的页填充到对应于0x0的阵列索引的高速缓存中的请求。

在读请求之后,在步骤s1140中,mmu1011可以请求在mos地址空间的0xf0处的写入以更新在0xf0处的数据。在这种情况下,由于数据没有已经从高速缓存中被逐出或者正在逐出中,因此高速缓存未命中可能出现。根据高速缓存未命中,在步骤s1150中,地址管理器741可以生成将存储在高速缓存中的数据逐出到储存设备730的写请求。写请求可以是将存储在高速缓存中的数据(例如,在mos地址空间的0xe0处的页,即在存储器的0xa处的页)逐出到储存设备730的闪存介质732的请求。然后,地址管理器741从高速缓存中逐出相同的数据。换句话说,可能出现冗余逐出的问题。

队列引擎743可以包括对应于在步骤s1120中的写请求、在步骤s1130中的读请求和在步骤s1150中的写请求的三个命令(例如三个nvme命令)。这三个命令可以由储存设备的控制器731以fifo顺序处理。然而,由于在储存设备内的不同级别的闪存并行性和任务,在储存设备730内的i/o完成可能是无序的。此外,由于储存设备730的控制器731基于完成的顺序将数据传输到存储器720,储存设备730的控制器731和地址管理器741可以访问存储器720的相同位置,从而引起逐出危险。在上述示例中,在步骤s1160中,存储在高速缓存中的数据(即,在mos地址空间的0xe0处的数据)可以被逐出并根据写请求(s1120)而被写入到储存设备730的闪存介质732,并且在步骤s1170中,存储在高速缓存中的数据(即,在mos地址空间的0xe0处的数据)可以被逐出并根据写请求(s1150)而被写入到储存设备730的闪存介质732。由于数据从高速缓存中被逐出,在步骤s1180中,地址管理器741可以访问存储器720,以根据来自mmu1101的写请求(s1140)将数据从mmu1101写入到mos地址空间的0xf0。此时,在步骤s1190中,储存设备的控制器732可以根据读请求(s1130)来访问存储器720以将数据从储存设备730写入到mos地址空间的0xf0。因此,储存设备的控制器731和地址管理器741可以访问存储器720的相同位置,从而引起逐出危险。

在一些实施例中,为了防止冗余逐出和逐出危险,固定的存储器区域(图9的721)可以包括如参考图9所描述的prp池721c,并且标签阵列的每个集合可以包括如参考图10所描述的忙位。

参照图12,如参照图11所描述的,当在步骤s1210中从mmu1101接收到对在0xf0处的读取的请求时,在步骤s1220和s1230中,地址管理器741可以根据高速缓存未命中来生成对高速缓存逐出的写请求和对向高速缓存填充数据的读请求。当队列引擎743向储存设备730发出与写请求相对应的命令时,在步骤s1240中,地址管理器741可以切换(例如,从“0”设置为“1”)在标签阵列中的相应集合的忙位,并且通过将在mos地址空间的0xe0处的页克隆到分配给固定的存储器区域721的prp池721b来将目标数据与高速缓存隔离。此外,在步骤s1240中,地址管理器741可以用所克隆的页的位置更新prp值,以用prp池721b替换对prp的引用,并将prp提交给队列引擎743。因此,通过用prp池更新prp,可以在dma期间在存储器720和储存设备的闪存介质732之间保持数据一致性。

接下来,如参考图11所述的,当地址管理器741接收到对在0xf0处的写入的请求时,高速缓存未命中可能在步骤s1250中出现。然后,在步骤s1260中,地址管理器741可以通过引用在标签阵列中的相应集合的忙位来认识到数据处于逐出过程中,并将写请求放入等待队列1102中。在一些实施例中,等待队列1102可以在固定的存储器区域中(图9的721)形成。

因此,队列引擎743可以包括与写请求(s1220)和读请求(s1230)相对应的两个命令。在步骤s1290中,被复制到prp池721c的数据(即,在mos地址空间的0xe0处的数据)可以被逐出并根据写请求(s1120)被写入到储存设备730的闪存介质732。此时,由于写请求(s1250)在等待队列1102中等待,因此冗余逐出不出现。此外,在步骤s1270中,储存设备的控制器731可以根据读请求(s1230)将存储在储存设备的闪存介质732中的数据写入到mos地址空间的0xf0。此时,由于写请求(s1250)在等待队列1102中等待,逐出危险不出现。此外,一旦根据读请求(s1230)的命令的i/o服务完成,地址管理器741就在步骤s1280中清除忙位(即,从“1”设置为“0”),并且再次向队列引擎743发出位于等待队列1102中的写请求。由于根据读请求(s1230)将数据存储在高速缓存中,因此高速缓存命中出现,并且存储在高速缓存中的数据(即,在mos地址空间的0xf0处的数据)可以被提供。

图13、图14和图15是示出根据本发明的实施例的在存储器控制设备中的电源故障恢复过程的图。

当mos地址空间用作工作存储器扩展时,在队列管理上不展现显著的开销。然而,当mos地址空间用作储存设备(或持久存储器扩展)时,可能需要对数据持久性的保证。为此,每当高速缓存逻辑需要更新在储存设备(图7的730)中的数据时,存储器控制设备(图7的740)可能需要对命令(例如nvme命令)进行刷新。为了解决这个问题,在一些实施例中,日志标签可以被添加到要发到队列引擎(图7的743)的命令的条目中。在一个实施例中,日志标签可以被添加到nvme命令结构的保留位。日志标签可以保存指示相应命令是否由储存设备730完成的信息。例如,每当队列引擎743向储存设备730发送命令(即i/o请求)时,日志标签可以被设置为预定值(例如,“1”)。当从储存设备730到达指示完成的中断(例如msi)时,可以清除与完成相关联的命令的日志标签(例如被设置为“0”)。

例如,参照图13,在队列引擎743的sq中的四个命令cmd1、cmd2、cmd3和cmd4被发到储存设备730,并且sq的头部指针和尾部指针指同一位置(即,第五条目)。命令cmd1、cmd2、cmd3和cmd4在储存设备730中被处理,并且在这些命令当中的三个命令cmd1、cmd3和cmd4被完成,使得cq的头部指针和尾部指针指同一位置(即,第四条目)。因此,三个命令cmd1、cmd3和cmd4的日志标签jt被清除为“0”,但是未完成的命令cmd2的日志标签jt仍然保持为置位状态,即“1”。如果此时电源故障出现,则储存设备730和存储器控制设备740不能完成命令cmd2。

由于固定的存储器区域(图9的721)的缓冲器721a保存sq的数据,因此在电源恢复时,存储器控制设备740首先检查固定的存储器区域721的缓冲器721a,以确定是否存在其日志标签jt为“1”的任何命令。如果存在其日志标签jt为“1”的命令cmd,则存储器控制设备740提取命令cmd2,并为i/o服务分配新的sq和cq,如图14所示。

接下来,如图15所示,存储器控制设备740向队列引擎743发出命令cmd2,以将命令cmd2插入到新的sq中。因此,队列引擎743增加sq的尾部指针并使门铃寄存器振铃,使得在电源故障的时刻未完成的命令cmd2可被服务。

接下来,参考图16到图18描述根据本发明的另一实施例的计算设备的存储器控制设备。

图16是示出根据本发明的另一实施例的计算设备的示意性框图,图17是示出根据本发明的另一实施例的在计算设备中的基于寄存器的接口的图,以及图18是示出根据本发明的另一实施例的存储器控制设备的操作的流程图。

参考图7描述的存储器控制设备740可以通过运用常规存储器接口744(例如常规ddr接口)和常规储存设备接口745(例如常规pcie接口)来提供大的工作存储器空间。这种存储器控制设备740可能不需要对现有储存设备730和现有存储器720进行任何修改。然而,在高速缓存未命中的情况下,目标数据穿过ddr模块(例如ddr控制器和ddr接口)和pcie模块(例如根复合体、事务层、数据链路层和物理层)。ddr(特别是ddr4)的峰值带宽是每通道19.2gb/s,但是储存设备(例如ssd)使用具有4个线道的pcie3.0,这使nvme的峰值带宽为3.97gb/s。因此,每当存在高速缓存未命中时,存储器控制设备740的性能可以被pcie带宽所限制。此外,存储器720的数据可以被编码并封装到pcie包中以传输到储存设备730,这也使当存在高速缓存未命中时的延迟变得更长。

因此,通过在ddr控制器和储存设备的nvme控制器之间移动数据而花费的接口延迟很长,使得存储器控制设备的性能可能下降。另外,即使存储器控制设备已经将数据保存在存储器720中,请求仍然可以被复制到在储存设备730内的存储器(例如dram)。这可以显著改善在块储存使用情况下的性能,但是也可能引入额外的能量消耗并增加储存设备730的内部复杂性。特别是,储存设备730的内部dram可能比由32个闪存芯片组成的闪存介质需要更多的功率。

为了解决这些问题,根据本发明的另一实施例,新的基于寄存器的接口可以代替门铃寄存器,并且储存设备可以连接到存储器接口。在这种情况下,闪存介质及其控制器可以从储存设备释放,并且数据路径可以直接连接到存储器。这种方法可以允许储存设备在没有来自存储器控制设备的任何干预的情况下访问存储器的存储器区域,并且在实现nvme队列的全部功能的同时从储存设备移除内部dram缓冲器。

具体地,参考图16,根据本发明的另一实施例的计算设备1600包括cpu1610、存储器1620、储存设备1630和存储器控制设备1640。省略了与参照图7描述的计算设备700的功能类似的功能的描述。

存储器控制设备1640包括地址管理器1641、存储器控制器1642、储存设备命令生成器1643和锁定寄存器1644。存储器控制器1642和储存设备命令生成器1643分别经由存储器接口1645连接到存储器1620和储存设备1630。因此,储存设备1630可以通过存储器接口1645直接访问存储器1620。在一个实施例中,存储器接口1645可以是ddr接口。

地址管理器1641可以基于存储器控制设备1640需要发起的i/o请求来控制储存设备命令生成器1643来写入捕获源地址和目的地址的一组寄存器以及i/o命令。然后,储存设备1630的控制器(例如nvme控制器)可以从存储器1620的源地址取出目标数据,并将目标数据转发到储存设备730的ftl,使得目标数据可以被编程到闪存介质。

在一些实施例中,用于管理通用储存设备(例如ssd)中的内部存储器(例如dram)的接口可以用作在存储器720和储存设备730之间的接口。然后,储存设备命令生成器1643和储存设备1630的控制器都可以访问存储器720。

参照图17,在一些实施例中,存储器1620可以包括控制逻辑1621、地址寄存器1622、数据锁存器1623和存储器区域1624,并且储存设备1630可以包括控制器1631、命令寄存器1632、地址寄存器1633、数据缓冲器1634和闪存介质1635。

在一些实施例中,存储器控制设备1640可以通过基于寄存器的接口连接到存储器1620和储存设备1630。用于在存储器接口1645中传输命令的引脚(例如we(写使能)引脚)可以经由总线连接到控制逻辑1621的引脚和命令寄存器1632的引脚。除了we信号之外,cas(列地址选通)信号和ras(行地址选通)信号也可以通过we引脚传输。用于在存储器接口1645中传输地址a[15:0]的引脚可以经由总线连接到地址寄存器1622的引脚和地址寄存器1633的引脚。用于在存储器接口1645中传输数据d[63:0]的引脚可以连接到数据锁存器1623的引脚和数据缓冲器1634的引脚。

参照图17和图18,当在步骤s1850中高速缓存逻辑的查找结果是高速缓存未命中时,在步骤s1870中,地址管理器1641将存储器请求转发到储存设备命令生成器1643,以允许储存设备命令生成器1643基于存储器请求来生成新命令。由于图15中的步骤s1810、s1820、s1830、s1840、s1850和s1860执行与参考图8描述的步骤s810、s820、s830、s840、s850和s860相同的操作,它们的描述被省略。

在步骤s1875中,储存设备命令生成器1643生成源地址、目的地址和指示请求类型的命令(例如i/o命令),并通过存储器接口1645将它们传递到储存设备1630。例如,当存储器接口1645是ddr接口时,源地址可以在ras信号定时(tras)处通过地址信号被传递,以及目的地址可以在cas信号定时(tcas)处通过地址信号被传递。可以基于由ddr接口定义的时钟周期来传递ras信号和cas信号。此外,该命令可以指示读或写,并且可以通过we信号被传递。在一些实施例中,一对源地址和目的地址可以对应于一对存储器地址(例如prp)和储存设备地址(例如lba)。例如,当数据根据存储器请求从储存设备1630被读取并被写入到存储器1620时,源地址可以是储存设备地址,且目的地址可以是存储器地址。当数据根据存储器请求从存储器1620被读取并被写入到储存设备1630(即,数据从存储器1620被逐出)时,源地址可以是存储器地址,且目的地址可以是储存设备地址。

在一些实施例中,如参考图8至图10所描述的,当存储器请求是读请求时,储存设备命令生成器1643可以生成两个i/o命令。这两个i/o命令可以包括从存储器1620(即,存储器的高速缓存区域(图9的722))逐出数据并将数据写入到储存设备1630的读命令,以及从储存设备1630读取数据并将数据填充到存储器1620(即,存储器的高速缓存存储器区域722)内的写命令。在一个实施例中,连同读命令一起传递的源地址和目的地址可以分别对应于存储器地址和储存设备地址。存储器地址(prp)可以对应于存储在对应于存储器请求的阵列索引的集合中的存储器地址,并且储存设备地址(lba)可以对应于基于存储器请求的阵列索引和存储在对应于阵列索引的集合中的标签而生成的储存设备地址。连同写命令一起传递的源地址和目的地址可以分别对应于储存设备地址和存储器地址。存储器地址(prp)可以对应于存储在对应于存储器请求的阵列索引的集合中的存储器地址,并且储存设备地址(lba)可以对应于存储器请求的地址。当存储器请求是写请求时,储存设备命令生成器1643可以生成读命令作为i/o命令。读命令可以是从存储器1620(即,存储器的高速缓存存储器区域722)逐出数据并将数据写入到储存设备1630的命令。

在一个实施例中,连同读命令一起传递的源地址和目的地址可以分别对应于存储器地址和储存设备地址。存储器地址(prp)可以对应于存储在对应于存储器请求的阵列索引的集合中的存储器地址,并且储存设备地址(lba)可以对应于基于存储器请求的阵列索引和存储在对应于阵列索引的集合中的标签而生成的储存设备地址。

储存设备1630还可以包括命令寄存器1632和地址寄存器1633。命令寄存器1632可以存储从存储器控制设备1640传递的命令,例如we信号,并且地址寄存器1633可以存储从存储器控制设备1640传递的源地址和目的地址,例如选通信号,例如ras和cas信号。

在命令和地址被传递到储存设备1630之后(即,在对于命令和地址的给定数量的周期之后),在步骤s1880中,存储器控制设备1640的储存设备命令生成器1643可以将锁定寄存器1644设置为对应于锁定的值(例如,“1”)。由于存储器1620可以被储存设备1630的控制器1631(例如nvme控制器)和存储器控制设备1640访问,因此锁定寄存器1644可以防止存储器1620被同时访问。将锁定寄存器1644置位可以指示储存设备1630的控制器1631作为总线主设备来接管控制。因此,控制器1631可以基于存储器接口1645(例如ddr接口)的存储器定时来访问存储器1620。此外,可以阻止存储器控制设备1640访问存储器1620。

当命令的请求类型是读取时,储存设备1630的控制器1631可以立即发起与存储器1620的通信。控制器1631可以根据被记录在命令寄存器1632中的请求类型(即,读)来将读命令写入到存储器1620的控制逻辑1621,并且可以将被记录在地址寄存器1633中的存储器地址(即,源地址)写入到存储器1620的地址寄存器1622。因此,从存储器1620的存储区1624读取的对应于存储器地址的数据可以从存储器1620的数据锁存器1623传输到储存设备1630的数据缓冲器1634。然后,控制器1631可以将存储在数据缓冲器1634中的数据写入到闪存介质1635。

当命令的请求类型是写时,控制器1631可以在相应的读服务在储存设备1630的闪存介质中被完成之后发起与存储器1620的通信。控制器1631可以根据被记录在命令寄存器1632中的请求类型(即,写)来将写命令写入到存储器1620的控制逻辑1621,并且可以将被记录在地址寄存器1633中的存储器地址(即,目的地址)写入到存储器1620的地址寄存器1622。因此,从闪存介质1635读取并随后存储在数据缓冲器1634中的数据可以被传输到存储器1620的数据锁存器1623,且然后在存储器1620的存储器区域1624中被写入。

在存储器1620和储存设备1630之间的数据传输在步骤s1885中完成之后,控制器1631释放锁定寄存器1644。换句话说,在步骤s1890中,控制器1631可以将锁定寄存器1644设置为对应于锁定释放的值(例如,“0”)。因此,使用锁定寄存器1644可以避免储存设备1630的控制器1631和存储器控制设备1640的存储器控制器1642都同时使用总线的情况。尽管这种基于寄存器的接口可以减少在数据传输中涉及的开销,但是锁定寄存器1644被置位时的时间段可能需要被最小化。由于闪存介质1635的延迟相对长于存储器1620的延迟,因此控制器1631可以使用数据缓冲器1634,例如用于数据传输的数据和高速缓存寄存器,而不是等待闪存事务的整个延迟。

一旦数据传输完成,存储器控制设备1600就可通过存储器系统总线(例如axi)向mmu通知完成,使得mmu可在步骤s1895中重试停止的指令。

再次参考图17,在一些实施例中,可以使用用于使存储器1620和储存设备1630起作用的引脚,例如cs(芯片选择)引脚。主设备或从设备可以由通过cs引脚传递的cs信号的值来确定。在一个实施例中,在存储器控制设备1640拥有锁(即,锁定寄存器1644被设置为锁定释放)的情况下,如果存储器1620的cs引脚被设置为启用值(例如,“1”)并且储存设备1630的cs引脚被设置为禁用值(例如,“0”),则存储器控制设备1640可以作为主设备操作,并且存储器1620可以作为从设备操作。换句话说,存储器控制设备1640可以访问存储器1620。在存储器控制设备1640拥有锁的情况下,如果存储器1620的cs引脚被设置为“0”并且储存设备1630的cs引脚被设置为“1”,则存储器控制设备1640可以作为主设备操作,而储存设备1630可以作为从设备操作。换句话说,存储器控制设备1640可以访问储存设备1630。在储存设备1630接管锁的情况下(即,锁定寄存器1644被置位),如果存储器控制设备1640将存储器1620的cs引脚设置为“1”,则储存设备1630可以作为主设备操作,而存储器1620可以作为从设备操作。换句话说,储存设备1630可以访问存储器1620。

如上所述,根据本发明的另一个实施例,存储器的存储器容量和储存设备的储存器容量可以聚合成扩展的存储器空间,并且扩展的存储器空间可以用作工作存储器扩展或持久存储器扩展。在一些实施例中,由数据传输所施加的开销可以由基于寄存器的接口去除,并且由储存设备的内部dram带来的能量低效可以通过去除内部dram来改善。在一些实施例中,通过使用硬件高速缓存逻辑等的硬件自动化,可以在没有软件的帮助的情况下聚合扩展的存储器空间。

接下来,描述在真实硬件上实现根据本发明实施例的存储器控制设备之后测量的结果。为了测量性能,在由binkert等人提出的gem5模拟器中的主存储器用8gb基于dram的nvdimm代替,且800gbull闪存原型用作储存设备。如在表1的示出详细规范。

表1

在这种情况下,与基于mmf(即,基于软件)的存储器和储存设备的传统混合设计相比,参考图7描述的存储器控制设备和参考图16描述的存储器控制设备分别将mips(每秒百万条指令)提高了97%和119%,同时在执行数据密集应用时节省了41%和45%的系统能量。

虽然已经结合目前被认为是实际的示例性实施例的实施例描述了本发明,但应理解的是,本发明不限于公开的实施例,而是相反地,旨在覆盖包括在所附权利要求的精神和范围内的各种修改和等同布置。

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