0

ローカル ディスクに書き込む直前にデータをチェックする必要がある Linux カーネル モジュールに取り組んでいます。書き込むデータは、リモート ディスクからフェッチされます。したがって、フェッチからのデータがページ キャッシュに格納されていることがわかります。また、Linux には、実行中のブロック I/O 要求を管理する bio 構造体と呼ばれるデータ構造があることも知っています。

bio 構造体には、bio_vecs と呼ばれる構造体のリストが含まれています。

struct bio_vec { 

/* pointer to the physical page on which this buffer resides */ 
struct page *bv_page;

/* the length in bytes of this buffer */ 
unsigned int bv_len;

/* the byte offset within the page where the buffer resides */ 
unsigned int bv_offset;
};

メモリ内のブロック表現は物理的に連続していない可能性があるため、これらのリストがあります。私がやりたいことは、bio_vecs のリストを使用してバッファーの各部分を取得し、それらを 1 つにまとめて、ブロックの MD5 ハッシュを取得できるようにすることです。ページへのポインター、バッファーの長さ、およびそのオフセットを使用して、バッファー内の生データを取得するにはどうすればよいですか? これには既に関数がありますか、それとも自分で作成する必要がありますか?

4

1 に答える 1

-1

データにアクセスするには、 bio_data(struct bio *bio)関数を使用できます。
戻り値の型が void* であるため、bio_data からデータにアクセスするのは面倒かもしれませんが (そのため、%S は機能しません)、少し型をキャストするだけで問題なく処理できます。
以下は、ジョブを実行するコードの一部です。

char *ptr;
ptr=(char *)bio_data(bio);
for(i=0;i<4096;i++)  //4096 as bio is going to be in 4kb chunk
{
   printk("%c",*ptr);
   ptr++;
}
于 2014-02-16T13:13:08.373 に答える