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