6

Linux カーネルを変更していて、データのカーネル ソース ブロックが ubd0 などのディスク パーティションに物理的に書き込まれている場所を見つけようとしています。これはカーネルソースのどこで発生しますか? 実際の物理的な書き込み呼び出し? 私はこれを見つけることができません。ありがとう!

編集: 最終目標は、いくつかの異なるパーティションに書き込まれたブロック番号のリストです。データがリストに物理的に書き込まれると、書き込まれたブロック番号が返されて保持されます。

4

3 に答える 3

1

これは、特定のドライバーとデバイスの種類によって異なります。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

パーティションへの書き込みにインデックスがどのように使用されるかを示します。これは書き込みだけに使用されるわけではないことに注意してください。

于 2010-04-12T02:23:18.393 に答える
0

この特定の車輪をゼロから発明したい場合は、リクエスト キュー機能を利用します。たとえば、キュ​​ーに入るリクエストを記録するには、コードをsubmit_bio().

キュー出口でフックするのに最適な場所がわかりません。おそらくelv_next_request()、古いカーネルまたはblk_start_request()新しいカーネルで。

于 2010-04-12T14:55:14.293 に答える
0

これはデバイス ドライバー内にあり、通常は DMA 転送と I/O 完了を通知する割り込みの組み合わせによって行われます。これらは、特定のハードウェア デバイスごとに異なります。シンプルなフロッピーでこれがどれほど複雑になるかについては、こちらをご覧ください。

編集:

IO スケジューラコードを調べます。

于 2010-04-12T02:29:29.207 に答える