- 論壇徽章:
- 0
|
看了LKM,了解到:
每一次塊I/O請(qǐng)求都通過(guò)一個(gè) bio結(jié)構(gòu)體表示。每個(gè)請(qǐng)求包含一個(gè)或多個(gè)塊,這些塊存儲(chǔ)在bio_vec結(jié)構(gòu)數(shù)組中,bio_vec結(jié)構(gòu)如下:
struct bio_vec{
/* 指向段的頁(yè)框中頁(yè)描述符的指針*/(不知道是不是就是數(shù)據(jù)的首地址???)
struct page *bv_page;
/* 段的字節(jié)長(zhǎng)度*/
unsigned int bv_len;
/* 頁(yè)框中段的偏移量*/
unsigned int bv_offset;
};
那么我可以通過(guò)什么方式取得這些塊的數(shù)據(jù)呢?
我參考了前面OstrichFly兄的《寫(xiě)一個(gè)塊設(shè)備驅(qū)動(dòng)》一文。我像可能可以,利用bio_for_each_segment()這個(gè)宏
用類似如下代碼:(我前面發(fā)了一次的,但是還是很混亂,就上來(lái)再問(wèn)次,各位見(jiàn)諒)
int j;
void *iovec_mem, *dsk_mem;
struct bio_vec *bvec;
bio_for_each_segment(bvec,mbio, j)
{
printk("get %d bytes data\n", bvec->bv_len);
iovec_mem = kmap(bvec->bv_page) + bvec->bv_offset; //這句不知道是不是對(duì)頁(yè)描述符的拷貝還是具體的頁(yè)內(nèi)容的拷貝?
memcpy(dsk_mem, iovec_mem, bvec->bv_len);
kunmap(bvec->bv_page);
printk("Data: %s",(char *)dsk_mem);
}
多謝指點(diǎn)! |
|