NVMe 2.3协议学习
文章目录1 Controller Properties1.1 如何访问1.2 Controller 初始化流程1.3 CAP - Controller Capabilities (Offset 00h, 64-bit)X 面试场景问题1 为什么Properties Host必须通过BAR访问不能通过DMA2 如果Host按dword访问qword的CAP会怎样3 CC.EN从1→0关闭Controller时CSTS.RDY多久变04 IO SQ/CQ的创建细节1 Controller PropertiesNVMe 协议章节 3.1.4 Controller PropertiesController Properties如CAP、CC、CSTS 这些关键的寄存器和SSD Controller初始化流程相关。画出初始化状态机流程图FTL关注点Controller Properties如CAP、CC、CSTS通常通过PCIe BAR空间访问必须按指定宽度dword/qword访问跨Property访问不支持这意味着如果你要读取64-bit的CAPController Capabilities必须一次性读qword不能分两次读dword1.1 如何访问层级存储位置说明PCIe BAR空间SSD控制器内部的寄存器Registers物理上在SSD主控芯片内Host视角映射到Host内存地址空间的MMIO区域Host通过内存读写访问Host CPU → PCIe TLP (Memory Read/Write) → SSD Controller BAR → 内部寄存器关键Host看到的内存地址 PCIe配置空间分配的BAR基地址 Property Offset1.2 Controller 初始化流程Host要把SSD(Controller) 初始化好让Controller能够开始接收命令完整的Host初始化Controller的流程状态机如下┌─────────────────┐ │1.读取CAP │ ← 确认Controller能力 │(Offset00h)│ └────────┬────────┘ ▼ ┌─────────────────┐ │2.配置CC │ ← 设置Command Set,Page Size │(Offset14h)│ 但不Enable(EN0)└────────┬────────┘ ▼ ┌─────────────────┐ │3.配置AQA │ ← Admin Queue深度 │(Offset24h)│ └────────┬────────┘ ▼ ┌─────────────────┐ │4.配置ASQ │ ← Admin SQ基址(64-bit)│(Offset28h)│ └────────┬────────┘ ▼ ┌─────────────────┐ │5.配置ACQ │ ← Admin CQ基址(64-bit)│(Offset30h)│ └────────┬────────┘ ▼ ┌─────────────────┐ │6.写CC.EN1│ ← Enable Controller │(Offset14h)│ └────────┬────────┘ ▼ ┌─────────────────┐ │7.轮询CSTS │ ← Host轮询寄存器等待RDY1│(Offset1Ch)│ 检查CFS0└────────┬────────┘ ▼ ┌─────────────────┐ │8.Identify │ ← 发送Admin命令 │ Controller │ 获取设备信息 └────────┬────────┘ ▼ ┌─────────────────┐ │9.Create I/O │ ← Host发送 创建I/O Queue 请求 │ Queues │ └────────┬────────┘ ▼ ┌─────────────────┐ │10.开始I/O │ ← 发送Read/Write命令 └─────────────────┘FTL需关注的Properties如下关注点为什么重要CAP.MPS决定PRP List结构影响数据传输效率CAP.MQES决定Queue深度影响并发I/O性能CC.MPS配置必须与Host内存页大小匹配CSTS.RDY轮询超时处理防止初始化死锁Doorbell机制Tail Doorbell通知有新命令Head Doorbell通知已取走完成1.3 CAP - Controller Capabilities (Offset 00h, 64-bit)CAP是只读寄存器字段位作用FTL关注点MQES15:00Max Queue Entries Supported决定SQ/CQ最大深度0-basedCQR16Contiguous Queues Required1必须用物理连续队列AMS18:17Arbitration Mechanism Supported0Round Robin, 1Weighted RRTO23:20Timeout500ms × (TO1)初始化超时计算DSTRD31:24Doorbell Stride每个Doorbell寄存器间距 4 DSTRDNSSRS33NVM Subsystem Reset Supported是否支持NSSRCSS44:37Command Sets Supported支持哪些I/O Command SetMPSMAX/MPSMIN52:32Memory Page Size Max/Min决定PRP/SGL页大小X 面试场景问题1 为什么Properties Host必须通过BAR访问不能通过DMAProperties是控制器状态/配置寄存器需要CPU直接访问低延迟。DMA用于数据传输高吞吐。BAR映射到MMIO空间CPU可用普通load/store指令访问。2 如果Host按dword访问qword的CAP会怎样未定义行为。Spec要求必须按定义宽度访问。实际可能导致读取错误值或触发错误。3 CC.EN从1→0关闭Controller时CSTS.RDY多久变0取决于CAP.TO定义的Timeout。Host必须轮询等待或超时后强制Reset。[疑问CC.EN从1→0 该行为意味着什么Controller内部做什么后会把RDY置为0]4 IO SQ/CQ的创建细节在Controller 准备就绪后Host会给Controller发消息来创建 IO SQ/CQ。创建SQ/CQ的 队列数量 和 深度如何确定的Host会通过Identify命令来获取Controller 支持的 队列数量上限。Host会通过Set Features的Number Of Queues 属性来向Controller传递想要的 IO SQ/CQ 数量。Number Of Queues 是 SSD的一个FeatureNSQ (Number of Submission Queues)主机希望创建的I/O提交队列数量0值表示1个队列。NCQ (Number of Completion Queues)主机希望创建的I/O完成队列数量0值表示1个队列。控制器收到请求后会评估自己的能力。它不一定能满足Host的所有请求可能会返回一个它实际能支持的、接近请求值的数量。这个协商结果会通过Set Features命令的完成队列条目返回给Host。之后Host会读出该结果作为实际分配数量的参考。获得最终数量后Host便开始按这个参考结果进行实际的队列创建操作主要有两种Admin命令Create I/O Completion Queue命令用于逐个创建I/O CQ。命令参数包括指定CQ ID (qid) 和大小 (qsize) 等。Create I/O Submission Queue命令用于逐个创建I/O SQ。创建时需指定归属的CQ ID实现多SQ对一CQ的关联。典型协商流程初始匹配阶段主机首次写入 Set Features (FID07h)假设要申请 NCQ63 和NSQ63。若控制器最大支持32个I/O队列0-based返回31协商后主机会读取 Result 值 Result (31 16) | 31 (即0x001F001F)。逐个创建阶段最终按 31 的返回值通过 Create I/O Completion Queue 和 Create I/OSubmission Queue 命令逐个创建这些队列。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2568125.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!