块设备驱动的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非常相似,同样也有上面的问题,可以包含多个页吗?
这是小弟的一点理解不知对不对,请高手不吝赐教。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我觉得你理解错了。bio_vec的作用是指向内存page中的数据。在其外层为bio数据结构里面定义了对应的块设备磁盘号。
所以我理解bio_vec的作用是实现内存数据和磁盘数据的映射。
在2.4中请求描述符里有bh
2.6换成了bio
看看bh就明白了。bio好处是可以更方便的合并I/O请求
在struct bio 这个结构了bio_vec实际上是个数组,每个bio_vec 对应一个page,一个bio_vec就是一个segment段。实际上应该是段包含在page里面。
段在page内的起始是bv_offset指定,大小是bv_len.所以对和page可以看成一一对应。
打错了。。。段和page可以看成一一对应
linux的输入法,无力吐槽了。sogou快来吧。
本帖最后由 remaper 于 2013-05-22 16:25 编辑
回复 2# meijiaxi
bio_vec只是描述了一个段,但是没有和disk映射吧。我想知道的是,bio里的bi_sectors是扇区的起始号,bi_size是扇区数。请问是不是所有bio_vec里的扇区数加起来 == 这个bi_size?
换句话说,是不是bio_vec可以是任意的page数组,但是disk上必须是连续的扇区?对吗?
bump u up for 2 points
很复杂,不太理解!