总线可以分为哪三个层次,总线按层次和位置分为哪三类

首页 > 体育 > 作者:YD1662023-04-29 10:29:28

6.2 重启(Reset)

6.2.1 Controller level

Controller重启可能发生在PCIe总线重启、PCI重启、控制器CC.EN从1到0重启。当重启发生时:

  1. 所有的I/O SQ和CQ都被删除;
  2. 所有未完成的指令(Admin和I/O)应该执行撤销操作;
  3. Controller处于idele状态,CSTS.RDY清0;
  4. AQA、ASQ、ACQ不受影响。

重启后,host操作:

  1. 更新寄存器状态;
  2. 将CC.EN置1;
  3. 等待CSTS.RDY置1;
  4. 使用Admin命令配置Controller;
  5. 创建I/O CQ和SQ;
  6. 执行正常的I/O指令。
6.2.2 Queue level

队列水平的重启,即,删除该队列,再重新创建一个新队列。删除队列的时候,host应该保证队列处于idle状态(所有命令均已完成——接收到了完成命令),否则的话,可能会导致CQ接收不到提交命令的完成命令。

6.3 中断

在Controller完成SQ命令后,根据执行状态,将结果组装成完成命令写入CQ中,Controller通过中断机制通知Host处理完成命令。

NVMe协议中支持的中断方式有4种,pin-based、Single MSI、Multi-message MSI和MSI-X,协议推荐采用MSI-X中断方式,能够支持更多的中断向量(2K)。

MSI-X允许每一个CQ发送自己的中断信息(相比于发一条中断信息提醒全部CQ队列有很大的优势)。在产生MSI-X中断信息前,需要检查该中断在相应寄存器种不被屏蔽。

6.4 Controller初始化

Controller的初始化过程:

  1. 设置PCI和PCIe寄存器;
  2. 等待CSTS.RDY变为;
  3. 配置AQA、ASQ、ACQ寄存器;
  4. 配置CC寄存器;
  5. 将CC.EN置1;
  6. 等待CSTS.RDY置1
  7. Host通过Identify命令,确定Controller的数据结构、确定Namespace的数据结构;
  8. Host通过get features(协议中是set features,待研究)获取I/O SQ和CQ信息,然后配置中断机制;
  9. Host分配适当的I/O CQ、SQ队列;
  10. 如果Host希望获取Controller的错误或健康信息,可以添加异步事件请求命令。

Controller 关机

正常关机:

  1. Host停止提交新的I/O命令,但允许未完成的命令继续完成;
  2. Host删除所有I/O SQ,删除所有SQ队列后,所有未完成的命令将被撤销;
  3. Host删除所有I/O CQ;
  4. Host将CC.SHN置01b,表示正常关机;关机程序完成时,将CSTS.SHST置10b。

突然关机:

  1. Host停止提交新的I/O命令;
  2. Host将CC.SHN置10b,表示突然关机;关机程序完成时,将CSTS.SHST置10b
6.5 host端命令实例6.5.1 创建命令

总线可以分为哪三个层次,总线按层次和位置分为哪三类(21)

6.5.2 处理完成命令

总线可以分为哪三个层次,总线按层次和位置分为哪三类(22)

6.6 NVMe与PCIe交互实例(分析包结构)

以Host发出read命令为例。

  1. Host准备了一个Read命令给SSD:

总线可以分为哪三个层次,总线按层次和位置分为哪三类(23)

分析该包,Host需要从起始LBA 0x20E0448(SLBA)上读取128个DWORD (512字节)的数据,读到哪里去呢?PRP1给出内存地址是0x14ACCB000。这个命令放在编号为3的SQ里 (SQID = 3),CQ编号也是3 (CQID = 3)

  1. Host通过写SQ的Tail DB,通知Controller来取命令:

总线可以分为哪三个层次,总线按层次和位置分为哪三类(24)

上一页23456下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.