問題タブ [ata]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
rfc - 公式のATA-4仕様/RFCを探しています
次のいずれかを探しています。-ATA-4仕様-リアルモードアセンブリ(MASM / TURBO ASM)で記述されたATA-4仕様のラッパー
drivers - ATAトリム仕様?
TRIM をトリガーするためのプロトコルを詳述する ATA 参照がどこにあるか知っている人はいますか? ATA デバイスが TRIM をトリガーするために、生の IOCTL で送信する必要がある構造/オブジェクト/データの種類を見つけようとしています (明らかに、適切なハードウェア/ファームウェアのサポートを前提としています)。
ありがとう。
hard-drive - LBA レベルのディスク アクセス
ディスク コマンド (lba n から k ブロックを読み取るなど) を SATA ディスクに発行する最良の方法は何ですか? OSの選択は問いません。また、ATA コマンドを発行できる必要もあります。プログラムでioctlを使用するよりも、ツール/アプリケーションを介してこれを行う方がよいでしょう。
linux - Linux での ATA の信頼できるコマンド
同僚、
ATA の信頼できるコマンドのサポートを実装しています
Linux (2 つのホスト、Fedora 12 および 14) の場合、自己暗号化ドライブをサポートします。このページhttp://www.jukie.net/bart/blog/ata-via-scsiからベース コードとしてコードを取得しました。信頼できる受信の場合 (この層では、IDENTIFY、0xEC と同じです):
これは、Identify およびその他すべてのコマンドに対して完全に機能しますが、信頼できるコマンドに対しては機能しません。プロトコル アナライザーを接続すると、これらのコマンドが SATA バスに送信されないことがわかります。それらは Windows で正常に動作するため、アダプターはそれらを送信できます (私のコードではありませんが、ATA_PASS_THROUGH を使用していると思います)。はい、このコードをルートとして実行しています。
この謎を解決するのを手伝ってください:)
drive - Windows XP の SAS バスでの ATA PASS THROUGH DIRECT
SAS (SATA 接続 SCSI) バス上のドライブに「ATA パス スルー ダイレクト」コマンドを送信したいと考えています。ドライブは、Windows XP(x86) 環境では SATA ドライブです。ATA コマンドを STP に変換して SCSI バス経由で SATA ドライブに送信する STP (SATA Tunneled Protocol) レイヤーがあればいいのにと思いました。ただし、「ATA パス スルー ダイレクト」コマンドを Win32 API DeviceIOControl() に送信すると、ステータスは「関数が間違っています」というエラーを返します。STP レイヤーは Windows XP に存在しますか? Win32 API Readfile()/Writefile() が機能する必要があります。しかし、「ATA パス スルー ダイレクト」コマンドを取得して、SAS バスで Win32 API を操作するにはどうすればよいでしょうか?
windows - WindowsのデバイスにATAコマンドを直接送信しますか?
Windowsの物理ディスクにATAコマンドを送信し、デバイスから応答を取得しようとしています。
注:この場合、
IDENTIFY DEVICE
(0xEC)コマンドを送信します。デバイスは512バイトのデータブロックで応答します。(特に、ワード119のビット0(デバイスによるコマンドのサポートTRIM
)に関心があります)。
CreateFile
デバイスを開くために使用する必要があることを知っています。
しかし、この後、私は何をすべきかについて悩まされています。
0xEC
を使って送ることを考えました[DeviceIoControl][4]
:
しかし、これは完全に間違っています。DeviceIoControlに送信されるIoControlCodeは、マクロを使用して構築された有効なIO_CTLである必要があります。
SDKを見ると、有効なディスク管理制御コードがいくつかあります。例:
- IOCTL_DISK_CREATE_DISK
- IOCTL_DISK_GET_DRIVE_GEOMETRY
- IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
- IOCTL_DISK_GET_PARTITION_INFO
- IOCTL_STORAGE_QUERY_PROPERTY
しかし、それらのどれもIDENTIFY DEVICE
コマンドではなく、それが返すものは何でも返しません。
したがって、コマンドを送信するための「生の」方法を使用する必要があると思います。
周りを検索して、文書化されていないIOCTLに出くわしました
これは、IOCTLの断片を分解すると、次のことを意味します。
inputBuffer
しかし、何を含める必要があるか、そのサイズ、何を含めるか、または必要なものについてのドキュメントはどこにもありませんoutputBuffer
。functionCode
また、 34(0x22)が何であるかを理解することもできません。
私の質問:生のATAコマンド(0xECなど)をATAデバイスに送信し、その応答を読み取るにはどうすればよいですか?
も参照してください
回答ピース
読み取り/書き込みアクセスでドライブを開きます。
IO制御コードATA_PASS_THROUGH_EX
で使用する入力バッファーとして構造を設定します。IOCTL_ATA_PASS_THROUGH
ドライブからの予想される512バイトの応答を保持するように出力バッファを設定します。
電話DeviceIoControl
:
ファイルハンドルを閉じます。
device-driver - ATA/IDE 割り込みを確認する適切な方法は何ですか?
私は現在、趣味の OS、具体的には ATA ドライバーに取り組んでいます。割り込みを伴う PIO データ入力コマンドで問題が発生しています。READ MULTIPLE コマンドを実行して、ブロックごとに割り込みを発生させながら、ブロックごとにドライブから複数のセクターを読み取ろうとしています。
4 ブロック (ブロックごとに 1 セクター) の読み取りを要求した場合。データ ブロックごとに 1 つずつ、合計 4 つの割り込みが発生すると予想しています。4 番目の割り込みを受信すると、すべてのデータを転送したことを識別し、それに応じてリクエスト構造を更新できます。ただし、VirtualBox では、最後のデータ ブロックが転送された後、さらに別の割り込みを受信したことがわかりました (STATUS = 0x50、READY、OVERLAPPED MODE SERVER REQ)。ステータス レジスタを読み取るだけでクリアできますが、仕様によると 5 番目の割り込みを受信する必要はないと思います。
では、ATA デバイスによって発行された割り込みを確認する適切な方法は何ですか?
この例では、READ MULTIPLE コマンドを発行すると、ISR は次のことを行います。
- CPU 割り込みを無効にし、nIEN を設定します
- DATA レジスタから 1 つのデータ ブロック (セクタではありません!) を読み取ります。
- すべてのデータが読み取られた場合は、STATUS レジスタを読み取って「余分な」割り込みをクリアします。
- nIEN をクリアして終了し、マスター PIC とスレーブ PIC の両方に EOI を送信します。
PIO データ入力コマンド プロトコルの ATA 仕様は、ステータス レジスタを読み取る必要があることを示していません。そのことから、割り込みを受け取ったら、プロトコルに従い、EOI を PIC に送信して終了するだけでよいと思いました。nIEN の設定/クリアに関しては、VirtualBox を扱う際に、これを行わないと、最初の割り込みを超えて割り込みを受け取らないことがわかりました。そのため、ISR に入るときに nIEN を設定し、出発する前にクリアします。効果はないと思いますが、その特定のレジスタの読み取り/書き込みに関連している必要があります。
assembly - I/O ポートの読み取りには副作用がありますか? プログラムされた I/O ではどうですか?
CPU ポートを ( in
/out
命令を介して) 読み取ると、何らかの副作用がありますか?
例えば:
ポートが読み取られたことをデバイスに「伝えます」か?
任意のポートを不用意に読み取ると害が生じる可能性はありますか?
私はそれがすべきではないと仮定していますが、それから何かが私には意味がありません:
副作用がない場合、ATA ドライブは、プログラムされた I/O を実行するときに、ワードがいつ読み取られたかをどのように「認識」し、データの次のワードを提供できるのでしょうか?
windows - IDENTIFY DEVICE COMMAND の送信 - RAID での ATA PASS THROUGH - SSD
私の目的は、RAID 構成のシステムでソリッド ステート ドライブを検出することです。smartmontools の次のコマンドを使用すると、ビット 434 (217) が SSD の値 1 を示していることがわかります: smartctl -i -r ataioctl,2 /dev/csmi0,0
同じ 512 バイトのデータを読み取ろうとして、次の 2 つの方法で IDENTIFY DEVICE コマンドを送信しようとしています。
方法 1 は DeviceIoControl() set GetLastError() as 87 (ERROR_INVALID_PARAMETER) で失敗します。何が問題なのかを理解するのを手伝ってもらえますか?私は正しい方向に進んでいますか?
方法 2 には info->IoctlHeader.ReturnCode = 3 があり、これは CSMI_SAS_STATUS_INVALID_PARAMETER を意味します (提供された CSMI バッファーが小さすぎます)。
///////// 方法 1 /////////
//////// 方法 2 //////////
linux-kernel - I/OスケジューリングとLinuxカーネルページバッファリングのバイパス
私が達成しようとしていること:
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にいますか?