helun 发表于 2009-05-10 18:43

块设备驱动的bio_vec

struct bio_vec{
struct page *bv_page;
unsigned int bv_len;
unsigned int bv_offset;
}
这是bio_vec结构体,看宋宝华的书在介绍块设备驱动时上面一直讲段的概念,看了几遍才明白书上说得段是bio_vec结构体.但是我想问一下,是不是每个段只包含一页吗?可以包含多页吗?由谁指示,是不是由bv_len指明呢?如果包含多个页,那么另外的页是不是和page指向的页相邻,若不是,那这个段又是如何包含多个页呢?
还是这本书在讲DMA时,也一直说段的概念,不过那里的段指的是:scatterlist结构体,和bio_vec非常相似,同样也有上面的问题,可以包含多个页吗?
这是小弟的一点理解不知对不对,请高手不吝赐教。

meijiaxi 发表于 2012-01-06 20:46

我觉得你理解错了。bio_vec的作用是指向内存page中的数据。在其外层为bio数据结构里面定义了对应的块设备磁盘号。
所以我理解bio_vec的作用是实现内存数据和磁盘数据的映射。
在2.4中请求描述符里有bh
2.6换成了bio
看看bh就明白了。bio好处是可以更方便的合并I/O请求

firocu 发表于 2012-12-20 14:30

在struct bio 这个结构了bio_vec实际上是个数组,每个bio_vec 对应一个page,一个bio_vec就是一个segment段。实际上应该是段包含在page里面。
段在page内的起始是bv_offset指定,大小是bv_len.所以对和page可以看成一一对应。

firocu 发表于 2012-12-20 14:32

打错了。。。段和page可以看成一一对应
linux的输入法,无力吐槽了。sogou快来吧。

remaper 发表于 2013-05-22 16:23

本帖最后由 remaper 于 2013-05-22 16:25 编辑

回复 2# meijiaxi


    bio_vec只是描述了一个段,但是没有和disk映射吧。我想知道的是,bio里的bi_sectors是扇区的起始号,bi_size是扇区数。请问是不是所有bio_vec里的扇区数加起来 == 这个bi_size?

换句话说,是不是bio_vec可以是任意的page数组,但是disk上必须是连续的扇区?对吗?

iamlushu 发表于 2014-03-06 07:16

bump u up for 2 points

Hugo801122 发表于 2014-03-08 15:36

很复杂,不太理解!
页: [1]
查看完整版本: 块设备驱动的bio_vec