在Linux中访问bio struct的缓冲区数据

时间:2013-06-04 15:42:55

标签: linux linux-kernel page-caching block-device

我正在研究Linux内核模块,它要求我在将数据写入本地磁盘之前检查数据。要写入的数据是从远程磁盘获取的。因此,我知道来自fetch的数据存储在页面缓存中。我也知道Linux有一个数据结构来管理飞行中的块I / O请求,称为bio struct。

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哈希值。如何使用指向页面的指针,缓冲区的长度及其偏移量来获取缓冲区中的原始数据?是否已有此功能,还是我必须自己编写?

1 个答案:

答案 0 :(得分:-1)

您可以使用 bio_data(struct bio * bio)功能来访问数据。
从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++;
}