SCSI 到 NVME 的转换

SCSI to NVME Translation

我们正在开发一个应用程序来管理 Windows 10 中的 NVME 设备。我们不应该使用我们自己的驱动程序与驱动器通信,所以为了发送大部分命令,我们有依靠 Windows 10.

中可用的任何内容

对于像 Security ReceiveSecurity Send 这样的命令,我们使用它们对 SCSI-NVME 翻译的支持,其中从主机发送 SCSI 命令并翻译成 NVME 命令由 SCSI 内核堆栈,然后发送到驱动器。

我们可以看到命令正在到达驱动器,但是在 Security Receive 命令的情况下,转换无法将正确的命名空间标识符发送到驱动器,因此,SCSI 在将数据感知为 Access denied, Invalid LU Identifier

SCSI-NVME 转换不允许在其 CDB 中设置命名空间标识符字段。有没有其他方法可以在我们从主机端发送的 SCSI 命令中设置这个名称空间标识符?或者这是一个驱动程序错误,它向驱动器发送了不正确的数据?

Microsoft 的其他 API(如 Storage Query 属性)自行设置此命名空间 ID,我们不必从用户端设置。

如果有人在类似环境中工作过,可以帮助我们,这将非常有帮助。

这是一个有趣的问题,我不完全确定 Windows 10 驱动程序在内部是如何工作的,但就规范打算如何进行此转换而言,您不需要在用户空间明确指定一个 NSID。

在我使用过的所有 Windows NVMe 驱动程序中,控制器由其适配器句柄公开,命名空间由物理驱动器句柄公开。目的是将 SCSI 命令发送到物理驱动器句柄,将本机 NVMe 命令发送到适配器。如果将 SCSI 命令发送到物理驱动器句柄,则预期的名称空间是隐式的,因为这些句柄中的每一个都直接连接到名称空间,因此在转换期间应设置为驱动程序。这绝对是它在 OFA(OpenFabrics 联盟)驱动程序和所有衍生产品上的工作方式。

如果您将 SCSI 命令发送到物理驱动器并且命名空间未填写,这听起来像是驱动程序错误。如果您要将 SCSI 命令发送到适配器(并且它没有被 OS/driver 拒绝),请尝试将它发送到与所需命名空间 ID 对应的物理驱动器。

我忘记了这一点,抱歉:(。是的,你是对的,发送 scsi 命令,它应该发送到物理驱动器句柄。在 Windows 10 中,即使发送命令是也适用于适配器,如 Identify Controller,我们使用相同的句柄(Physicaldrive 句柄),并且有一个单独的字段来说明这适用于适配器。 回到最初的问题,这是与命名空间管理相关的固件错误。 Windows 驱动程序在系统启动时从 NVME 驱动器读取大量内容,并且它们在自身内部维护这些内容,并在特定命令出现时从该源读取 sent.Your 物理驱动器句柄严格附加到命名空间的假设是正确的由于 Windows 10 drivers.Because 固件错误的这种行为,到达驱动器的是命名空间 0,它是无效的命名空间 Id,因此被拒绝。 使用固定固件,此问题消失,命令正确响应!

干杯!