2016-04-19 6 views
0

Мы разрабатываем приложение для управления устройствами NVME в Windows 10. Мы не должны использовать наш собственный драйвер для связи с дисками, поэтому для отправки большинства команд мы должны полагаться на все доступные с ОС Windows 10.Перевод с SCSI на NVME

для команд, как Security Receive и Security Send, мы используем их поддержку SCSI-NVME перевода, в котором команда SCSI посылается от хоста и транслируется в NVME команды в стеке ядра SCSI, а затем отправляется в привод.

Мы можем видеть, что команды достигают диска, но перевод не может отправить правильный идентификатор пространства имен на диск в случае команды Security Receive, и поэтому SCSI возвращает ошибку в данных о смысле как Access denied, Invalid LU Identifier.

Перевод SCSI-NVME не позволяет устанавливать поле идентификатора пространства имен в своем CDB. Есть ли другой способ для установки этого идентификатора пространства имен в команде SCSI, которую мы отправляем со стороны хоста? Или это ошибка драйвера, что отправка неверных данных на диск?

Другие API-интерфейсы Microsoft (например, свойство Query Query) устанавливают этот идентификатор пространства имен сами по себе, и нам не нужно устанавливать его со стороны пользователя.

Если кто-то, кто работал в подобной среде, может помочь нам, это будет очень полезно.

+0

Чтобы снова перефразировать вопрос, я хочу знать, как идентификатор пространства имен устанавливается с помощью команды SCSI всякий раз, когда мы используем подход SCSI-NVME Translation для отправки команд на NVME Drive. Спецификация перевода SCSI-NVME, которую я использую, не говорит о том, как Идентификатор NameSpace установлен в CDB. Идентификатор пространства имен является важным полем в структуре команд NVME. – Ravi

+0

Улучшено форматирование и формулировка. – CodeMouse92

+0

Хорошо! В следующий раз я позабочусь. – Ravi

ответ

0

Это интересный вопрос, я не совсем уверен, как драйвер Windows 10 работает внутри, но с точки зрения того, как спецификация намеревается работать для этого перевода, вам не нужно явно указывать NSID в в пользовательском пространстве.

Во всех драйверах Windows NVMe, с которыми я работал, контроллер отображается с помощью дескриптора адаптера, а пространства имен отображаются с помощью физических дисков. Предполагается, что команды SCSI переходят на ручки физических дисков, а собственные команды NVMe переходят к адаптеру. Если вы отправляете команду SCSI в дескриптор физического диска, предполагаемое пространство имен неявно, поскольку каждая из этих дескрипторов напрямую связана с пространством имен и поэтому должна быть установлена ​​в качестве драйвера во время трансляции. Это определенно, как это работает с драйвером OFA (OpenFabrics Alliance) и всеми производными.

Если вы отправляете команду SCSI на физический диск, а пространство имен не заполнено, это звучит как ошибка драйвера. Если вы отправляете команду SCSI адаптеру (и она не отбрасывается операционной системой/драйвером), попробуйте отправить ее на физический диск, соответствующий требуемому идентификатору пространства имен.

0

Я проиграл этот трек, извинения :(Да, вы правы, что для отправки команд scsi его следует отправлять на физические диски. В Windows 10 даже для отправки команд, предназначенных также для адаптера, например Identify Controller, мы используем один и тот же дескриптор (Physicaldrive handle), и есть отдельное поле, чтобы упомянуть, что это предназначено для адаптера. Возвращаясь к исходному вопросу, это ошибка встроенного ПО, связанная с управлением пространством имен. Драйверы Windows читают много продуктов, загружаемых с дисков NVME, когда система загружается, и они поддерживают это внутри themselvs и считывают с этого источника всякий раз, когда отправляется определенная команда. Ваше предположение о действиях с механическим приводом, строго привязанных к пространствам имен, является правильным из-за такого поведения драйверов Windows 10. ошибка встроенного ПО, то, что добиралось до диска, - это пространство имен 0, которое является inv alid namespaceId и, следовательно, отклонено. С помощью исправленной прошивки эта проблема исчезла, и команда ответила правильно!

Приветствия!