Технические вопросы и ответы QA1179

Команды Sending SCSI или ATA к устройствам хранения

Q: Я хотел бы отправить команду SCSI или ATA в свой жесткий диск, читателя флэш-памяти или другое устройство хранения. Пользовательский Клиент SCSITask, кажется, правильный API для отправки команд SCSI, но она не работает, когда я пытаюсь использовать ее с этими устройствами. Плюс, я не могу счесть API для отправки команд ATA подобным Пользовательскому Клиенту SCSITask API. Каковы мои опции здесь?

A: Я хотел бы отправить команду SCSI или ATA в свой жесткий диск, читателя флэш-памяти или другое устройство хранения.

Пользовательский Клиент SCSITask, кажется, правильный API для отправки команд SCSI, но она не работает, когда я пытаюсь использовать ее с этими устройствами.

Плюс, я не могу счесть API для отправки команд ATA подобным Пользовательскому Клиенту SCSITask API.

Каковы мои опции здесь?

Mac OS X проектом не поддерживает передающие команды SCSI или ATA с приложения на большинство устройств хранения, если разработчик не обеспечивает пользовательский драйвер ядра для устройства.

Семья SCSI Architecture Model (SAM) обеспечивает драйверы логической единицы в ядре, переводящие универсальные запросы I/O в специфичные для устройства команды для устройств, возвращающих один из следующих четырех типов периферийного устройства от команды INQUIRY:

Проект семьи SAM только позволяет одному драйверу логической единицы за один раз управлять устройством. Эта архитектура имеет два значительных преимущества. Во-первых, целостность операционной системы и данных пользователя защищена, потому что приложения не могут непосредственно изменить состояние устройства без сотрудничества драйвера логической единицы в ядре, предоставленного разработчиком. Во-вторых, безопасность данных пользователя улучшена, потому что приложения не могут произвольно обойти полномочия файловой системы путем отправки команд I/O непосредственно в устройство хранения.

Пользовательский Клиент SCSITask реализует интерфейс устройства, позволяющий приложению становиться драйвером логической единицы для поддерживаемых устройств и таким образом отправлять команды SCSI в те устройства. Пользовательский Клиентский API SCSITask поддерживается для устройств, таких как принтеры, сканеры, лентопротяжные устройства и средние преобразователи, имеющие типы периферийного устройства кроме упомянутых выше. Этот API также поддерживается для авторских устройств типа периферийного устройства за 05$, соответствующих спецификации MMC, такой как средства записи DVD и CD.

Тот же проект применяется к семье ATA также: отправка команд непосредственно к ATA и Serial ATA (SATA) устройства не поддерживается. Однако семья ATA действительно обеспечивает интерфейс устройства, позволяющий приложениям читать SMART (Самоконтроль, Анализ и Технология создания отчетов) данные от ATA и устройств SATA, реализующих набор функций SMART.

Если бы Вы просто интересуетесь информацией, Вы получили бы от SCSI INQUIRY или ATA Команда устройства IDENTIFY, большая часть той информации уже публикуется в Реестре I/O и таким образом читаема приложениями, не отправляя команды в рассматриваемое устройство. Можно использовать приложение /Developer/Applications/IORegistryExplorer или инструмент командной строки ioreg видеть, нужно ли информация Вам, находится в Реестре I/O. Существует много примеров кода, показывающих, как искать и получить свойства из Реестра I/O, такие как CDROMSample и выборки в /Developer/Examples/IOKit.

Для выполнения операций I/O блочного уровня из приложения можно использовать устройство неструктурированного диска BSD в /dev. Это описано в Работе с Файлами устройств для Устройств хранения. Примером этого является AudioCDSample.

Как был упомянут ранее, необходимо будет реализовать собственный подкласс драйверов логической единицы Apple, чтобы позволить приложению отправлять команды SCSI или ATA в устройства, не поддерживаемые Пользовательским Клиентом SCSITask или интерфейсом Устройства Интеллектуального. Руководство для записи такого драйвера может быть найдено в записи Драйверов для Устройств массового хранения. Простым примером является VendorSpecificType00.

Обязательно не отправьте команды READ или WRITE от Вашего пользовательского драйвера. Если Вы сделаете, то Вы откроете дыру в системе безопасности, которой вредоносный код может использовать Ваш драйвер, чтобы считать или уничтожить данные по устройству, которое пользователь защитил путем установки прав доступа. Снова, если Ваше приложение должно выполнить чтения блочного уровня или записи, используйте устройство неструктурированного диска BSD вместо этого.



История версии документа


ДатаПримечания
10.05.2005

Расширенное обсуждение архитектуры хранения Mac OS X. Добавленное определенное руководство относительно специфичных для поставщика драйверов. Обновленные ссылки на документацию. Расширенное покрытие команд ATA.

06.08.2002

Новый документ, объясняющий, что Mac OS X не реализует SCSI или передачу ATA для многих устройств массового хранения.