Linux IO 学习笔记(二)——文件系统读写文件的流程

LInux任督二脉IO课程笔记,微信公众号:Linuxer。

接上篇博客,下面来说第一个问题,VFS是如果打开和读写文件的。

用户读写文件的流程

file->dentry->inode->iops->address_space->disk 的流程:
这里写图片描述
通过struct找到磁盘inode节点对象:
一个进程打开的文件用struct file结构表示,这是VFS可访问的(file中的file_operations)。在file结构中可找到这个文件对应的dentry对象,如果两个进程打开同一个文件,那它们的file就指向同一个dentry。通过dentry就可以找到这个文件对应的inode对象,到了inode就与特定文件系统(如ext3/ext4)相关了,这个inode有读写文件的file_operations。那么,如果一个dentry是另一个dentry的硬链接,那这两个dentry就指向同一个inode对象。

VFS中的通用read/write调用实际文件系统的read/write:
在程序open()一个文件时,inode的file_operations就会被填到供VFS使用的file结构的file_operations,这样实际文件和VFS就建立了联系,就可以开始实际操作这个文件了。

通过address_space接触磁盘:
在open文件之后进行read/write时,读写操作(file_operations)并不是直接跟硬盘交互,而是会经过address_space。每个inode有自己的一个address_space(inode的i_mapping字段),address_space中的address_space_operations(如readpage/writepage/readpages/writepages等)才会跟磁盘打交道进行读写。

address_space是一个基数树(redix tree),它记录inode的内容在page cache中是否命中:在读写文件的时候,先会去查是否在page cache中命中,如果在page cache中命中就不用去读写磁盘了。如果没在page cache中,就会通过address_space_operations去读写磁盘并添加到这个inode的address_space中,这样方便管理且减少和磁盘交互次数。

也就是说,page cache和address_space可认为是同一个东西,这里面可能有脏页,drop_cache和脏页回写都是去找address_space。

每个打开的文件的inode都有其redix树存放它们各自的address_space(也就是它们产生的page cache)。块设备本身也是一个文件(你也可以打开/dev/sda来读写裸设备),块设备的inode存放在block_device里面的bd_inode成员,实际上块设备文件是虚拟的文件系统bdevfs中的一个文件。

address_space的内存管理方式:
接下来,在page cache中又有一个概念“buffer”,page cache中的一个page由若干buffer组成,一个buffer等于文件系统中一个block的大小,加入buffer的概念是为了方便写磁盘时将page转换为block。每个inode都有一个struct buffer_head链表(inode->i_data.private_list),记录了这个inode里产生的page cache里的所有buffer,每个buffer_head元素的b_page指向该buffer位于redix中的哪个page,而b_data成员就是该buffer在page中的位置的指针。我们在内核中就可以通过sb_bread(sb, block_no)得到文件系统中block_no块的数据了。

所以buffer是page cache里面更小的单元,即page cache的redix树记录所有page,每个page又由多个buffer组成。

虽然上层文件系统文件的page cache已经是块设备之上的东西了,但它的page里面仍分成一个个的buffer,一方面文件系统和块设备文件的address_space结构一致方便管理&#x

  • 1
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值