块设备是一种能随机访问的存储介质,与字符设备不同,块设备能够保存文件系统数据。
linux块IO层
存储介质包含了驻留于文件系统中的文件,用户应用程序唤醒IO系统调用来访问这些文件,相关文件系统操作在到达各自文件系统驱动程序前,会先经过通用VFS(virtual file system)虚拟文件系统,高速缓冲区通过缓冲磁盘块来加速文件系统对块设备的访问。如果能够再高速缓冲区中找到块,就可以通过访问磁盘读取块的时间。每个块设备指定的数据在请求队列中排队。文件系统驱程序将请求加入指定块设备的请求队列,同时块驱动程序从相应的队列中取出请求。在这期间,IO调度器操控请求队列,是硬盘访问延时最小,同时吞吐量最大。
用户空间
文件io
内核空间
VFS层
单个文件系统(EXT3,EXT4,JFFS2,VFAT)
缓冲区高速缓存(页面缓存)
IO调度
‘块驱动程序
存储媒介
磁盘
gendisk include/linux/genhd.h 代表一个磁盘
bio include/linux/bio.h 块IO操作的底层描述
内核编程
register_blkdev() block/genhd.c 向内核注册一个块驱动程序
unregister_blkdev() block/genhd.c 从内核注销一个块驱动程序
rq_for_each_bio() include/linux/blkdev.h 遍历每个请求的bio
end_request() block/ll_rw_blk.c 结束一个请求