私が達成しようとしていること:
Developing an linux application in C language, that "exclusively" accesses a
ATAコマンドを送信するためのPATA/SATAハードディスクドライブ(HDD)(実際には、アクセスされたHDDのバイトを変更しないATAコマンドのみ-READ_SECTOR、IDENTIFY_DEVICE、SET_FEATURESなど)。
「排他的に」とは、HDDの電源がオンになるとすぐに(カスタムハードウェア-シンプルなオンオフスイッチであり、アプリケーションがロードされて必要になるまでHDDの電源がオンにならないようにする)、最初のそのHDDへのアクセスは私のアプリケーションだけです。私のアプリケーションを除くIOWは、Linuxカーネル(SCSIサブシステムを含む)や他のアプリケーションやプロセス、または人間のユーザーでさえ、アプリケーションが指示/許可しない限り、そのHDDにアクセスできません。
私のアプリケーションには別の要件があります。私たちのアプリではHDDへのアクセスが非常に重要であるため(パフォーマンスではなく制御の観点から)、実行されるトランザクションにI/Oスケジュールが関与することは望ましくありません。アプリケーション別(このHDDのパフォーマンスは制約ではありません)。また、HDDから読み取られたデータがカーネルバッファまたはページバッファによってバッファリングされることは望ましくありません。アプリケーションは、512バイトまたはその倍数のブロックサイズでのみ読み取ります。
今私が直面している問題は次のとおりです。
SCSIサブシステムは、I / Oスケジューラとカーネルバッファまたはページバッファキャッシュの下にあります(動作するように記述されています)。
'sg-driver'は、コマンドを直接送信するためにSCSIサブシステムによって提供されます(-Linux SCSIサブシステムコマンド。ATAまたはSCSIコマンドを直接送信するのではなく、libataによって実際のATAコマンドに変換されます。私はここにいますか?) HDDですが、これはI/Oアプローチです。i/pを指定してo/pを取得します。つまり、データ転送プロトコル(PIO、DMA、ATAステータス、エラーレジスタなど)のプロセスを制御できません。およびデバイス構成(Set Features ATAコマンドを使用)。
また、エラー報告メカニズムは適切である必要があり、LinuxSCSIサブシステムのエラーコードだけでなくATAプロトコルに固有のものである必要があります。IOWは、アプリケーションがPATA /SATAHDDのATAエラーレジスタとATAステータスレジスタにアクセスできる必要があります。
私のアプリケーションが要求するのは、HDDの排他的制御です。READ_SECTOR ATA cmdを発行し、I / Oポートの読み取りまたは「libata」を介してHDDからデータ自体を直接取得する場合は、上記の要件を満たす必要があります。
できないことは?
PATA / SATA HBAデバイスドライバーまたは市場で入手可能なすべてのHBAを作成するつもりはありません。これらは、libataのカーネルにすでに含まれているためです。
今まで学んだことは?
目的のタスクを実行するには、VFSレイヤーと直接対話するブロックデバイスドライバーを作成する必要がある場合があります(または、VFSをバイパスして、アプリがこのブロックドライバーと直接通信できるようにする方法はありますか?) )カーネルバッファまたはページバッファとI/Oスケジューラを含む/混乱させることはありません。このブロックドライバーはlibataと直接通信し(SCSIサブシステム上位層をバイパスします)、次にPATA /SATAHBAドライバーと通信します。
このようなドライバーをCPUアーキテクチャに依存しない方法で作成することは可能ですか?
それは実行可能なアプローチですか?はいの場合、アプリからアクセスされない接続されている他のHDDのI/Oパフォーマンスに影響します。この上。この場合、アプリケーションがブロックドライバーと通信するために、VFSを介してシステムコールを作成する(または可能であればバイパスする)必要がありますか?このアプローチについて教えてください。
または、ブロックデバイスドライバーがlibata用に作成されたPATA / SATA HBAドライバーと直接通信することは可能ですが、このアプローチは、アプリからアクセスされない接続された他のHDDのI/Oパフォーマンスに影響します。この上。また、アプリケーションはこのブロックデバイスドライバーとどのように通信しますか?
教えてください。
また、アプリケーションの同じシナリオについて知りたいのですが、1つの違いがあります。PATA/ SATAドライブの代わりに、SCSIハードドライブとそのバリアント(具体的には、SAS、ファイバーチャネル、およびUSB)がある場合はどうなりますか。そしてもちろん、今回はlibataコマンドとATAコマンドではなく、SCSIプロトコルコマンドを使用します。
PATA / SATA HBA libataドライバーを含むライブCDディストリビューションをアプリケーションホストとして提案しますか(-IDEサブシステムでは使用しないため、現在は減価しており、更新されない可能性があります) HBAドライバーの場合。)ほとんどのHBAの場合。
つまり、LinuxアプリケーションがPATA/SATAまたはSCSI/SAS/ファイバチャネルHDDにアクセスするための最も直接的な方法は何ですか。
私の質問に関して十分な情報を提供したことを願っていますが、さらに詳しい情報や説明が必要な場合は、お気軽にお問い合わせください。
Update1(2012年6月27日):
Chris(以下を参照)との有益な議論と私の調査により、次の結論に達しました。
既製のUSB-PATA/SATAアダプターは私の目的を解決しません。なぜなら、それは私のアプリを許可しないからです。または、データ転送モード(PIOとDMA)をオンザフライで変更するドライバーの場合、アプリは許可されません。またはATAレジスタを読み取るためのドライバ。
カスタムメイドのUSB-PATA/SATAアダプターが役立つかもしれませんが、それにはATAプロトコルを実装する必要のある組み込みプロセッサーまたはATAプロトコル全体を実装するFPGAチップのいずれかが必要になります。しかし、組み込みプロセッサソリューションにはGPIOが含まれており、特殊なトランシーバーが必要になるためSATAには適していません。また、I / Oパフォーマンスは、PATAとSATAの両方で問題になります。私のアプリケーションには遅すぎます。
このようなアダプターは、私のlinux-kernelドライバー(またはlibusb経由)と私のアプリと通信します。私のアプリとの通信に役立つカスタムプロトコルによって。組み込みプロセッサ上のATAプロトコル。FPGAチップソリューションの場合、このプロトコルをATAプロトコルとともにFPGA自体に実装する必要があります。
しかし、現時点では、FPGAソリューションと組み込みプロセッサソリューションを実装することは、労力、時間、費用の面で実行不可能です。だから私はソフトウェアのみの解決策で立ち往生しています。
最後に、Chrisが言ったように、要件を満たすために、ハードウェアインターフェイスレイヤーまですべてを複製して変更する必要があるようです。
したがって、VFSレイヤーとHBAドライバーまたはlibataレイヤーの間で、正確にどのように進める必要がありますか。実装する必要があるものとそうでないものは何ですか?
誰かがこの問題に光を当てることができますか?何か案は??
Update2(2012年1月7日):
この問題に苦労しています。私を啓発することができる誰かがSOにいますか?