通用块层学习3 一些基本概念和关系图

bio:由于每次用户读写的数据可能不在相邻的扇区,所以每次读写可能会分成很多个bio,每个bio对应的扇区相邻。
request:为甚要有bio。大家买热水器,一个小区的属于相邻扇区,送货的时候会把一个小区里面的集中一起配送。所以新的bio和老的bio如果相邻,则放在一个request里面,根据复杂算法和调度策略插入到一个合适的位置;如果不相邻,对不起,则创建新的request插到request_queue的队尾。
bio_alloc相当于填写申请表,一开始填写申请的只是填写自己的。
generic_make_request排队的时候发现很多邻居乡亲也在排队买,那就不客气了,插个队就不好意思,把自己的申请写在一个小区邻居的表里面,送的话一起送就可以了。
分区:送货分东西城,海淀朝阳和别的区,写申请表的时候用。但是北京办事处作为整个盘最后会集中统一处理。所以对于北京送货(调度策略)也是一样的。

scatter/gather:对应1个bio,对应的磁盘扇区是连续的,但是内存数据不一定连续,有利于DMA的开展。由于扇区连续,DMA移动磁头连续。

gendisk:整个磁盘
BLOCK:分区和磁盘都可以认为是BLOCK。

段的大小不固定。1个段就是1个内存页或者内存页的一部分。他们包含的数据在扇区是连续的。一次DMA可以传输多个段。这些段的数据在磁盘要求连续。
open
||
\/
block
||
\/
分区
||
\/
gendisk

如下图片选自 深入理解Linux内核
通用块层学习3 一些基本概念和关系图

通用块层学习3 一些基本概念和关系图

通用块层学习3 一些基本概念和关系图