0

我正在研究一个 Linux 内核模块,该模块要求我在将数据写入本地磁盘之前检查数据。要写入的数据是从远程磁盘获取的。因此,我知道 fetch 中的数据存储在页面缓存中。我还知道 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 列表抓取缓冲区的每一块并将它们放在一起,以便我可以获取块的 MD5 哈希。如何使用指向页面的指针、缓冲区的长度及其偏移量来获取缓冲区中的原始数据?是否已经有此功能,还是我必须自己编写?

4

1 回答 1

-1

you can use bio_data(struct bio *bio) function for accessing the data.
Accessing the data from bio_data could be troublesome as its return type is void*(so %S wont work),but it can be successfully tackle by, little type casting.
Following is the piece of code that will do the job:

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 回答