Xenセットアップでは、ゲストVMからのIOアクセスは、XENハイパーバイザーとの間で呼び出しを行う変更されたLinuxカーネルであるdom0と呼ばれる特権ドメインを経由します。ブロックIOの場合、フロントエンドがゲストVMにあり、ドライバーのバックエンドがdomain0にある分割ドライバーモデルがあります。バックエンドは、従来のLinuxブロックドライバーコードと同様に、「bio」構造を作成し、submit_bio()を呼び出します。
ここでの私の目標は、ディスクに書き込まれるデータに問題があるかどうかを確認することです(データの損失、サイレントに破損した書き込み、誤った方向の書き込みなど)。したがって、ディスクに書き込まれたデータを読み取り、それをキャッシュ上のデータのコピーと比較する必要があります(これは「書き込み後の読み取り」と呼ばれる一般的なディスク関数です)。私の質問は、バックエンドドライバーレベルから__bread()を呼び出すことはできませんか?__breadが呼び出されると、カーネルがクラッシュします。この理由を誰かが理解できますか?また、これが不可能な場合、ドライバーの下半分にあるディスクから特定のデータブロックを読み取るために他にどのような方法がありますか?
書き込みのバイオ構造をインターセプトしてクローンを作成し、新しいバイオで読み取った操作を変更して、submit_bio()を再度呼び出すことはできますか?私はそれを行いましたが、submit_bio()の完了コールバックによって返されるバイオ構造のセクター番号はランダムな値であり、送信したものではありません。
ありがとう。