# NVMe * NVMe有两种命令 * 一种叫**Admin Command**,用以Host管理和控制SSD * 另外一种就是**I/O Command**,用以Host和SSD之间数据的传输 * Admin Command: * ![](https://i.imgur.com/JkfY3Nm.png) * ![](https://i.imgur.com/JSNylHt.png) * I/O Command: * ![](https://i.imgur.com/LIMmFZ2.png) * Host又是怎么把这些命令发送给SSD执行呢? * NVMe有三宝:Submission Queue (SQ),Completion Queue(CQ)和Doorbell Register (DB)。 SQ和CQ位于Host的内存中,DB则位于SSD的控制器内部。 * ![](https://i.imgur.com/alZKQ4v.png) * 系统中只能有一对Admin SQ/CQ,但可以有很多对I/O SQ/CQ * I/O SQ是可以赋予不同优先级的 * I/O SQ/CQ深度可达64K,Admin SQ/CQ深达4K * I/O SQ/CQ的广度和深度都可以灵活配置 * 每条命令大小是64字节,每条命令完成状态是16字节 * ![](https://i.imgur.com/z6GFhNP.png) * ![](https://i.imgur.com/lKtxywl.jpg) * Host有两种方式来告诉SSD数据所在内存位置,一是PRP (Physical Region Page, 不是P2P!),二是SGL (Scatter/Gather List)。 * 一段数据空间,对PRP来说,它只能映射到一个个物理页,而对SGL来说,它可以映射到任意大小的连续物理空间。 * ![](https://i.imgur.com/ytGySMU.png =600x) ### Reference SSDFans