1.IO子系统
IO子系统即输入/输出子系统,主要由如下几层
- 虚拟文件系统VFS:提供统一的抽象接口
- 文件系统层(含页缓存pagecache):管理磁盘上本文件系统的各种文件和目录,例如ext4/btrfs/xfs等。读文件时如果不在缓存,会构造bio请求提交给通用块层
- 通用块层:Generic Block Layer,对bio请求进行排序、合并优化,形成优化后的request提交给设备驱动层
- 设备驱动层:将请求转换为磁盘控制器识别的命令队列,并通过DMA将数据从磁盘读取到bio指定的页缓存中
2.常见的read操作流程
- 应用层的read走到vfs_read,然后交给文件系统(例如ext4)走read
- 文件系统层检查自己的address_space结构,检查请求的文件数据是否已经在pagecache中,如果命中,则直接取数据,结束;
- 缓存未命中时,先分配一个新的page,并加入pagecache,构造bio请求,填写bi_io_vec,其中的bv_page就指向刚刚分配的页框
- bio请求被提交给块设备层,进行排序/合并优化,最后由磁盘驱动将数据读到bv_page指向的页框中;
- 数据读取完成,此页框驻留在pagecache中,之后再从此页框将数据拷贝到用户空间的缓冲区