蛋蛋读NVMe之一 (ssdfans.com)
NVMe 所处层次
NVMe是一种Host与SSD之间通讯的协议,它在协议栈中隶属高层。NVMe在协议栈中处于应用层或者命令层。
NVMe是为SSD所生的。NVMe出现之前,SSD绝大多数走的是AHCI和SATA的协议,后者其实是为传统HDD服务的。与HDD相比,SSD具有更低的延时和更高的性能,AHCI已经不能跟上SSD性能发展的步伐了,已经成为制约SSD性能的瓶颈。既然SATA接口速度太慢,我用PCIe好了,不过上层协议还是AHCI。AHCI只有一个命令队列,最多同时只能发32条命令。SSD需要PCIe,更需要NVMe。
NVMe 传输模型分类
主机和NVM子系统之间有两个定义的通信结构:
- 一个是基于内存的传输模型
- 一个是基于消息的传输模型。基于消息的传输模型有两种子类型:
不同模型在命令、响应、数据传输方式的不同:
- 在基于内存的传输模型中,命令、响应和数据通过显式的内存读写操作在主机和NVM子系统之间输。
- 基于消息的传输模型是指在主机和NVM子系统之间发送包含命令胶囊和响应胶囊的消息。
- 在纯消息传输模型中,数据仅使用胶囊或消息在主机和NVM子系统之间发送。
- 基于消息/内存的传输模型使用消息和显式内存读写操作的组合来在主机和NVM子系统之间传输命令胶囊、响应胶囊和数据。数据可以选择性地包含在命令胶囊和响应胶囊中
NVMe 命令
NVMe制定了Host与SSD之间通讯的命令,以及命令如何执行的。
NVMe有两种命令
在NVMe 2.0规范中命令集分为了三种:
- Fabrics Command:fabric命令集命令用于特定于NVMe over fabric的操作,包括建立连接、NVMe带内认证、获取或设置属性。
NVMe 命令的发送
Host又是怎么把这些命令发送给SSD执行呢?
NVMe协议中的三种队列:Submission Queue (SQ),Completion Queue(CQ)和Doorbell Register (DB)
SQ和CQ位于Host的内存中,DB则位于SSD的控制器内部。
SSD作为一个PCIe Endpoint通过PCIe连着Root Complex (RC), 然后RC连接着CPU和内存
NVMe 命令的处理
说,NVMe处理命令需要几步?答:八步:
第一步:Host写命令到SQ;
第二步:Host写DB,通知SSD取指;
第三步:SSD收到通知,于是从SQ中取指;
第四步:SSD执行指令;
第五步:指令执行完成,SSD往CQ中写指令执行结果;
第六步:然后SSD发短信通知Host指令完成;
第七步:收到短信,Host处理CQ,查看指令完成状态;
第八步:Host处理完CQ中的指令执行结果,通过DB回复SSD:指令执行结果已处理,
|