通用块层的核心数据结构称为bio描述符,它描述了块设备的io操作。每一个bio结构都包含一个磁盘存储区标识符(存储区中的起始扇区号和扇区数目)和一个或多个描述与IO操作相关的内存区段(bio_vec数组)

bio结构中的字段

struct bio {sector_t bi_sector; //要传输的第一个扇区。struct bio *bi_next;  //链接到请求队列的下一个biostruct block_device *bi_bdev;//指向块设备描述符的指针unsigned long bi_flags; //bio的状态标志unsigned long bi_rw;//IO操作标志 READ/WRITE     unsigned short bi_vcnt; //bio中的bio_vec数组中当前元素的个数unsigned short bi_idx; //bio的bio_vec数组中段的当前索引值unsigned int bi_phys_segments; //合并后bio中的物理段的数目unsigned int bi_size;  //所需传输的数据字节数unsigned int bi_seg_front_size;unsigned int bi_seg_back_size;unsigned int bi_max_vecs; //bio的bio_vec数组中允许的最大段数unsigned int bi_comp_cpu; /* completion CPU*/atomic_t bi_cnt; //bio引用计数器struct bio_vec *bi_io_vec; /* the actual vec list*/bio_end_io_t *bi_end_io;//bio的IO操作结束时调用的方法void *bi_private;//通用块层和块设备驱动程序的IO完成方法使用的指针bio_destructor_t *bi_destructor; //释放bio时调用的析构方法};

bio中的每个段是由一个bio_vec数据结构描述的,bio_vec数据结构如下

bio_vec{struct page* bv_page //指向段在页框描述符的指针unsigned int bv_len //段的字节长度unsigned int bv_offset //页框中数据的偏移量
} 
bio中的bi_io_vec字段指向bio_vec数组的第一个元素,bi_vcnt则说明了数组当前元素的个数,而bi_max_vecs则限定了数组的长度。
下面两幅图可以很好的说明bio与bio_vec的关系

在通用块层启动一次新的IO操作时,会调用bio_alloc函数分配一个新的bio结构,bio是由slab分配器分配的。内核同时也为bio_vec结构分配内存池。

bio与bio_vec相关推荐

  1. 木其工作室(专业程序代写服务)[转]学写块设备驱动(三)----踢开IO调度器,自己处理bio(下)...

    优质代写程序 代写Assignment程序 定制软件 设计程序 专业代写IT 大学生程序代写 踢开IO调度器很容易,即不使用__make_request 这个系统指定的强力函数,如何不使用?其实我们从 ...

  2. Linux 块设备之bio结构体

    当文件系统准备好数据之后,就会调用submit_bio提交一个IO请求,这里主要介绍bio数据管理和分配. 1. bio数据结构 这里列举重要的数据结构: struct bio { sector_t  ...

  3. BLOCK层代码分析(1)数据的组织BIO

    对于BLOCK层,表示一个IO的数据结构为BIO和request.对于request在后续的章节中做介绍,这里只介绍与BIO相关的结构体. 1. bio/bio_vec结构体 bio结构体用于表示数据 ...

  4. 块设备驱动、bio理解

    别人写过的内容,我就不写了.贴一下大佬的博客,写的非常好: 块设备驱动实战基础篇一 (170行代码构建一个逻辑块设备驱动) 块设备驱动实战基础篇二 (继续完善170行过滤驱动代码至200行) 块设备驱 ...

  5. Linux文件系统之文件的读写

    ------------------------------------------ 本文系本站原创,欢迎转载! 转载请注明出处:http://ericxiao.cublog.cn/ -------- ...

  6. 有点意思!Linux 块设备处理模型,基础【簇、柱面、存储的计算】

    http://blog.csdn.net/zplove003/article/details/7020557 簇:簇是指可分配的用来保存文件的最小磁盘空间,扇区是磁盘最小的物理存储单元,但由于操作系统 ...

  7. 转载:谢谢原作者: 块设备驱动实战基础篇二 (继续完善170行过滤驱动代码至200行)

    1.3块设备驱动关键数据结构及函数API详细剖析 经过上节四个步骤我们已经熟悉并实战了一个最基本的过滤块设备驱动的设计技巧,我们这一节先不继续实战,我们本节把上节170行代码中接触到的块设备核心数据结 ...

  8. Linux块层技术全面剖析-v0.1

    Linux块层技术全面剖析-v0.1 perftrace@gmail.com 1     前言 网络上很多文章对块层的描述散乱在各个站点,而一些经典书籍由于更新不及时难免更不上最新的代码,例如关于块层 ...

  9. linux中流设备_[快速上手Linux设备驱动]之块设备驱动流程详解一

    [快速上手Linux设备驱动]之块设备驱动流程详解一 walfred已经在[快速上手Linux设备驱动]之我看字符设备驱动一 文中详细讲解了linux下字符设备驱动,并紧接着用四篇文章描述了Linux ...

最新文章

  1. php400错误的请求,Wordpress中的Ajax返回400错误请求,但不确定如何进一步调试 - WordPress - srcmini...
  2. 用户看法调查结果及分析(四)
  3. matlab c++ 画图【转载】
  4. 优化案例 | CASE WHEN进行SQL改写优化
  5. 如何在Ruby中编写switch语句
  6. sonar不支持mysql_sonar-iOS的实践
  7. How to manage concurrency in Django models
  8. java集合for循环_详解Java中list,set,map的遍历与增强for循环
  9. 50行python代码自动生成文章_如何通过50行Python代码获取公众号全部文章
  10. mysql可靠性优先策略
  11. c++ 11 新特性之 左值右值
  12. Halcon深度学习总结
  13. watir_WatirMaker简介-录制基于Ruby的Watir
  14. 未来测试软件推荐,未来函数检测工具优化版(支持所有股软未来检测)
  15. 一步步教你搭建自己的云服务器,(鉴于网上一大堆文章,看这一篇就够了)
  16. html中样式属性有哪些,css字体样式属性有哪些?
  17. 抗变态或亲变态是更好的解决方案
  18. VB计算汉字笔画数代码
  19. Asp连接数据库时的问题Microsoft OLE DB Provider for ODBC Drivers error ‘80004005‘
  20. 混合颜色的色值计算公式

热门文章

  1. 融资数据采集以及分析风险投资数据
  2. 第五章 spring-context之LifecycleProcessor( 生命周期 )
  3. html中键盘分别对应的值,电脑键盘键值所对应的功能详解
  4. maven系列:maven依赖讲解
  5. 神经元的细胞体有什么用,神经元细胞和神经细胞
  6. c#图片base64去转义字符_c#中图片与base64互相转换
  7. 【阶段一】java之面向对象上
  8. 用于高精度干涉仪的奇特量子效应
  9. 本地电脑怎么连接mysql_本地电脑无法连接到MySQL
  10. codeforces C. Ehab and Path-etic MEXs