問題タブ [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.
c++ - IOCTL_ATA_PASS_THROUGH はどのように使用されますか?
私は (できれば任意の) ATA コマンドを送信するプログラムの作成に取り組んできましたが、これまで Windows で見つかった唯一のオプションは、IOCTL_ATA_PASS_THROUGHと、 C++ を使用した関連する構造体ATA_PASS_THROUGH_EXです。
残念ながら、自分が何をしているのかをまだ知らない人のために、ドキュメントが不足していることに気づきました。ここに私が理解していないものがあります:
IOCTL_ATA_PASS_THROUGHステートメントでどのように使用されますか?- 送信するATAコマンドはどこに置きますか?
ATA_PASS_THROUGH_EX.DataTransferLengthデータ バッファーのサイズ (バイト単位) である必要があります。それは構造体 + ATA コマンドですか、それとも単にコマンドですか?- コマンドを送信するドライブをどのように選択しますか?
- ドライブからの応答はどこに行きますか?
c - カーネル モード プログラムで AHCI コントローラの SATA ディスクに書き込めません
いくつかのことをテストするために、実験的なカーネル モード プログラムを作成しています。AHCI コントローラに接続された SATA ディスクとの間で IO を実行したいと考えています。私は、もう持っていない別の PC で実行された別の同様のプロジェクトで以前に働いていた C ドライバーを持っています。私が今持っている PC は、ICH9 チップセットを搭載した HP ラップトップです。すべての読み取りと書き込みはサイズが 2 セクターで、一度に 1 つずつ発生するため、通常の LBA48 DMA 読み取り/書き込みコマンド (NCQ なし) を発行し、割り込みを取得して完了を通知します。読み取りは期待どおりに完全に機能しますが、書き込みは 100% の確率で失敗します。PxSERR はゼロのままですが、PxIS で TFES ビットが点灯します。デバイスは、エラー レジスタに 0x84 (インターフェイス CRC エラー、コマンドが中止されました) を示し、ステータス レジスタに 0x51 (エラー、シーク完了、デバイス準備完了) を示します。これは、ケーブル接続の問題または同様のハードウェアの問題を示しているようです。しかし、Linux では、同じデバイス上の同じパーティションへの読み取りまたは書き込みに問題はなく、BIOS の組み込みディスク テストでは、ディスクが正常に動作していると報告されています。下位の DMA モードを指定する SET FEATURES コマンドをデバイスに送信しても違いはなく、Linux はとにかくデバイスを UDMA/133 モードにすると報告します。(これは SATA にも関係がありますか?)
x86 - (ATA PIO) ポートからのガベージ読み取り
プロテクト モードからファイルをロードする ATA PIO ドライバーを作成しようとしましたが、ポートから受信したすべてのデータがゴミのように見えます ( 0xffff)。
PIO ドライバーを作成するのはこれが初めてなので、自分が何をしているのかよくわかりません。28 ビット PIO を機能させるために、OsDev のリンクをたどっています。( https://wiki.osdev.org/ATA_PIO_Mode#28_bit_PIO )
以下は、PIO 読み取りを使用して最初のセクターをロードしようとするコード スニペットです。
そして、私のasmから私はこれを次のように呼び出します:
disk_wait および drq_wait 関数は次のとおりです。
しかし、私が受け取るすべてのデータは0xffff.
ブートローダーで boot_disk の値を確認しました。dl の値は080h、qemu がハードディスクから起動するように設定されています。