Linux Block IO I

块IO子系统上承文件系统,下启SCSI等具体的存储设备子系统,对下层的诸多设备进行统一的抽象,以向上提供统一的块存储视图,同时,也使得deviceMapper,RAID等模块的设计变得容易。在内核IO路径中,块IO子系统到交通枢纽的作用,其在内核中的相对位置如下

对上,Block子系统位于文件系统层的下方,通过bdev伪文件系统管理系统中的所有磁盘抽象,使得其他文件系统等访问接口可以找到一个磁盘的抽象

对下,为具体的存储设备提供通用的服务,包括磁盘和分区抽象、IO请求优化、重映射等。

就块设备本身来说,可以分为三层

  1. 通用块层位于最上,对存储设备的设备和分区进行文件系统可用的抽象
  2. IO调度层位于中间,负责对上层下发的IO的合并优化等工作,提供NOOP,CFQ,DeadLine,Anticipatory 4种IO调度器
  3. 块设备驱动层,将通用块设备作为操作对象的”驱动”,MultiDisk子系统就是工作在这一层。

在内核源码中,块IO子系统的文件主要分布在block/目录下,相关文件的简介如下:

filedescription
include/linux/genhd.h通用块层,封装了gendisk、hd_struct等对象,对所有的设备进行统一的抽象,io下发必须经过这一层,在设备初始化的时候被构造进内核
block/genhd.cregister_blkdev
include/linux/blk_types.hbio定义和相关宏
include/linux/blkdev.hrequest、request_queue及其在block设备上的操作方法
block/blk-core.cblkdev.h ->blk-core.c
include/linux/fs.hinode,file,super_block,file_operations以及block_device的定义
fs/block_dev.c块设备和文件系统的接口部分,eg,bdev文件系统
block/partition-generic.c分区partition的相关操作
block/blk-merge.c和include/linux/elevator.h block/elevator.c一同构成了通用块层到块核心层的边界
blk-sysfs.c封装了块设备在sysfs中输出的信息
blk-setting.c封装了对块设备进行设置(队列深度,DMA地址)的方法
block/bio.h、block/bio.cbio操作函数
include/linux/blk-mq.h、block/blk-mq.c与MultiDisk子系统相关的操作
block/blk-lib.c封装了一下helper类的函数
block/blk-flush.c封装了下刷request相关函数

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.