nvme Admin & I/O 命令

 

NVMe有两种命令:admin命令和I/O命令。admin命令用于主机管理控制SSD,I/O命令用于数据传输。

 

NVMe Driver支持以下admin处理和命令:Delete I/O Submission Queue,Create I/O Submission Queue,GetLog

 Page,Delete I/O Completion Queue,Create I/O Completion Queue,Identify,NamespaceAttachment,Abort,SetFeatures,GetFeatures,AsynchronousEvent,

Request,NamespaceManagement,FirmwareCommit,FirmwareImage

 Download,KeepAlive,FormatNVM。

NVMe Driver支持以下的I/O命令:Flush,WRITE,READ,WRITE_ZEROES,DATASET_MANAGEMENT,RESERVATION_REGISTER,RESERVATION_REPORT,RESERVATION_ACQUIRE,RESERVATION_RELEASE

        Host是如何将这些命令发送给SSD呢?

 

步骤如下:

 

 

第一步:Host写命令到SQ;

 

第二步:Host写DB,通知Controller取指;

 

第三步:Controller收到通知,于是从SQ中取指;

 

第四步:Controller执行指令;

 

第五步:指令执行完成, Controller往CQ中写指令执行结果;

 

第六步:Host轮询monitor检查指令执行结果

 

第七步:状态变化时,Host处理CQ,查看指令完成状态;

 第八步:Host处理完CQ中的指令执行结果,通过DB回复SSD:指令执行结果已处理

 

 

SQ&CQ是什么指令?
(1)sq 和 cq 分别作为command request 和command response 存取的地方;
nvme 中发送command request 和 command response,都采用queue机制,host 发送command 使用SQ(submission queue), controller 返回command response状态使用CQ(completion queue)。每个SQ 最大能放(sq_depth-1)个command request entry,每个CQ最多能放(cq_depth-1)个command response entry.
(2)sq 和 cq 都是放在一个存储空间的,可以是host 分配的一块存储空间,也可以是controller 上划分出来的DRAM空间。
(3)sq 和 cq 结对使用, 一个sq只能指定一个cq与其绑定,多个sq可以与同一个cq绑定。
(4)nvme分为admin queue和 IO queue
admin queue 的sq与cq是一一对应,其创建不需要发送command来,只需要分配空间,并把admin sq,cq基地址告知controller,IO sq,cq则通过admin queue 来创建和删除。

sq,cq是如何判断满与空机制
必须要说明的是,sq和cq 分别判断满与空的机制不一样
(1)对于sq ,采用head 与 tail 比较
根据生产者-消费者模式,head 表示下一次消费者要消耗entry的index, tail 表示下一次生产者产生的entry要存放的index.
queue empty
当head == tail的时候,下一次要消耗entry的index 等于下一次生产者产生entry存放的index时,也就是空

 

image.png

queue full
首先要指出:预留位置为reserv = head - 1,是不使用的。
当head == tail + 1时,表示预留的entry的下一个index 的就是head,也就是满

 

image.png

(2)对于cq,采用的是phase tag
cq的每一个entry有一个专门的bit,host 与controller会协商好,host会给每个cq维护一个phase tag, 两边都将phase 初始状态是该bit是0, controller返回一个cq entry时,会将phase tag 翻转,表示一个新entry,需要host 去处理,host 就是根据自己维护的phase tag与cq中的每一个entry的phase tag比较,如果不相等,表示是一个新的entry,当cq的tail 翻转到queue的最开始时,host 和controller 都将phase tag bit 反转,这样第二轮controller push command 到cq, 每个新到的entry的 phase tag bit 是 0 。这样host 就知道需要哪些entry。

转载自:简书:https://www.jianshu.com/p/c0ed81f932ea?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation


————————————————
版权声明:本文为CSDN博主「享受寂静的猫」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010616442/article/details/70804470

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值