2013-06-04 31 views
0

我正在研究一個Linux內核模塊,它需要我在將數據寫入本地磁盤之前檢查數據。要寫入的數據從遠程磁盤獲取。因此,我知道來自提取的數據存儲在頁面緩存中。我也知道Linux有一個數據結構來管理飛行中的塊I/O請求,稱爲生物結構。在Linux中訪問生物結構中的緩衝區數據

生物結構包含名爲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

你看過lwn嗎?有一篇不錯的文章在Google搜索中彈出... http://lwn.net/Articles/26404/ – granquet

+0

你能找到關於此的一些信息嗎? – aminfar

回答

-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++; 
}