NVMe 控制模块负责实现用户请求事务与 NVMe 事务的转换、 NVMe 命令提交
与完成机制、 PRP 寻址机制。 在 NoP 逻辑加速引擎中, 用户通过配置系统控制模块
的相关寄存器来发送 DMA 或队列管理请求, NVMe 控制模块在得到任务信息后生成
对应的 NVMe 命令, 并通过指令提交与完成机制实现与 NVMe SSD 的任务交互。
NVMe 控制模块一方面通过硬件实现降低了命令交互的延迟和 PRP 寻址机制的过程
延迟, 另一方面通过结构的设计继承了软件协议栈的灵活性, 这使得系统即使在不同
的应用场景下也能充分发挥性能优势。 如图 1 所示 NVMe 控制模块按照功能划分为
命令控制模块、 队列管理模块、 PRP 管理模块三个部分。
图1 NVMe控制模块架构图
指令控制模块负责 NVMe 指令的组装、分配、注销。在 NVMe 协议中, 一条 NVMe
指令由 16 个双字构成, 不同指令对应字段的含义也不相同。 因此当系统控制模块发
起请求事务时, 指令控制模块将对应寄存器中的信息整合成为 NVMe 的提交队列条
目, 并分配唯一的指令 ID, 再将条目写入提交队列中, 实现指令的组装和分配; 当 NoP 逻辑加速引擎设计接收到完成队列中的正常完成条目时, 指令控制模块提取其中的指令 ID 进行注销。
队列管理模块实现 NVMe 提交队列和完成队列的存储、 门铃机制、 仲裁机制,
以及队列的创建和删除管理。 NVMe 队列是实现 NVMe 指令提交与完成机制的核心
组件, 队列的数量和深度直接影响数据传输的性能。 在小数据随机读写的场景下, 性
能随着队列数量和深度线性增加然后趋于饱和; 在大数据顺序读写的场景下, 性能则
受队列数量和深度影响很小。 为了适应不同的应用场景, 队列管理模块采用存储和控
制分离的结构设计, 实现动态配置队列, 以更低的时间和资源成本实现性能的最优发
挥。
PRP 控制模块实现 PRP 的管理与生成。 每一条涉及数据传输的 NVMe 指令都有
对应的 PRP 条目或列表来指示地址, PRP 控制模块根据指令 ID 创建对应的 PRP 列
表头指针, 在有指令需要读取 PRP 列表时根据 ID 生成与指令对应的 PRP 条目。 PRP
控制模块使 PRP 的存储位置更加接近数据传输链路, 从而降低 PRP 读取延迟, 提高
数据传输效率。
对相关视频感兴趣的,请到B站搜用户名: 专注与守望
接下来对指令控制模块、 队列管理模块、 PRP 控制模块的结构设计进行分析。