0
点赞
收藏
分享

微信扫一扫

linux内核IO子系统分层结构

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中,之后再从此页框将数据拷贝到用户空间的缓冲区
举报

相关推荐

0 条评论