Linux カーネルを変更していて、データのカーネル ソース ブロックが ubd0 などのディスク パーティションに物理的に書き込まれている場所を見つけようとしています。これはカーネルソースのどこで発生しますか? 実際の物理的な書き込み呼び出し? 私はこれを見つけることができません。ありがとう!
編集: 最終目標は、いくつかの異なるパーティションに書き込まれたブロック番号のリストです。データがリストに物理的に書き込まれると、書き込まれたブロック番号が返されて保持されます。
Linux カーネルを変更していて、データのカーネル ソース ブロックが ubd0 などのディスク パーティションに物理的に書き込まれている場所を見つけようとしています。これはカーネルソースのどこで発生しますか? 実際の物理的な書き込み呼び出し? 私はこれを見つけることができません。ありがとう!
編集: 最終目標は、いくつかの異なるパーティションに書き込まれたブロック番号のリストです。データがリストに物理的に書き込まれると、書き込まれたブロック番号が返されて保持されます。
これは、特定のドライバーとデバイスの種類によって異なります。SCSI デバイスの場合、SCSI コマンドはデバイス ドライバに送られます。それらは SCSI レイヤーで生成され、デバイスのドライバーによってデバイスに送信され、次にデバイスに送信されます。
データがデバイスにプッシュされるまで、sys_write システム コールからかなりの部分が抽象化されており、デバイス ドライバ自体は、書き込みを行っていることさえ認識していない可能性があります。
編集については、blktrace をご覧ください: http://linux.die.net/man/8/blktrace
わかりました、別の答えです。あなたはこれをもっと好きになるでしょう。これは generic_make_request で発生します。コメントは非常にわかりやすいです: http://lxr.linux.no/#linux+v2.6.32/block/blk-core.c#L1380
ここに表示されるその関数の bio 構造体: http://lxr.linux.no/#linux+v2.6.32/include/linux/bio.h#L58
これは、デバイスに送られるもののリストです。
q->make_request_fn(q, bio); デバイス自体への実際の関数ポインタ呼び出しです。
http://lxr.linux.no/#linux+v2.6.32/include/linux/types.h#L126
パーティションへの書き込みにインデックスがどのように使用されるかを示します。これは書き込みだけに使用されるわけではないことに注意してください。
この特定の車輪をゼロから発明したい場合は、リクエスト キュー機能を利用します。たとえば、キューに入るリクエストを記録するには、コードをsubmit_bio()
.
キュー出口でフックするのに最適な場所がわかりません。おそらくelv_next_request()
、古いカーネルまたはblk_start_request()
新しいカーネルで。