VFS之基本数据结构

本文介绍了Linux内核的虚拟文件系统(VFS)及其核心数据结构,包括超级块、inode节点、dentry目录项和file。VFS作为统一接口管理各种文件系统,并详细阐述了这些数据结构在文件系统操作中的作用,如super_block用于存储文件系统信息,inode保存文件元数据,dentry反映文件系统中的树状关系,file描述文件与进程的交互。
摘要由CSDN通过智能技术生成

文件系统是一种存储和组织计算机中文件数据的一系列抽象数据类型,它们用来实现数据的存储、管理、查看、等功能。在Linux系统中,所有的设备、进程都是以文件的形式存在,字符设备、块设备以及这些设备的驱动均要依靠文件系统来实现,设备管理的基础框架也要以来文件系统(sysfs),所以文件系统在Linux操作系统中担任着重大的作用。

一、VFS介绍

  Linux内核通过虚拟文件系统(Virtual File System,VFS)管理文件系统。VFS对所有的文件系统(如Ext3、Ext2等)提供了一个统一的接口,它在Linux文件系统中担任着及其重要的角色,是一个不可或缺的基础设施;在文件系统的访问操作中,必须通过虚拟文件系统提供的接口才能实现正常的文件操作。同时,在Linux操作系统中,对于所有的文件系统都要遵循虚拟文件系统VFS定义的方式实现。

这里写图片描述
VFS与具体文件系统的关系

VFS支持三种类型的文件系统:基于磁盘的文件系统、特殊的文件系统和网络文件系统。

  • 基于磁盘的文件系统:管理在非易事戒指上存储的文件。这种类型的文件系统最多,比如常见的ext2/3/4、fat、ntfs等。
  • 特殊的文件系统:在内核中生成,是一种使用户应用程序与用户通信的方法,比如常见的proc文件系统,它存储于内存,不占用硬件存储空间。
  • 网络文件系统:这种文件系统可以通过网络访问另一台计算机上的数据,相当于连接到本地计算机一样。比如nfs文件系统。

二、VFS基本数据结构

VFS通用文件模型包含有4种基本的数据结构,通过这几个数据结构实现将硬盘上的文件抽象到内存中:

  • 超级块
  • 目录项
  • 索引节点
  • 文件

这四个数据结构的关系如图所示:

这里写图片描述

2.1. 超级块(super-block)

超级块代表了整个文件系统本身。Super_block保存了Linux文件系统设定的操作函数还有文件块的大小等信息;super_block是文件系统自己的控制块结构,它的链表头链接来文件系统中的所有inode。由于控制块对于一个具体的文件系统来说,有可能还包含其它的信息;想要找到这些信息,我们就可以通过超级块super_block对象进行查找。

由于超级块super_block是具体物理文件系统super_block超级块在内存的抽象,因而需要物理文件系统的超级块来获取超级快的内容。

super_operations 提供了最重要的超级块操作。例如super_operation 的成员函数read_inode提供了读取inode 信息的功能。VFS虚拟文件系统提供了文件系统的架构,具体的物理文件系统就要遵循这个定义好的架构来实现。Super_operations函数是每个文件系统都要提供的一个函数,因为要通过它来获取inode的信息。

struct super_block {
struct list_head    s_list;  /* 指向超级块链表的指针,系统将所有文件系统的超级块组成链表 */
dev_t    s_dev;  /* 设备标识符 */
unsigned long    s_blocksize;   /* 以字节为单位的块大小 */
unsigned char    s_blocksize_bits;   /* 以位为单位的块大小 */
unsigned char    s_dirt;     /* 修改脏标志 */
loff_t   s_maxbytes;    /* Max file size */
struct file_system_type *s_type;
const struct super_operations   *s_op;   /* 超级块操作方法 */
const struct dquot_operations   *dq_op;  /* 磁盘限额处理方法 */
const struct quotactl_ops   *s_qcop;     /* 磁盘限额管理方法 */
const struct export_operations *s_export_op;    /* 网络文件系统使用的输出操作 */
unsigned long    s_flags;   /* 安装标志 */
unsigned long    s_magic;   /* 文件系统的魔数 */
struct dentry    *s_root;   /* 文件系统根目录的目录项对象 */
struct rw_semaphore s_umount;   /* 卸载所用的信号量 */
struct mutex     s_lock;
int  s_count;    /* 引用计数器 */
int  s_need_sync;   /* 对超级块进行同步的标志 */
atomic_t     s_active;
#ifdef CONFIG_SECURITY
void                    *s_security;
#endif
struct xattr_handler    **s_xattr;
struct list_head    s_inodes;   /* all inodes的链表 */
struct hlist_head   s_anon;  /* anonymous dentries for (nfs) exporting */
struct list_head    s_files;    /* 文件对象链表 */
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值