Linux虚拟文件系统(VFS)

news2024/11/14 17:49:06

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

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

虚拟文件系统是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.coloradmin.cn/o/1436954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于CEVA DSP BX2的架构分析(六)-加载和存储单元(二)

6.4 指针修改机制 LS0和LS1都包含指针修改机制。当使用间接或索引寻址模式时,指针的修改可以与地址生成并行执行。在间接寻址模式中,指针包含地址,而在变址寻址模式下,指针包含偏移量(有关这些寻址模式的更多详细信息&…

python实现飞书群机器人消息通知

python实现飞书群机器人消息通知(消息卡片) 直接上代码 """ 飞书群机器人发送通知 """ import time import urllib3 import datetimeurllib3.disable_warnings()class FlybookRobotAlert():def __init__(self):self.web…

数据库管理-第146期 最强Oracle监控EMCC深入使用-03(20240206)

数据库管理145期 2024-02-06 数据库管理-第146期 最强Oracle监控EMCC深入使用-03(20240206)1 概览2 性能中心3 性能中心-Exadata总结 数据库管理-第146期 最强Oracle监控EMCC深入使用-03(20240206) 作者:胖头鱼的鱼缸&…

【大数据】Flink on YARN,如何确定 TaskManager 数

Flink on YARN,如何确定 TaskManager 数 1.问题2.并行度(Parallelism)3.任务槽(Task Slot)4.确定 TaskManager 数 1.问题 在 Flink 1.5 Release Notes 中,有这样一段话,直接上截图。 这说明从 …

Stable Diffusion 模型下载:majicMIX realistic 麦橘写实 - V7

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 非常推荐的一个写实模型,由国人“Merjic”发布,下载量颇高。这款大模型带来非常高的写实度以及光影感,特别是光线在画面中生成的…

【JS逆向一】逆向某站的 加密参数算法--仅供学习参考

逆向日期:2024.02.06 使用工具:Node.js 文章全程已做去敏处理!!! 【需要做的可联系我】 可使用AES进行解密处理(直接解密即可):在线AES加解密工具 1、打开某某网站(请使用文章开头的…

模拟串口LV2,解决硬件串口资源不足问题!!!!

模拟串口通信 2.0 版本!! 我在前面的文章里面有写了 虚拟串口通信,虽然说能用,但是用过的小伙伴都说 “好!” 优缺点: 先说一点,2.0版本并不适用于同硬件串口的所有场合,仅仅针对自己开发的电子垃圾的主…

用HTML5 + JavaScript实现下雪效果

用HTML5 JavaScript实现下雪效果 <canvas>是一个可以使用脚本 (通常为JavaScript) 来绘制图形的 HTML 元素。 <canvas> 标签/元素只是图形容器&#xff0c;必须使用脚本来绘制图形。 HTML5 canvas 图形标签基础https://blog.csdn.net/cnds123/article/details/…

架构(十三)动态本地锁

一、引言 加锁大家都知道&#xff0c;但是目前提供动态锁的基本都是分布式锁&#xff0c;根据订单或者某个收费款项进行加锁。比如这个1订单要收刷卡费用&#xff0c;那就OREDER_1做为key丢到redis进行分布式加锁。这也是当下分布式锁最流行的方式。 但是对于平台项目或者一些并…

飞天使-k8s知识点14-kubernetes散装知识点3-Service与Ingress服务发现控制器

文章目录 Service与Ingress服务发现控制器存储、配置与角色 Service与Ingress服务发现控制器 在 Kubernetes 中&#xff0c;Service 和 Ingress 是两种不同的资源类型&#xff0c;它们都用于处理网络流量&#xff0c;但用途和工作方式有所不同。Service 是 Kubernetes 中的一个…

redis:七、集群方案(主从复制、哨兵模式、分片集群)和面试模板

redis集群方案 在Redis中提供的集群方案总共有三种&#xff08;一般一个redis节点不超过10G内存&#xff09; 主从复制哨兵模式分片集群 主从复制&#xff08;主从数据同步&#xff09; replid和offset Replication Id&#xff1a;简称replid&#xff0c;是数据集的标记&a…

回归预测 | Matlab实现POA-BP鹈鹕算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现POA-BP鹈鹕算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现POA-BP鹈鹕算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现POA-BP鹈鹕算法优化BP神经网络多变量回归预测&#xff08;完整源码…

Java LinkedList 实现栈和队列

Java LinkedList 实现栈和队列 package com.zhong.collection;import java.util.LinkedList;public class LinkedListDemo {public static void main(String[] args) {// LinkedList 创建一个队列LinkedList<String> queue new LinkedList<>();// 进队System.out…

大华 DSS 数字监控系统 attachment_getAttList.action SQL 注入漏洞复现

0x01 产品简介 大华 DSS 数字监控系统是大华开发的一款安防视频监控系统,拥有实时监视、云台操作、录像回放、报警处理、设备管理等功能。 0x02 漏洞概述 大华 DSS存在SQL注入漏洞,攻击者 /portal/attachment_getAttList.action 路由发送特殊构造的数据包,利用报错注入获…

git合入的parents和child

最近在管理代码&#xff0c;有2的权限&#xff0c;看到一些以前1看不到的东西。 有时候会遇到多个人基于同一节点提交代码&#xff0c;那就要选择先合入和后合入&#xff0c;如果这多人修改到同一个文件同一个地方&#xff0c;就可能产生冲突&#xff0c;一般要避免这种情况出…

NLP_神经概率语言模型(NPLM)

文章目录 NPLM的起源NPLM的实现1.构建实验语料库2.生成NPLM训练数据3.定义NPLM4.实例化NPLM5.训练NPLM6.用NPLM预测新词 NPLM小结 NPLM的起源 在NPLM之前&#xff0c;传统的语言模型主要依赖于最基本的N-Gram技术&#xff0c;通过统计词汇的共现频率来计算词汇组合的概率。然而…

Stata学习(1)

一、五大窗口 Command窗口&#xff1a;实现人机交互 来导入一个自带数据&#xff1a; sysuse是导入系统自带的数据&#xff0c;auto导入该数据的名称&#xff0c;后面的clear是清除之前的数据 结果窗口&#xff1a;展示计算结果、查找功能 在Edit的find可以实现查找功能&#…

如何使用C#调用LabVIEW算法

新建一个工程 这是必须的&#xff1b; 创建项目 项目 点击完成&#xff1b; 将项目另存为&#xff1b;方便后续的使用&#xff1b; 创建 一个测试VI 功能很简单&#xff0c;用的一个加法&#xff1b;将加数A&#xff0c;B设置为输入&#xff0c;和C设置为输出&#xff0c;…

Spring Boot项目中解决跨域问题(四种方式)

目录 一&#xff0c;跨域产生的原因二&#xff0c;什么情况下算跨域三&#xff0c;实际演示四&#xff0c;解决跨域的方法1&#xff0c;CrossOrigin注解2&#xff0c;添加全局过滤器3&#xff0c;实现WebMvcConfigurer4&#xff0c;Nginx解决跨域5&#xff0c;注意 开发项目的时…

黑马Java——集合进阶(List、Set、泛型、树)

一、集合的体系结构 1、单列集合&#xff08;Collection&#xff09; 二、Collection集合 1、Collection常见方法 1.1代码实现&#xff1a; import java.util.ArrayList; import java.util.Collection;public class A01_CollectionDemo1 {public static void main(String[] a…