NVMe协议调试总结
1、NVMe问答
NVMe 是什么?
百度百科这么说的:
NVMe(Non-VolatileMemory express),是一种建立在M.2接口上的类似AHCI的一种协议,是专门为闪存类存储设计的协议。中文名 NVMe协议 外文名 Non-Volatile Memory express。NVMe具体优势包括:
①性能有数倍的提升;
②可降低延迟超过50%;
③NVMe PCIe SSD可提供的IOPs十倍于高端企业级SATA SSD;
④自动功耗状态切换和动态能耗管理功能大大降低功耗;
⑤支持未来十年技术发展的可扩展能力。
码农该怎么理解?
它是一个存储协议,既然是存储协议是不是需要快速的读写?
答:对。
PCIe才是最快的协议啊,为啥不用PCIe呢?
答:PCIe很复杂的。
那我们给PCIe穿个马甲,就可以?
答:NVMe就是给PCIe穿个马甲。
NVMe是怎么做到的?
答:PCIe是作文题,NVMe是选词填空,最后的结果却一样。
怎么填?填什么?
答:按照这个表格填写,发什么就填什么,总共64字节,不需要的填0就行了。
IO命令:
appmask |
apptag |
reftag |
dsmgmt |
slba |
addr |
metadata |
rsvd |
nblocks |
control |
Flags |
Opcode |
Admin 命令:
rsvd11 |
numd |
offset |
lid |
prp2 |
prp1 |
rsvd1 |
command_id |
flags |
Opcode |
|
|
|
|
|
|
|
|
|
|
NVMe处于什么位置
NVMe是一种Host与SSD之间通讯的协议,它在协议栈中隶属高层。
NVMe命令该选什么词填什么空?
NVMe制定了Host与SSD之间通讯的命令,以及命令如何执行的。
NVMe有两种命令,一种叫Admin Command,用以Host管理和控制SSD;另外一种就是I/O Command,用以Host和SSD之间数据的传输。下面是NVMe1.2支持的命令列表:
NVMe支持的Admin Command:
NVMe支持的I/O Command:
发送的太快我来不及执行咋办?
搞两个缓冲区吧,
发送缓冲区:SubmissionQueue (SQ)。
完成缓冲区:CompletionQueue(CQ)
处理完了,我该怎么告诉你呢?
写这个寄存器就行Doorbell Register (DB)
系统结构什么怎样的?
这个namespace是啥玩意?
每个flash块就是一个namaspce,它有个id,叫namaspceID。
NVMe到SDD是怎么玩的?
举例Host需要从flash地址 0x02000000上读取nblock = 2的数据, PRP1给出内存地址是0x10000000,该怎么操作?
首先我们得组包nvme_cmd,这个包为读命令