2016-12-19 8 views
-1



FPGAベースの組み込みシステム用の低レベルSATAドライバを開発しています。運転手はうまく走っています。

ddコマンドを使用してディスクからセクタを読み取ると、SCSIのread(10)コマンド(opcode 0x28)が低レベルのドライバによって記録されていることがわかります。これは正しいと思います。しかし、ddコマンドを使用してディスクにセクタを書き込むと、SCSIドライバは最初のread(10)コマンド(opcode 0x28)を数回送信し、write(10)コマンド(opcode 0x2A)を送信しません。

書き込み操作中にSCSIドライバがread()コマンドを送信するのはなぜですか?


編集:ファイル書き込み操作中に、ドライバがLBA 0から最初に8つのセクタまで(DMAモード)を読み込むことがわかります。次に、(DMA)sgブロックを書き込み、次にディスク固有情報を読み取ります(PIO)。その後、いくつかのランダムなLBAを取り、いくつかの読み出し(DMA)を実行し、最終的にデバイス固有のデータ読み出し(PIO)を読み出すことによって停止します。これは、1KBファイルを作成するためのシーケンスです。ディスクにはパーティションテーブルはなく、ファイルシステムもありません(fdiskユーティリティで確認済み)。 ドライバの正常な動作ですか?はいの場合、それは操作の速度を低下させていませんか?書き込み操作で余分な読み込みが行われるため、ファイル全体の読み込みが書き込みより高速です。

ありがとうございましたDDコマンドを使用したディスク書き込み操作の混乱

+0

ddを実行するたびにそのシーケンスが実行されますか? Linuxは新しいデバイスがオンラインになったときにパーティションテーブルをスキャンしますが、デバイスを接続したままにしてddをもう一度実行すると、そのダンスを繰り返すべきではありません。 –

+0

はい、すべての "dd if = somefile.txt = dev/sda bs = 1KB count = 1"の場合、コマンドの同じシーケンスが実行され、最初に何回でもかまいません。デバイスは常にホストに接続されます。 SCSIドライバで何か変更する必要がありますか?私はSCSIドライバで何も変更していませんでした。私はちょうどSCSI SHT構造体と関連する機能を低レベルのドライバで初期化しました。 –

答えて

1

システムについて詳しく知ることなく具体的​​には言い難いです。 2つの可能性が考えられます:

  1. Linuxはパーティションテーブルを探しています。これは、読み込みがLBA 0と最初の数論理ブロックにある場合、または読み込みがセカンダリGPTヘッダーがあるデバイスの最後まで行われた場合です。

  2. あなたはファイルシステム上のファイルをddしていますが、ファイルシステムはキャッシュされていないメタデータを読み込んでいます。

+0

こんにちは、返信いただきありがとうございます。あなたが言及した最初の理由は部分的に正しいと思います。私は質問を編集し、ドライバの動作に関する詳細情報を追加しました。 –

関連する問題