[存储]NVMe-4-数据结构

注意:本文翻译仅为学习交流用,版权归原文作者所有。

原文出处

4 数据结构

这个这个章节讲NVM Express中的数据结构。

4.1 提交队列和完成队列定义

一个entry的提交者使用当前项的尾指针指向下一个空闲的队列槽位。在放置新entry后,提交者将尾指针向后移动,如果尾指针超过了队列大小,则将尾部entry滚动至0。提交者放置新entry直至队列满为止。

entry的消费者使用当前头entry指针表示下一个准备消耗的entry。在消耗一个entry后,头指针向下一个entry移动。同提交者…

提交队列和关联的完成队列的创建和销毁要求是有序执行的。主机软件应该先创建完成队列,再创建与之关联的提交队列。提交队列能在完成队列被创建完毕后任何时间创建。主机软件应该先删除提交队列,再删除完成队列。为中止提交到提交队列中的命令,主机软件应该下发删除IO提交队列的命令。

主机软件写提交队列Tail Doorbell和完成队列Head Doorbell,来向控制器通知新值。如果主机软件向提交队列Tail Doorbell或者完成队列Head Doorbell写无效值,并且异步事件请求命令未完成,那么一个异步事件将被下发到Admin完成队列,状态码为Invalid Doorbell Write Value.与之关联的队列应该被删除和重新创建。

主机软件检查完成队列项的PhaseTag§判断是否有命令完成状态放入完成队列。完成队列尾指针对主机是透明的,仅在控制器内部使用。控制器使用完成队列项中的SQHD(提交队列头指针)告诉主机提交队列头指针的值,在SQHD指向的提交队列项被消耗时,并不表示像是否被执行或者已经完成。

当主机软件向提交队列Tail Doorbell写新值时,表示有新的命令放置在提交队列Tail pointer指向的地方。提交队列Tail Doorbell被写时,表示主机软件提供了一个至多个提交队列项。

完成队列项被下发时,SQ head pointer向前移动,SQ项被控制器消耗。完成队列项可能指示一个至多个提交队列项被消耗。

————————————————————————

局部总结:

  • 提交队列和完成队列是Host的连续内存,有两对指针进行管理,i.e., Head Pointer和Tail Pointer;
  • 提交队列和完成队列在添加新值时,通过Doorbell寄存器通知,Host SW写提交队列Tail Doorbell告知controller来取新命令,写完成队列Head Doorbell告知controller完成状态己经被取走;
  • HostSW将新命令放置于提交队列Tail Pointer, 将完成状态放置于完成队列Tail Pointer;

————————————————————————

4.1.1 Empty Queue

Head entry Pointer == Tail entry Pointer

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VqQxIaMr-1613349541284)(./imgs/fig102.png)]

4.1.2 Empty Queue

Head entry Pointer + 1 == Tail entry Pointer

4.1.3 Queue Size

IO SQ/CQ队列最大值是64Ki个slots,Admin SQ/CQ队列最大值是4Ki个slots。

4.1.4 Queue Identifier

队列的ID是两字节整型,在队列创建时被确定。

4.1.5 Queue Priority

加权robin采取优先级分四档:Urgent, High, Medium, Low.

4.2 Submission Queue Entry - Command Format

每个命令大小为64字节

提交队列项64字节,由以下几项组成:1) Command Dword 0, 2) NS Id, 3) Meta Pointer, 4) PRP Entry1/2, SGL Entry1, Meta SGL Segment Pointer.

具体的CDW0(4字节)格式可见SPEC中的图104。

Bits Description
31:16 Command Identifier (CID): This field specifies a unique identifier for the command when combined with the Submission Queue identifier.
命令ID,在提交队列创建时候CID
15:14 PRP or SGL for Data Transfer (PSDT):指定是否使用PRPs或者SGLs用于描述传输的数据,PRPs用于AdminCMD NVMe over PCIe, SGLs用于Admin/IO cmd NVMe over Fabrics,
- 00b: PRPs用于传输;
- 01b: SGLs用于传输,并且Meta Pointer(MPTR)包含单个连续物理buffer的地址,buffer字节对齐;
- 10b: SGLs用于传输,并且Meta Pointer(MPTR)包含SGL Segment的地址,这个SGL Segment是4字节对齐的;
- 11b: 保留
09:08 Fused Operation(FUSE): …
07:00 Opcode(OPC): 指定命令的操作码
上一篇:五舟服务器出厂nvme阵列配置


下一篇:单选RadioButton与复选CheckBox按钮