Linux内核原理之虚拟文件系统(中)

本文详细介绍了Linux内核的虚拟文件系统(VFS)架构,包括VFS的对象和数据结构,如超级块、inode对象、目录项缓存和文件对象。阐述了这些对象的作用、数据结构和操作方法,如超级块对象的s_op指针、inode对象的i_op和i_fop指针,以及目录项缓存的dentry结构和缓存管理。还讨论了特定于进程的信息,如fs_struct、files_struct和命名空间管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VFS对象及数据结构

VFS的四个对象类型:

  • 超级块对象:代表具体的文件系统
  • 索引节点对象:代表具体文件
  • 目录项对象:代表目录项,是路径的一个组成部分
  • 文件对象:代表进程打开的文件

注意:VFS将目录作为一个文件来处理,不存在目录对象;目录项不同于目录

每个对象中都包含一个操作对象,其中描述了内核针对主要对象可以使用的方法

  • super_operations对象:内核针对特定文件系统调用的方法,如write_inode(), sync_fs()
  • inode_operations对象:内核针对特定文件调用的方法,如create(), link()
  • dentry_operations对象:内核针对特定目录项所能调用的方法,如d_compare(), d_delete()
  • file_operations对象:进程针对已打开文件所能调用的方法,如read(), write()

注意:操作对象作为结构体,其中包含操作父对象的函数指针,实际的文件系统可以继承VFS提供的通用函数。

超级块

各种文件系统都必须实现超级块对象,该对象存储特定文件系统的信息,对应于存放在磁盘特定扇区中文件系统超级块或者文件系统控制块。(非基于磁盘的文件系统,会在使用现场创建超级块并保存在内存中)

  1. 超级块结构super_block

主要成员:

  • s_dirty:脏inode的链表,在同步内存数据和底层存储介质时,使用该链表更加高效
  • s_files:包含一系列file结构,列出了该超级块表示的文件系统所有打开的文件,内核在卸载文件系统时会参考该链表
  • s_dev和s_bdev指定了底层文件系统的数据所在的块设备,前者使用了内核内部编号,后者指向block_device结构
  • s_root:用于检查文件系统是否装载,如果为NULL,该文件系统是一个伪文件系统,只在内核可见,否则,在用户空间可见

注意:超级块对象通过alloc_super()函数创建并初始化,在安装文件系统时,文件系统会调用这个函数从磁盘读取文件系统超级块,并将其中的数据填充到内存中的超级块对象对应的结构体中。

  1. 超级块操作

    超级块对象中s_op指针,指向超级块的操作函数表,由super_operations()表示,如下图:

该结构中的操作会控制底层文件系统实现获取和返回inode的方法,不会改变inode的内容

inode对象

索引节点对象:包含内核在操作文件系统或者目录时需要的全部信息(对于Unix风格的系统,直接从磁盘的索引节点读入),索引节点对象必须在内存中创建

inode的结构如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值