[IO系统]13 通用块层-向通用块层提交IO

Posted YoungerChina

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[IO系统]13 通用块层-向通用块层提交IO相关的知识,希望对你有一定的参考价值。

        前面介绍了块设备的相关概念、 buffer_head和bio结构体。接下来主要分析如何向通用块层提交IO。

1.1   分配bio

        当向通用块层提交一个IO操作请求的时候,假设被请求的数据块在磁盘上是相邻的,并且内核要已经知道了他们的物理位置。那么首先第一步就是执行bio_alloc()函数        分配一个新的bio描述符,然后内核通过设置一些字段的值来初始化bio描述符。该函数主要做的工作如下:

        .将bi_sector字段设置为数据的起始扇区号(如果块设备被分成了几个分区,那么扇区号是相对于分区的起始位置)。

        .将bi_size字段设置为涵盖整个数据的扇区数目。

        .将bi_bdev设置为块设备描述符的地址(这个是block_device的对象,代表的是一个分区或者是主设备)。

        .将bi_io_vec设为bio_vec结构数组的其实地址,数组中的每个元素描述了io操作中的一个段(内存缓存),此外,将bi_vcnt设置为bio中总的段数。

        .将bi_rw字段设置为被请求的操作的标志。

        .将bi_end_io字段设置成为当bio上的IO操作完成时所执行的完成程序的地址。

 

1.2   提交bio

        generic_make_request()函数会接手一个已经基本初始化好的bio,并使用make_request_fn将请求置于驱动程序的请求队列上。即把该bio传给设备对应的驱动程序。

blk_qc_t generic_make_request(struct bio *bio)

以上是关于[IO系统]13 通用块层-向通用块层提交IO的主要内容,如果未能解决你的问题,请参考以下文章

IO通用块层中的block

IO通用块层中的block

磁盘 分区 lvm之间await util的统计关系

CGroup系列四blkio 子系统

高级程序员进阶:了解Linux I/O 调度器,优化系统性能

linux基础——磁盘I/O