【问题标题】:Accessing buffer data from bio struct in Linux在 Linux 中从 bio 结构访问缓冲区数据
【发布时间】:2013-06-04 15:42:54
【问题描述】:

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

【问题讨论】:

  • 你看过 lwn 吗?谷歌搜索中弹出了一篇不错的文章...lwn.net/Articles/26404
  • 你能找到这方面的一些信息吗?

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


【解决方案1】:

您可以使用 bio_data(struct bio *bio) 函数来访问数据。
从 bio_data 访问数据可能会很麻烦,因为它的返回类型是 void*(所以 %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++;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2015-11-06
    • 1970-01-01
    相关资源
    最近更新 更多