NVMe详解(四)
5. NVMe协议定义的命令
5.0 命令执行过程
命令由host提交到内存中的SQ队列中,更新TDBxSQ后,NVMe控制器通过DMA的方式将SQ中的命令(怎么取,如何取,取多少,因设计而异)取到控制器缓冲区,执行命令;执行完成后,根据执行状态,组装完成命令,仍然通过DMA的方式将完成命令写入内存CQ的队列中;NVMe控制器通过MSI-X中断方式通知host已完成命令;最后,host处理CQ命令,更新控制器中HDBxCQ,标识着命令真正完成。
5.1 命令分类
命令分为Admin指令与NVM指令(I/O指令)。
Admin指令只能提交到Admin Controller中,主要负责管理NVMe控制器,也包含对NVM的一些控制指令。
NVM 指令只能提交到I/O Controller中,主要负责完成数据的传输。
在1.0e版本中,Admin指令有15条(3条与NVM相关),NVM指令有6条;在1.3d版本中,Admin指令有15条(3条与NVM相关),NVM指令有11条。
5.2 命令通用格式
命令均为64字节,具有相同的格式,某些字段根据命令的不同有不同的定义。
完成结果同样具有相同的格式,某些字段根据命令的不同有不同的定义。
5.3Admin 指令
Admin指令与NVM指令根据放置的的队列组(Queue Pair)来区分,Admin指令在Admin CQ与SQ里,NVM指令在I/O CQ与SQ里。
通过Dword0中的8位操作码定义不同指令,注意并不是绝对的顺序增加(eg,没有03h)。每一种指令都对应有其完成命令,通过SQID(提交队列ID)+CID(命令ID)唯一标识完成的命令。
5.4 NVM指令
NVMe控制器读写的最小单元是LB,层次图如下:
NVM指令与Admin指令结构完全相同,也是通过Dword0中的8位操作码来定义不同指令。
6 控制器结构
控制器从功能上可以分为三类,I/O、Admin和Discovery。
在实现过程中,Admin 控制器只有一个,负责管理控制器及其他控制功能。控制器只是抽象的概念,应用于具体的实现中,可能是一个具体的模块,也可能多个模块。
控制器主要的作用是实现对NVMe定义命令的翻译,从而实现数据传输、状态控制等功能。
6.1 命令执行过程
- host将命令(1条或者多条)写入提前分配好的SQ中;
- 更新对应SQ的DB寄存器;
- NVMe控制器取SQ中命令(通过HDB和TDB可以判断是否有未完