2

Xenセットアップでは、ゲストVMからのIOアクセスは、XENハイパーバイザーとの間で呼び出しを行う変更されたLinuxカーネルであるdom0と呼ばれる特権ドメインを経由します。ブロックIOの場合、フロントエンドがゲストVMにあり、ドライバーのバックエンドがdomain0にある分割ドライバーモデルがあります。バックエンドは、従来のLinuxブロックドライバーコードと同様に、「bio」構造を作成し、submit_bio()を呼び出します。

ここでの私の目標は、ディスクに書き込まれるデータに問題があるかどうかを確認することです(データの損失、サイレントに破損した書き込み、誤った方向の書き込みなど)。したがって、ディスクに書き込まれたデータを読み取り、それをキャッシュ上のデータのコピーと比較する必要があります(これは「書き込み後の読み取り」と呼ばれる一般的なディスク関数です)。私の質問は、バックエンドドライバーレベルから__bread()を呼び出すことはできませんか?__breadが呼び出されると、カーネルがクラッシュします。この理由を誰かが理解できますか?また、これが不可能な場合、ドライバーの下半分にあるディスクから特定のデータブロックを読み取るために他にどのような方法がありますか?

書き込みのバイオ構造をインターセプトしてクローンを作成し、新しいバイオで読み取った操作を変更して、submit_bio()を再度呼び出すことはできますか?私はそれを行いましたが、submit_bio()の完了コールバックによって返されるバイオ構造のセクター番号はランダムな値であり、送信したものではありません。

ありがとう。

4

1 に答える 1

1

これが私の仕事なら、まず新しいスケジューリング アルゴリズムを書いてみます。コードをコピーcfqまたはスケジューリングdeadlineすることから始めて、そこから作業を開始しnoopas書き込み要求を受け入れた後に読み取りコマンドを自己送信します。おそらく、書き込み直後noopに読み取り、エラーを上方に伝播するように変更するのが最も簡単な方法ですが、パフォーマンスが非常に優れているとは想像できません。しかし、他のスケジューラーの 1 つをベースとして使用する場合、書き込みの直後にエラーを通知するのはおそらくはるかに困難です。おそらく、読み取りが再度スケジュールされるまでに数秒かかるでしょう。事後の診断として有用であり、アプリケーションに直接役立つものではありません。

于 2011-03-21T01:06:16.737 に答える