SCSI 到 NVME 的转换
SCSI to NVME Translation
我们正在开发一个应用程序来管理 Windows 10 中的 NVME
设备。我们不应该使用我们自己的驱动程序与驱动器通信,所以为了发送大部分命令,我们有依靠 Windows 10.
中可用的任何内容
对于像 Security Receive
和 Security 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,因此被拒绝。
使用固定固件,此问题消失,命令正确响应!
干杯!
我们正在开发一个应用程序来管理 Windows 10 中的 NVME
设备。我们不应该使用我们自己的驱动程序与驱动器通信,所以为了发送大部分命令,我们有依靠 Windows 10.
对于像 Security Receive
和 Security 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,因此被拒绝。 使用固定固件,此问题消失,命令正确响应!
干杯!