NVMe协议处理器及其处理方法与流程

文档序号:16465924发布日期:2019-01-02 22:47阅读:885来源:国知局
NVMe协议处理器及其处理方法与流程

本发明涉及固态存储设备(solidstoragedevice,ssd),更具体地,本发明涉及存储器控制器中用于处理nvme(nonvolatilememoryexpress,非易失存储器)协议的nvme协议处理器及nvme协议处理方法。



背景技术:

nvme协议的处理流程一般为:

1.命令提交

(1)主机向提交队列(submissionqueue,sq)写入nvme命令;

(2)主机写入更新后的sq队列尾指针,作为doorbell(门铃)通知nvme协议处理器有新命令要处理;

2.命令处理

(1)nvme协议处理器从主机的sq队列取得nvme命令;

(2)nvme协议处理器处理nvme命令;

3.命令完成

(1)nvme协议处理器向完成队列(completionqueue,cq)队尾写入数据,指示命令处理完成;

(2)nvme协议处理器生成msi-x中断,指示主机处理;

(3)主机处理cq中的数据;

(4)主机写入更新后的完成队列cq的头指针,作为doorbell通知nvme协议处理器。

现有技术中主要以全硬件方式实现对nvme协议的处理,当nvme协议升级时,或者对nvme协议进行扩展时,例如增加功能,需要修改硬件设计才能实现对升级或扩展后的nvme协议的处理。

如果用全硬件方式实现nvme协议,假设需要支持三条nvme命令a,b和c,并实现了对应的命令处理功能。但是,如果nvme协议升级,需要支持5条命令,那么多出来的两条命令d和e就得通过增加硬件电路的方式来实现。而对于asic(applicationspecificintegratedcircuit,专用集成电路),增加硬件电路就需要重新进行前后端设计、仿真验证,会带来高昂的研发成本。



技术实现要素:

本发明的目的是为解决目前采用全硬件方式实现nvme协议处理器不能很好地适应nvme协议升级或扩展的技术问题。

为了实现上述发明目的,一方面,本发明提供了一种nvme协议处理器,所述nvme协议处理器第一种实现方案如下:

包括:cpu子系统、共享存储器、gatherdma模块、scatterdma模块、主机存取模块和pcie控制器;

所述cpu子系统包括一个或多个cpu,所述cpu耦合到所述共享存储器;

所述gatherdma模块与所述共享存储器连接,用于将外部主机的数据通过所述pcie控制器搬移到所述共享存储器;

所述scatterdma模块与所述共享存储器连接,用于将所述共享存储器的数据通过所述pcie控制器搬移到外部主机;

所述主机存取模块通过所述pcie控制器耦合在所述共享存储器和外部主机之间,以使外部主机访问所述共享存储器;

所述共享存储器中设有doorbell寄存器,用于存储doorbell指针;

所述pcie控制器用于在所述外部主机与所述nvme协议处理器之间交换数据。

进一步地,还包括doorbell检测模块,所述doorbell检测模块与所述doorbell寄存器相耦合,用于检测所述doorbell寄存器的更新。

进一步地,所述gatherdma模块和所述scatterdma模块还分别耦合到外部的sdd控制器。

所述nvme协议处理器第二种实现方案如下:

包括:cpu子系统、共享存储器、gatherdma模块、scatterdma模块、主机存取模块、独立doorbell寄存器、doorbell检测模块和pcie控制器;

所述cpu子系统包括一个或多个cpu,所述cpu连接到所述共享存储器;

所述gatherdma模块与所述共享存储器连接,用于将外部主机的数据通过所述pcie控制器搬移到所述共享存储器;

所述scatterdma模块与所述共享存储器连接,用于将所述共享存储器的数据通过所述pcie控制器搬移到外部主机;

所述主机存取模块通过所述pcie控制器连接在所述共享存储器和外部主机之间,以访问所述共享存储器;

所述独立doorbell寄存器连接在所述主机存取模块和doorbell检测模块之间,用于存储doorbell指针;

所述doorbell检测模块用于检测所述独立doorbell寄存器的更新;

所述gatherdma模块和所述scatterdma模块还分别耦合到外部的sdd控制器。

另一方面,本发明还提供了一种nvme协议处理方法,第一种实现方案如下:包括如下步骤:

(1)主机将nvme命令写入nvme协议处理器的共享存储器;

(2)所述nvme协议处理器的cpu处理所述共享存储器中的nvme命令;

(3)所述nvme协议处理器依据处理完成的nvme命令,填充所述主机的完成队列(cq);

(4)所述主机从所述完成队列(cq)中取出数据并处理,并告知所述nvme协议处理器完成队列(cq)的处理情况。

所述nvme协议处理方法,第二种实现方案如下:

包括如下步骤:

(1)主机向nvme协议处理器发送doorbell指针值;

(2)所述nvme协议处理器的cpu获知doorbell值的更新;

(3)所述nvme协议处理器的cpu配置gatherdma模块从所述主机的提交队列(sq)取得nvme命令,并存入共享存储器;

(4)所述nvme协议处理器的cpu处理共享存储器中的nvme命令;

(5)所述nvme协议处理器的cpu依据处理完成的nvme命令,配置scatterdma模块,指示scatterdma模块将数据写入主机的完成队列(cq),该数据指示处理完成的nvme命令;

(6)所述主机从完成队列(cq)中取出数据并处理,并将所述完成队列(cq)对应的doorbell指针值发送给所述nvme协议处理器;

(7)所述nvme协议处理器的cpu获知doorbell值的更新并完成nvme命令的处理。

所述nvme协议处理方法,第三种实现方案如下:

包括:

检查对应于提交队列(sq)的第一doorbell寄存器是否被更新;

若第一doorbell寄存器被更新,配置gatterdma模块来将主机的提交队列(sq)中的nvme命令传送到共享存储器;

对共享存储器中的nvme命令进行处理,将指示nvme命令处理结果的数据写入共享存储器,并通过配置scatterdma模块,将共享存储器中的指示nvme命令处理结果的数据传送到主机的完成队列(cq);

检查对应于完成队列(cq)的第二doorbell寄存器是否被更新;若第二doorbell寄存器被更新,完成所述nvme命令的处理。

进一步地,所述第一doorbell寄存器与第二doorbell寄存器位于所述共享存储器的存储空间。

进一步地,所述检查对应于提交队列(sq)的第一doorbell寄存器是否被更新,包括:

轮询所述doorbell寄存器以确定所述第一doorbell寄存器被更新。

所述nvme协议处理方法,第四种实现方案如下:

包括:

响应于接收到指示对应于提交队列(sq)的第一doorbell寄存器被更新的中断请求,配置gatterdma模块来将主机的提交队列(sq)中的nvme命令传送到共享存储器;

对共享存储器中的nvme命令进行处理,将指示nvme命令处理结果的数据写入共享存储器,并通过配置scatterdma模块,将共享存储器中的指示nvme命令处理结果的数据传送到主机的完成队列(cq);

检查对应于完成队列(cq)的第二doorbell寄存器是否被更新;若第二doorbell寄存器被更新,完成所述nvme命令的处理。

根据本发明的一个方面,本发明还提供一种包含计算机程序代码的计算机程序,当被载入计算机系统并在计算机系统上执行时,所述计算机程序代码使所述计算机系统执行上面所述的多种方法之一。

根据本发明的另一个方面,还提供一种包括程序代码的程序,当被载入存储设备并在存储设备上执行时,所述计程序代码使所述存储设备执行上面所述的多种方法之一。

根据本发明的又一方面,提供了一种在其上具有所记录的程序的机器可读存储介质,其中所述程序使得所述机器执行上面所述的多种方法之一。

根据本发明的又一方面,提供了一种存储控制器。所述存储控制器包括根据本发明的上述多种nvme协议处理器之一。

根据本发明的又一方面,提供了一种集成电路。所述集成电路包括根据本发明的上述多种nvme协议处理器之一。

本发明的有益效果是,本发明提供了一种全新的nvme协议处理器结构及nvme协议处理方法。根据本发明的nvme协议处理器的具体形态可以是asic(专用集成电路)或者asic的组成部分。根据本发明的nvme协议处理器的形态还可以为能通过编程反复重新配置其功能的集成电路,如fpga(field-programmablegatearray,现场可编程门阵列)。也可为以硬件描述语言开发的ip核,该ip核可以在asic设计中作为电路模块而集成到asic中。根据本发明的ip核也可直接用于配置fpga来实现nvme协议处理器的功能。本发明的实施例还可为运行在嵌入式cpu中的软件,易于在nvme协议升级或扩展时进行适应性修改,无需重新设计nvme协议处理器的硬件电路,仅需通过修改软件来实现对升级后nvme协议的支持,易于应对nvme协议的升级,方便易用,适应性强。

另外,本发明的nvme协议处理流程中,在处理nvme命令前后均可采用cpu轮询(polling)的方式查询doorbell值是否发生更新,根据查询结果决定是否进行nvme命令的处理,这是现有nvme协议规范中未定义的,相对于中断处理方式,在待处理事件较多,中断过于频繁及中断后处理的数据较少的情况下能一定程度上提高cpu的工作效率。

附图说明

下面结合附图和实施例对本发明进一步说明。

图1是本发明的nvme协议处理器一个实施例的原理框图;

图2是本发明的nvme协议处理器另一个实施例的原理框图;

图3是本发明的nvme协议处理器又一个实施例的原理框图;

图4是本发明的nvme协议处理方法一个实施例的流程图;

图5是本发明的nvme协议处理方法另一个实施例的流程图;

图6是本发明的nvme协议处理方法又一个实施例的流程图;以及

图7是本发明的nvme协议处理方法中nvme控制器的cpu所实施的处理流程实施例的流程图。

图中,不同的nvme协议处理器实施例中,为说明清楚起见,同样的部件用不同的标记,具体如下:

10、20、30:nvme协议处理器;101、201、301:共享存储器;1011、2011:共享存储器中的doorbell寄存器;102、202、302:cpu子系统;103、203、303:主机存取模块;104、204、304:gatherdma模块;105、205、305:scatterdma模块;206、306:doorbell检测模块;11、207、307:pcie控制器;308:独立doorbell寄存器;12、21、31:主机;22、32:sdd控制器。

具体实施方式

现在结合附图对本发明作进一步详细的说明。这些附图均为简化的示意图,仅以示意方式说明本发明的基本结构,因此其仅显示与本发明有关的构成。

实施例1

如图1所示,本发明的nvme协议处理器10为图中虚线框内的部分,包括:

cpu子系统102、共享存储器101、gatherdma模块104、scatterdma模块105和主机存取模块103。

cpu子系统102包括多个cpu,cpu连接到共享存储器101。在cpu子系统102的cpu中运行程序,用于处理共享存储器中的数据和/或nvme命令、配置gatherdma模块104与scatterdma模块105并指示其实施数据搬运,并控制nvme协议的处理过程。在其他实施例中,cpu子系统102中包括一个cpu。

gatherdma模块104与共享存储器101连接,用于将外部主机12的数据通过外部pcie控制器11搬移到共享存储器101。数据的内容可以是nvme协议相关的nvme命令,还可以是nvme命令所指示的写等操作对应的数据。

scatterdma模块105与共享存储器101连接,用于将共享存储器101的数据通过外部pcie控制器11搬移到外部主机12。数据的内容可以是nvme协议相关的nvme命令,还可以是nvme命令所指示的读等操作对应的数据。

在根据本发明的一个实施例中,共享存储101中存储nvme协议相关的nvme命令,而将nvme命令所指示的读、写操作对应的数据存储在根据本发明实施例的nvme协议处理器外部。在另一个实施例中,共享存储器101中存储nvme协议相关的nvme命令,以及与nvme命令所指示的读、写操作对应的数据。

共享存储器101中包括doorbell寄存器1011,用于存储doorbell指针。doorbell寄存器可以是共享存储器101中的特定或可配置的存储区域。doorbell指针包括提交队列(sq)的尾指针与完成队列(cq)的头指针。doorbell寄存器1011中还可以存储提交队列(sq)的头指针与完成队列(cq)的尾指针。在其他实施例中,doorbell寄存器是一个或多个物理寄存器,与共享存储器101统一编址。共享存储器101中还存储主机12下发的nvme命令。

主机存取模块103通过外部pcie控制器11连接在共享存储器101和外部主机12之间,以使主机103访问共享存储器101。外部主机12通过主机存取模块103访问共享存储器101。例如,外部主机12通过主机存期模块103更新doorbell寄存器的值,以指示提交队列(sq)的尾指针被更新,或完成队列(cq)的头指针被更新。

cpu子系统102中的cpu监视doorbell寄存器1011的状态。当发现提交队列(sq)被更新时,通过执行软件,cpu从共享存储器101中读出nvme命令并进行处理,以及更新doorbell寄存器1011的值,以向主机12指示提交队列(sq)的头指针被更新。在处理nvme命令时,cpu指示gatherdma模块104和/或scatterdma模块105执行相应的数据搬运操作。nvme命令处理完成后,cpu更新doorbell寄存器1011的值,以向主机12指示完成队列(cq)的尾指针被更新,并向主机12发送中断。主机12相应地对完成队列进行处理,并通过主机存取模块103更新doorbell寄存器的值,以指示完成队列(cq)的头指针被更新。从而完成nvme协议的处理流程。

实施例2

如图2所示,本发明的nvme协议处理器20为图中虚线框内的部分,包括:

cpu子系统202、共享存储器201、gatherdma模块204、scatterdma模块205、主机存取模块203、pcie控制器207和doorbell检测模块206。

cpu子系统202包括多个cpu,cpu连接到共享存储器201。在其他实施例中,cpu子系统202中包括一个cpu。

gatherdma模块204与共享存储器201连接,用于将外部主机21的数据通过内部pcie控制器207搬移到共享存储器201。数据的内容是例如主机生成并写入提交队列(sq)的nvme命令。

scatterdma模块205与共享存储器201连接,用于将共享存储器201的数据通过内部pcie控制器207搬移到外部主机21。数据的内容是例如cpu子系统202生成的用于填充完成队列(cq)的内容。以及该数据被搬移到主机21的完成队列(cq)中。

主机存取模块203通过内部pcie控制器207连接在共享存储器201和外部主机21之间,以使主机能够访问共享存储器201。在另一个实施例中,主机存取模块203使主机能够访问ssd控制器22的数据。

共享存储器201中设有doorbell寄存器2011,用于存储doorbell指针。

doorbell检测模块206与共享存储器201或doorbell寄存器2011连接,用于检测doorbell指针的更新。

gatherdma模块204和scatterdma模块205还分别连接到外部的sdd控制器22,使得gatherdma模块204、scatterdma模块205能通过sdd控制器22与后端(例如,闪存)进行数据交换。

实施例2与实施例1的区别在于,将实施例1中的外部pcie控制器11作为nvme协议处理器20的一部分,成为nvme协议处理器20内部的pcie控制器207,还在实施例1的基础上增加了doorbell检测模块206,增加了gatterdma模块204、scatterdma模块205与sdd控制器22的连接。

doorbell检测模块206轮询doorbell寄存器2011,来识别doorbell寄存器被主机21或cpu子系统202更新。当doorbell检测模块206发现doorbell寄存器2011被主机21更新,其通知cpu子系统202。在另一实施例中,doorbell监视doorbell寄存器的值,以识别提交队列(sq)中有待处理的nvme命令,并通知cpu子系统202。

在实施例2中,共享存储器201中存储nvme协议相关的nvme命令,而将nvme命令所指示的读、写操作对应的数据存储在位于nvme协议处理器外部的ssd控制器22管理的存储器内。在根据本发明的另一实施例中,共享存储器201中存储nvme协议相关的nvme命令,而将nvme命令所指示的读、写操作对应的数据存储在另一存储器内。该另一存储器不属于根据本发明实施例2的nvme协议处理器20,也不属于ssd控制器22,但nvme协议处理器20与ssd控制器22均可访问该另一存储器。

实施例3

如图3所示,本发明的nvme协议处理器30为图中虚线框内的部分,包括:

cpu子系统302、共享存储器301、gatherdma模块304、scatterdma模块305、主机存取模块303、pcie控制器307、doorbell检测模块306和独立doorbell寄存器308。doorbell寄存器308可以物理寄存器,并具有比共享存储器301高的访问性能。

cpu子系统302包括多个cpu,cpu连接到共享存储器301。在其他实施例中,cpu子系统302中包括一个cpu。

gatherdma模块304与共享存储器301连接,用于将外部主机31的数据通过内部pcie控制器307搬移到共享存储器301或ssd控制器32。在一个例子中,被搬移到共享存储器301中的数据的内容是例如主机生成并写入提交队列(sq)的nvme命令;而被搬移到ssd控制器32的数据的内容是nvme命令所指示的写操作对应的数据。

scatterdma模块305与共享存储器301连接,用于将共享存储器301或ssd控制器32的数据通过内部pcie控制器307搬移到外部主机31。在一个例子中,被从共享存储器301中搬移到外部主机的数据的内容是例如cpu子系统302生成并将写入完成队列(cq)的与nvme命令相对应的数据;而被从ssd控制器32搬移到外部主机的数据的内容是nvme命令所指示的读操作对应的数据。

主机存取模块303通过内部pcie控制器307连接在共享存储器301和外部主机31之间,以使主机访问共享存储器301。

独立doorbell寄存器308连接在主机存取模块303和doorbell检测模块306之间,用于存储doorbell指针。

doorbell检测模块306检测doorbell指针的更新,并通知cpu子系统302。

gatherdma模块304和scatterdma模块305分别连接到外部的sdd控制器32,使gatherdma模块304、scatterdma模块305能通过sdd控制器32与后端(例如,闪存)进行数据交换。

实施例3与实施例2的区别在于,将实施例2中设于共享存储器201中的doorbell寄存器2011改为独立于共享存储器301的doorbell寄存器308,利于doorbell指针的读写和检测。

实施例4

如图4所示,本发明实施例的nvme协议处理方法,包括如下步骤:

s100:主机向nvme协议处理器发送doorbell指针值。具体地,在主机向提交队列(sq)填充了新内容(例如,nvme命令)时,主机将更新后的提交队列(sq)的尾指针作为doorbell指针值发送给nvme协议处理器。主机通过主机存储模块将doorbell指针值写入共享存储器。

s110:nvme协议处理器的cpu获知doorbell值的更新。例如,cpu轮询存储了提交队列(sq)的尾指针的doorbell寄存器,以获知主机对提交队列(sq)尾指针的更新。对提交队列尾指针的更新,意味着提交队列(sq)中被填充了新内容。

s120:cpu解析doorbell指针,并配置gatherdma模块以从主机的提交队列(sq)中获取nvme命令。在一个例子中,nvme协议处理器的cpu比较提交队列(sq)的尾指针与头指针,以获知提交队列(sq)中待处理器的nvme命令数量以及在主机中的存储位置,并操作gatherdma模块以从主机的提交队列(sq)中获取nvme命令。

s130:gatherdma模块向主机请求doorbell指针指示的提交队列(sq)中的nvme命令。

s140:主机向gatherdma模块返回提交队列(sq)中的nvme命令,nvme命令被写入共享存储器。

s150:cpu解析被写入共享存储器的nvme命令,若nvme命令是主机“读”命令,则继续到步骤s155,若nvme命令是主机“写”命令,则转到步骤s156。

s155:cpu通知后端设备(例如,图2的ssd控制器22,或图3的ssd控制器32)准备主机需要“读”的数据,并配置scatterdma模块,scatterdma模块将数据发给主机,转到步骤s160。

s156:cpu根据主机“写”命令信息配置gatherdma模块,gatherdma模块向主机请求待写的数据,主机向gatherdma模块返回待写的数据,gatherdma模块将数据写入共享存储器或后端设备的存储空间。

s160:cpu依据提交队列(sq)中被处理完成的nvme命令准备相对应的用于填充完成队列(cq)的数据,并配置scatterdma模块,scatterdma模块将数据写入主机的完成队列(cq)。

s170:cpu配置scatterdma模块,scatterdma模块向主机发起msi-x中断。

s180:主机得到msi-x中断后,从完成队列(cq)取出数据并处理,并将完成队列(cq)对应的新doorbell指针值(完成队列的头指针)发至nvme协议处理器。例如,主机通过主机存储模块将doorbell指针值(完成队列的头指针)写入共享存储器。

s190:cpu读取到新doorbell指针值后完成nvme命令处理,准备处理下一个nvme命令。具体地,nvme协议处理器的cpu获知完成队列的头指针被主机更新,因而确定相应的nvme命令处理在主机端已完成,并继而完成对该nvme命令的处理。

实施例5

如图5所示,本发明的nvme协议处理方法,包括如下步骤:

s200:主机向pcie控制器发送包括doorbell指针值的数据包,pcie控制器通过主机存取模块将数据包发送至nvme协议处理器中共享存储器里的doorbell寄存器;

s210:nvme协议处理器中独立的doorbell检测模块检测到doorbell值更新后,通过中断方式通知cpu。或者doorbell检测模块检测到doorbell值更新后,向共享存储器中写入标志,由cpu查询标志获知doorbell值的更新(cpu轮询(polling)方式)。

s220:cpu解析到doorbell指针后配置gatherdma模块。在一个例子中,cpu配置gatherdma模块以从主机的提交队列(sq)中获取nvme命令。在一个例子中,nvme协议处理器的cpu比较提交队列(sq)的尾指针与头指针,以获知提交队列(sq)中待处理器的nvme命令数量以及在主机中的存储位置,并操作gatherdma模块以从主机的提交队列(sq)中获取nvme命令。

s230:gatherdma模块向主机请求doorbell指针指示的提交队列(sq)中的nvme命令。

s240:主机通过pcie控制器向gatherdma模块返回提交队列(sq)中的nvme命令,gatherdma模块将nvme命令被写入共享存储器。

s250:cpu解析被写入共享存储器的nvme命令,若nvme命令是主机“读”命令,则继续到步骤s255,若nvme命令是主机“写”命令,则转到步骤s256。

s255:cpu通知后端设备(例如,图2的ssd控制器22,或图3的ssd控制器32)准备主机需要“读”的数据,并配置scatterdma模块,scatterdma模块将数据发给主机,转到步骤s260;

s256:cpu根据“写”命令信息配置gatherdma模块,gatherdma模块通过pcie控制器向主机请求待写的数据,主机收到数据请求后将对应内存的数据通过pcie控制器向gather

dma模块返回,gatherdma模块将返回的数据写入共享存储器或后端设备的存储空间。

s260:cpu依据提交队列(sq)中被处理完成的nvme命令准备相对应的用于填充完成队列(cq)的数据,并配置scatterdma模块,scatterdma模块将数据写入主机的完成队列(cq)。

s270:cpu配置scatterdma模块,scatterdma模块向主机发起msi-x中断。

s280:主机得到msi-x中断后,从完成队列(cq)取出数据并处理,并将完成队列(cq)的头指针值通过主机存取模块写入共享存储器里的doorbell

寄存器;

s290:cpu获知完成队列(cq)头指针被更新后,后完成相应nvme命令处理,准备处理下一个nvme命令。doorbell检测模块检测到doorbell值更新后,通过中断方式通知cpu。或者doorbell检测模块检测到doorbell值更新后,向共享存储器中写入标志,由cpu查询标志获知doorbell值的更新。在另一个例子中,cpu可轮询doorbell寄存器以获知完成队列(cq)头指针被更新。

实施例6

如图6所示,本发明的nvme协议处理方法,包括如下步骤:

s300:主机向pcie控制器发送包括doorbell指针值的数据包,pcie控制器通过主机存取模块将数据包发送至nvme协议处理器中独立的doorbell寄存器。

s310:cpu通过查询独立doorbell寄存器的变化来获知doorbell值的更新,即cpu轮询(polling)方式。在另一个例子中,nvme协议处理器中独立的doorbell检测模块检测到独立doorbell寄存器的值更新后,通过中断方式通知cpu。或者doorbell检测模块检测到独立doorbell寄存器的值更新后,向共享存储器中写入标志,由cpu查询标志获知doorbell值的更新。

s320:cpu解析到doorbell指针后配置gatherdma模块。

s330:从gatherdma模块将数据请求发送到pcie控制器,pcie控制器将请求发送给主机,向主机请求doorbell指针指示的提交队列(sq)中的nvme命令。

s340:主机通过pcie控制器向gatherdma模块返回提交队列(sq)中的nvme命令,nvme命令被写入共享存储器。

s350:cpu解析被写入共享存储器的nvme命令,若nvme命令是主机“读”命令,则继续到步骤s355,若nvme命令是主机“写”命令,则转到步骤s356。

s355:cpu通知后端设备(例如,图2的ssd控制器22,或图3的ssd控制器32)准备主机需要“读”的数据,并配置scatterdma模块,scatterdma模块将数据发给主机,转到步骤s360。

s356:cpu根据“写”指令信息配置gatherdma模块,gatherdma模块通过pcie控制器向主机请求待写的数据,主机收到数据请求后将对应的数据通过pcie控制器向gatherdma模块返回,gatherdma模块将返回的数据写入共享存储器或后端设备的存储空间。

s360:cpu依据提交队列(sq)中被处理完成的nvme命令准备相对应的用于填充完成队列(cq)的数据,并配置scatterdma模块,scatterdma模块将数据写入主机的完成队列(cq)。

s370:cpu配置scatterdma模块,scatterdma模块向主机发起msi-x中断。

s380:主机得到msi-x中断后,从完成队列(cq)取出数据并处理,并将完成队列(cq)对应的新指针值通过主机存取模块写入独立doorbell寄存器。

s390:cpu轮询到新doorbell指针值后完成nvme命令处理,准备处理下一个nvme命令。在另一个例子中,nvme协议处理器中独立的doobell检测模块检测到独立doorbell寄存器的值更新后,通过中断方式通知cpu。或者doorbell检测模块检测到独立doorbell寄存器的值更新后,向共享存储器中写入标志,由cpu查询标志获知doorbell值的更新。

实施例7

在图7中展示了根据本发明实施例的由nvme协议处理器的cpu通过执行软件、程序或指令而实施的处理流程。

s410:nvme协议处理器的cpu通过中断或轮询方式检查doorbell寄存器是否更新。从doorbell寄存器中,获得提交队列(sq)的尾指针。若提交队列(sq)的尾指针不同于提交队列(sq)的头指针,则表示提交队列(sq)中存在需要被处理的nvme命令。

s420:cpu检查到doorbell寄存器更新后配置gatherdma模块,以指示gatherdma模块向主机请求doorbell指针指示的提交队列(sq)中的nvme命令。在一个例子中,cpu通过执行软件,来比较doorbell寄存器中的提交队列(sq)的头指针与尾指针,以获得提交队列(sq)中所存在的nvme命令的数量和存储位置,并配置gatherdma模块来从提交队列(sq)获取nvme命令,并写入共享存储器。

s450:cpu解析被写入共享存储器的nvme命令,若nvme命令是主机“读”命令,则继续到步骤s455,若nvme命令是主机“写”命令,则转到步骤s456。

s455:cpu通知后端设备(例如,图2的ssd控制器22,或图3的ssd控制器32)准备主机需要“读”的数据,并配置scatterdma模块,使scatterdma模块将数据发给主机,转到步骤s460。

s456:cpu根据主机“写”命令信息配置gatherdma模块,使得gatherdma模块向主机请求待写的数据,并将数据写入共享存储器或者后端设备的存储空间。

s460:cpu依据提交队列(sq)中被处理完成的nvme命令准备相对应的用于填充完成队列(cq)的数据,并配置scatterdma模块,使scatterdma模块将数据写入主机的完成队列(cq)。

s470:cpu配置scatterdma模块,使scatterdma模块向主机发起msi-x中断。

s490:nvme协议处理器的cpu通过中断或轮询方式检查doorbell寄存器是否更新,从doorbell寄存器中,获得完成队列(cq)的头指针,以确定对应的nvme命令已处理完成,并可准备处理下一个nvme命令。

上面已经公开了nvme协议处理器以及nvme协议处理方法。所属领域技术人员还将意识到本发明中所公开的方法或操作流程可由软件、固件及其任何组合实现。实现本发明实施例的方法或操作流程的软件、固件可由存储设备的控制器执行。实现本发明实施例的方法或操作的软件、固件可存储于网络服务器、访问存储设备的主机和/或存储设备。

以上述依据本发明的理想实施例为启示,通过上述的说明内容,相关工作人员完全可以在不偏离本项发明技术思想的范围内,进行多样的变更以及修改。本项发明的技术性范围并不局限于说明书上的内容,必须要根据权利要求范围来确定其技术性范围。

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