高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1179
Sending SCSI commands to storage devices


Q: ハードディスクドライブやその他のストレージデバイスに SCSI コマンドを送る必要があります。SCSITask User Client がそのための API なのだと思いますが、ハードディスクドライブに対してこれを使おうとしてもうまく行きません。何が起きているのでしょうか?

A: アップルは、アプリケーションからハードディスクドライブへの SCSI コマンドの送信をサポートしていません。設計上、デバイスを制御できるのは、一度に 1 つの論理ユニットドライバに限られています。アップルでは、ハードディスクドライブ、および INQUIRY コマンドから戻される周辺機器のタイプに基づく他の SCSI Architecture Model(SAM)デバイスのために、カーネル内ドライバを提供しています。

以下は、「Inside Mac OS X: Accessing Hardware from Applications」からの抜粋です。

『SCSI Architecture Model ファミリは、カーネル内論理ユニットドライバを提供します。これらのドライバは、汎用の I/O 要求を、これらのバス上にあり、下記の 4 タイプの周辺機器の 1 つを宣言するデバイスに固有のコマンドに変換します。

  • SCSI ブロックコマンド仕様準拠のブロックストレージデバイスは$00。
  • SCSI マルチメディアコマンド仕様準拠のマルチメディアデバイスは$05。
  • SCSI ブロックコマンド仕様準拠の光磁気デバイスは$07。
  • SCSI 縮小ブロックコマンド仕様準拠の縮小ブロックコマンドデバイスは$0E。

スキャナ、テープドライブ、メディアチェンジャなど他の周辺機器のタイプを宣言するデバイスについては、SCSI Architecture Model ファミリは、SCSITaskDeviceInterface と呼ばれるデバイスインタフェースを提供します。これにより、アプリケーションは対象デバイスの論理ユニットドライバになることができます』

ハードディスクドライブの周辺機器タイプは 0x00 であるため、アップルは、SCSITaskDeviceInterface ではなくカーネル内ドライバを提供します。

ATA ドライブにも同じ原理が当てはまります。つまり、ATA ファミリも、アプリケーションからコマンドを送信するためのデバイスインタフェースを提供していません。

このアーキテクチャには 2 つの重要な利点があります。アプリケーションは、デバイスの状態を自由に変更することはできないため、オペレーティングシステムから見たデバイスは常に一貫性があり、これにより安定性も良くなっています。さらに、ファイルシステムのアクセス許可をバイパスする能力を制限することにより、データセキュリティを高めています。

SCSI INQUIRY コマンドまたは ATA IDENTIFY DEVICE コマンドを使って取得する情報を単に見たいだけなら、それらの情報の多くは I/O Registry に登録されています。アプリケーション /Developer/Applications/IORegistryExplorer、またはコマンドラインツール ioreg を使って、必要な情報が I/O Registry にあるかどうか確認できます。CDROMSampleSCSITask User Client SDK のサンプルなど、プロパティを検索、取得する方法を示したサンプルコードもあります。

I/O 処理のもう 1 つの方法として、/dev にある BSD raw ディスクデバイスを使う方法があります。これについては、「Accessing Hardware from Applications」の Working with Device Files for Storage Devices というタイトルの章で説明されています。

このサンプルは、AudioCDSample にあります。


[2002 年 7 月 25 日]