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