注意:本文翻译仅为学习交流用,版权归原文作者所有。
原文出处。
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): 指定命令的操作码 |