Linux虚拟文件系统(VFS)

虚拟地址空间通常是与进程密切相关的概念,而不是文件系统。虚拟地址空间是为了提供进程对内存的抽象和隔离而设计的。

文件系统不使用页表,直接使用物理地址。

虚拟文件系统是linux内核的一个核心子系统。、

虚拟文件系统的目的:通过一个抽象层,存储设备使用不同的文件系统都可以通过相同的接口访问:open(),red(),write();
在这里插入图片描述

文件系统抽象层

linux能支持各种文件系统,就是因为有文件系统抽象层。
调用过程:write(fd,buf,len);
用户空间write()->虚拟文件系统sys_write()->硬件的文件系统的写方法——>物理介质

Unix文件系统

Unix使用了四种文件系统的抽象概念:文件,目录项,索引节点和安装点(mount point)。
在Unix中,目录属于普通文件,它列出包含在其中的所有文件。

inode和元数据

Unix把文件的相关信息和文件本身这两个概念加以区分,已经是说,文件的元数据(控制权限,大小,创建者。。)被存储在一个单独的数据结构中,该结构被称为索引节点(inode:index node的缩写)。

将元数据和实际数据分开存储是一种思想

Unix文件系统,在物理磁盘布局中也是按照这种思想实现的,在磁盘上,文件(目录也是文件)的元数据存储在单独的几个块中(按照索引顺序)。
控制信息被集中存储在磁盘的超级块中。

VFS对象及数据结构

VFS采用的是面向对象。使用一组数据结构来代表通用文件对象。
VFS主要有四个对象类型:

  1. 超级块对象,它代表一个已安装的文件系统
  2. 索引节点对象,它代表一个具体文件(可以是目录文件)。
  3. 目录项对象,目录项。
  4. 文件对象,有对象打开的文件。
    每个数据结构其中都包含操作函数(以函数指针的形式存储在数据结构中)。

超级块对象

每个文件系统都必须实现超级块对象,存储文件系统的信息,通常对应于存放在磁盘特定扇区中的文件系统超级块。不基于磁盘的文件系统,会在使用时动态创建超级块。

struct super_block {/* 文件系统特定的信息和操作 */const struct super_operations  *s_op;  // 文件系统特定的超级块操作struct dquot_operations        *dq_op; // 磁盘配额操作struct quotactl_ops            *s_qcop; // 磁盘配额控制操作const struct export_operations *s_export_op; // 导出操作/* 与文件系统相关的全局信息 */unsigned long           s_flags;      // 超级块标志const char              *s_id;         // 文件系统的唯一标识符unsigned int            s_blocksize;   // 块大小unsigned char           s_blocksize_bits; // 块大小的位数unsigned char           s_dirt;        // 超级块的脏标志int                     s_count;       // 超级块的引用计数atomic_t                s_active;      // 超级块的活跃引用计数struct hlist_head       s_inode_lru;   // 超级块关联的Inode的LRU链表头struct list_head        s_list;        // 全局超级块链表struct list_head        s_instances;   // 文件系统实例链表/* 与文件系统类型相关的信息 */const struct file_system_type *s_type; // 文件系统类型const struct fs_context_operations *s_fs_info; // 文件系统信息struct fscrypt_info    *s_cop; // 文件系统加密信息/* 与底层存储介质相关的信息 */struct block_device    *s_bdev; // 超级块对应的块设备struct backing_dev_info *s_bdi; // 超级块的后备设备信息/* 文件系统挂载点的信息 */struct mtd_info        *s_mtd; // 关联的Memory Technology Device(MTD)信息struct gendisk         *s_disk; // 关联的块设备信息struct hlist_head      s_dentry_lru; // 超级块关联的Dentry的LRU链表头/* 其他字段和操作省略... */
};

索引节点对象:存储文件的元数据

内核是根据索引节点对象的信息来操作文件的。
对于Unix风格的文件系统,这些信息可以从磁盘读入。没有索引对象信息,则需要现场创建。

struct inode {umode_t               i_mode;      // 文件的权限和类型unsigned short        i_opflags;   // 操作标志kuid_t                i_uid;       // 文件的用户标识符kgid_t                i_gid;       // 文件的组标识符dev_t                 i_rdev;      // 设备文件的设备号loff_t                i_size;      // 文件大小struct timespec       i_atime;     // 最后访问时间struct timespec       i_mtime;     // 最后修改时间struct timespec       i_ctime;     // 最后状态改变时间struct super_block   *i_sb;        // 超级块指针const struct inode_operations *i_op; // Inode 操作struct file_operations *i_fop;     // 文件操作struct address_space *i_mapping;    // 地址空间对象:即文件的内存中的位置信息unsigned long         i_ino;       // 文件的 inode 号atomic_t              i_count;     // 引用计数unsigned int          i_flags;     // Inode 标志struct list_head      i_wb_list;   // 写回列表struct list_head      i_lru;       // LRU 列表struct list_head      i_sb_list;   // 超级块链表struct hlist_node     i_hash;      // Inode hash 链表struct dquot          *i_dquot[MAXQUOTAS]; // 磁盘配额struct file_lock      *i_flock;     // 文件锁unsigned long         i_state;      // Inode 状态struct mutex          i_mutex;     // Inode 互斥锁struct rw_semaphore   i_alloc_sem;  // Inode 分配信号量// 其他字段和操作省略...
};

一个索引节点也可以代表设备或者管道这样的特殊文件。

目录项对象:在磁盘中没有对应的数据结构

目录项对象就是为了方便查找操作而引入的,真正操作文件还需要inode对象。
VFS根据字符串形式的路径名现场创建它,其没有真正保存在磁盘上,所以目录项结构体没有是否被修改的标志(不需要写回磁盘)。

文件对象

表示进程已打开的文件。进程直接处理的是文件对象。
文件是已打开的文件在内存中的表示。该对象由open()系统调用创建,由close()系统调用撤销。
文件对象只在进程层面表示已打开的文件,但其指向的对应的索引节点和目录项对象是唯一的。

struct file {struct file_operations *f_op;    // 文件操作函数指针集合loff_t f_pos;                    // 文件当前位置(偏移量)struct inode *f_inode;           // 与文件关联的 inode 结构体指针struct address_space *f_mapping; // 文件地址空间指针unsigned int f_flags;            // 文件状态和标志struct file_ra_state f_ra;       // 文件预读取状态void *private_data;              // 指向文件特定私有数据的指针// 其他字段和操作省略...
};

其通过访问inode对象来操作文件。

和进程有关的数据结构

每一个进程都有一组自己打开的文件。有两个数据结构将VFS层和系统进程紧密联系。

进程自己打开的文件

struct files_struct {atomic_t count;               // 引用计数struct fdtable *fdt;          // 指向文件描述符表的指针spinlock_t file_lock;         // 文件表的自旋锁unsigned int next_fd;         // 下一个可用的文件描述符unsigned long close_on_exec;  // 需要在执行新程序时关闭的文件描述符标志unsigned long open_fds;        // 已打开文件描述符的位图struct file *fd_array[0];     // 指向打开文件的指针数组
};
  • fdt:指向 struct fdtable 的指针,表示文件描述符表。fdtable 包含了打开文件的数组以及相应的控制信息。
  • next_fd:表示下一个可用的文件描述符。在进程打开新文件时,会从这个位置开始分配文件描述符。
  • close_on_exec 和 open_fds:用于标记在执行新程序时需要关闭的文件描述符。
  • fd_array:这是一个指针数组,指向打开文件的指针

进程关联的文件系统状态

struct fs_struct {int users;                     // 引用计数spinlock_t lock;                // 用于保护结构的自旋锁struct path root;               // 进程的根目录struct path pwd;                // 进程的当前工作目录struct fdtable *files;          // 文件描述符表// 其他字段和操作省略...
};

它包含了与进程关联的文件系统状态,包括当前工作目录、根目录、以及与文件描述符表相关的信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/456190.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年2月CCF-全国精英算法大赛题目

第一次参加这种比赛,虽然是c类赛事,但是是ccf主办的,难度还是有点的,主要是前面签到题主要是思想,后面的题目难度太高,身为力扣只刷了一百多道题目的我解决不了,这几道我只做了B,C题,E题超时了&…

Linux 命令基础

Shell概述 Linux操作系统的Shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。 Shell是用户和Linux内核之间的接口程序,如果把硬件想象成一个球体的中心,内核围绕在硬件的外层管理着…

每日一练:LeeCode-112、路径总和【二叉树+DFS+回溯】

本文是力扣LeeCode-112、路径总和 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有…

C语言第十九弹---指针(三)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 指针 1、数组名的理解 2、使用指针访问数组 3、⼀维数组传参的本质 4、冒泡排序 5、二级指针 6、指针数组 7、指针数组模拟二维数组 总结 1、数组名的理解…

基于SSM的协同过滤技术的网上书城(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的协同过滤技术的网上书城(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Sp…

微信小程序的图片色彩分析,窃取主色调,调色板

1、在微信小程序中创建包管理器 package.json npm init -y 2、安装 Mini App Color Thief 包 npm i --save miniapp-color-thief 3、构建 npm 4、wxml <canvas canvas-id"myCanvas"></canvas> <button bindtap"chooseImage">chooseIm…

升级Oracle 单实例数据库19.3到19.22

需求 我的Oracle Database Vagrant Box初始版本为19.3&#xff0c;需要升级到最新的RU&#xff0c;当前为19.22。 以下操作时间为为2024年2月5日。 补丁下载 补丁下载文档参见MOS文档&#xff1a;Primary Note for Database Proactive Patch Program (Doc ID 888.1)。 补丁…

容器监控三剑客CAdvisor、Granfana、InfluxDB

容器监控 原生命令 docker stats查看结果 &#x1f629;通过docker stats命令可以很方便的看到当前宿主机上所有容器的CPU,内存以及网络流量等数据&#xff0c;一般小公司够用了。但是&#xff0c;docker stats统计结果只能是当前宿主机的全部容器&#xff0c;数据资料是实…

ionic报错:Cannot read properties of undefined (reading ‘classList‘)

报错信息&#xff1a; [ionic/vue Warning]: The view you are trying to render for path /tabs/tab1 does not have the required <ion-page> component. Transitions and lifecycle methods may not work as expected.See https://ionicframework.com/docs/vue/navig…

Ant Design | 获取 Grid 的列数

为什么要获取 Grid 的列数&#xff1f; 因为设计如下&#xff1a; 每个 item 的宽度是固定的&#xff0c;列数随 Grid 宽度自动调整&#xff0c;并且最后一排的 item 是不显示底部横线的。 item 底部显示横线&#xff1a; item 底部不显示横线&#xff1a; 很显然&#x…

机器学习之DeepSequence软件使用学习1

简介 DeepSequence 是一个生成性的、无监督的生物序列潜变量模型。给定一个多重序列比对作为输入&#xff0c;它可以用来预测可获得的突变&#xff0c;提取监督式学习的定量特征&#xff0c;并生成满足明显约束的新序列文库。它将序列中的高阶依赖性建模为残差子集之间约束的非…

LLMs之Llama2 70B:《Self-Rewarding Language Models自我奖励语言模型》翻译与解读

LLMs之Llama2 70B&#xff1a;《Self-Rewarding Language Models自我奖励语言模型》翻译与解读 目录 《Self-Rewarding Language Models》翻译与解读 Abstract 5 Conclusion结论 6 Limitations限制 《Self-Rewarding Language Models》翻译与解读 地址 文章地址&#xff1…