- 论坛徽章:
- 0
|
看了LKM,了解到:
每一次块I/O请求都通过一个 bio结构体表示。每个请求包含一个或多个块,这些块存储在bio_vec结构数组中,bio_vec结构如下:
struct bio_vec{
/* 指向段的页框中页描述符的指针*/(不知道是不是就是数据的首地址???)
struct page *bv_page;
/* 段的字节长度*/
unsigned int bv_len;
/* 页框中段的偏移量*/
unsigned int bv_offset;
};
那么我可以通过什么方式取得这些块的数据呢?
我参考了前面OstrichFly兄的《写一个块设备驱动》一文。我像可能可以,利用bio_for_each_segment()这个宏
用类似如下代码:(我前面发了一次的,但是还是很混乱,就上来再问次,各位见谅)
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; //这句不知道是不是对页描述符的拷贝还是具体的页内容的拷贝?
memcpy(dsk_mem, iovec_mem, bvec->bv_len);
kunmap(bvec->bv_page);
printk("Data: %s",(char *)dsk_mem);
}
多谢指点! |
|