1

当 NVME 控制器向 FPGA 发送数据时。lba 不正常。我们在从 nvme 源磁盘获取具有正确顺序的 lba 时遇到了麻烦。

我正在与 NVMe 合作使用三星 SSD 970 PRO 512GB 的项目。在我们的项目中,我们使用 FPGA 与 NVMe 设备进行通信,但我们的过程遇到了如下问题:

1. FPGA having FIFO buffer mapped with DMAP2P works as destination/from address for NVMe controller to read/write.
2. NVMe driver sends command to NVMe controller, requests a read command with transfer size 4096 lba (2MB).
3. When controller sends data into FPGA. lba is not in order. we got trouble about getting lba with correct order from nvme source disk. (1)

我调查了“数据集管理(DSM)”,每个读/写命令在 dword 13 内都有“顺序请求”位 [6]。我确认我们的 NVMe 设备(Samsung 970 Pro)支持 DSM,但看起来它对 NVMe 读取命令中的 lba 传输顺序没有任何影响。

请帮助我澄清每个 NVMe 读取命令中的“顺序请求”选项是什么,因为在 NVMe 规范中描述了“命令是包含多个读取命令的顺序读取的一部分”。是否能够在 NVMe 读取命令中更改 lba 传输顺序?正如我们所期望的(1)从 NVMe 读取命令(具有大的 lba)中按顺序接收 lba,这可能吗?我们能为我们的期望做些什么?

4

1 回答 1

0

NVMe 设备是相当复杂的设备,不应被视为原始 FLASH 存储。如果您请求读取存储在 4096 LBA 中的 2MB 数据,您最终可能会读取多个物理芯片。每个芯片可能在内部被划分为更小的逻辑元素。在这个大而长的读取请求期间,每个完整的设备和每个芯片都可能会做一些内务处理,因此某些 LBA 的读取速度可能比其他的快。这完全取决于供应商。如果必须对整个请求进行序列化,这将导致 NVMe 设备必须“缓冲”所有请求的巨大延迟和大量内存。所以我非常怀疑 NVMe 规范中是否存在禁止乱序数据传输的内容。此外,在 NVMe 设备报告整个读取完成之前,您不应假设给定内存范围内的任何有效数据。

于 2019-07-09T14:12:16.063 回答