第 8 章 虚拟文件系统(2)

目录

8.3 VFS结构

8.3.1 结构概观

8.3.2 inode


本专栏文章将有70篇左右,欢迎+关注,查看后续文章。

8.3 VFS结构

8.3.1 结构概观

VFS组成部分:

        1. 文件。

        2. 文件系统。

1. 文件的表示

        inode:包含文件信息及数据存储位置。

上图右下方:

        struct     files_struct {         //作用:跟踪该进程所有打开的文件。

                struct  file    *fd_array[ NR_OPEN_DEFAULT ];         // fd 作为索引

};

struct dentry:表示一个目录项。

        作用:缓存文件路径名。加速文件查找和访问。

底层的操作函数指针:

        1. struct    inode_operations 包括:

                创建链接,文件重命名,创建文件,删除文件。

        2. struct    file_operations 包括:

                读写文件,mmap,设置文件位置等指针。

2. 文件系统和超级块信息

超级块:struct super_block

struct super_block 包含:

        1. 文件系统信息:块长度,最大文件长度。

        2. 修改过的 inode 列表。

        3. 通过 struct super_operations    *s_op 包括操作 inode 的函数指针,如:

                alloc_inode,write_inode,destroy_inode,dirty_inode,remount_fs 等。

8.3.2 inode

inode 分为:

        存在磁盘中:存在于底层的具体文件系统中。

        存在内存中:即 struct inode(本节所讲)。

从磁盘中读取到的 inode 信息,将填充到内存 struct   inode。

应用层访问文件的过程:

        1. 路径解析。寻找对应 dentry,若未找到则创建dentry。

        2. 通过 dentry 找到对应 inode。

        3. 分配 fd 和 struct file 对象。

从Ext2开始,内核将文件属性和文件内容分开存储,分别对应 inode 和数据块 block。

struct    inode {

        umode_t           i_mode;

                // 10位,1位是文件类型,后9位是所有者/组/其他成员的读写访问权限。

        

        kuid_t           i_uid;         // 使用者 id

        kgid_t           i_gid;         // 所属组

        

        unsigned int                            i_flags;

        struct inode_operations         *i_op;

        struct super_block                 *i_sb;

        struct address_space            *i_mapping;         // 通常指向 i_data

        unsigned long         i_ino;

                //索引节点号,每个 inode 唯一,根目录的 i_ino 通常为0。

        union {

                const unsigned int         i_nlink;         // 硬链接数目。

                unsigned int                   __i_nlink;

        };

        dev_t         i_rdev;         // 当为设备文件时,表示设备号。

        loff_t         i_size;          // 文件的长度,单位字节。

        struct timespec64         i_atime;         // 最后访问时间

        struct timespec64         i_mtime;        // 最后修改文件时间

        struct timespec64         i_ctime;         // 最后修改 inode 时间

        

        spinlock_t         i_lock;

        unsigned short             i_bytes;         // 文件中最后一个块的字节数

        u8                                 i_blkbits;       // 块大小

        blkcnt_t                         i_blocks;       // 文件占用块数,文件系统的特征。

        unsigned long               i_state;

        struct hlist_node           i_hash;

                // 连接 hash 值相等的 inode,根据 inode 号+ 超级块地址定位到 hash 表找到 inode。

        

        struct list_head                 i_io_list;

        struct list_head                 i_lru;

        struct list_head                 i_sb_list;

        struct list_head                 i_wb_list;

        union {

                struct hlist_head         i_dentry;

                        //连接了该 inode 所有 dentry,一个 inode 可有多个dentry,如硬链接。

                struct rcu_head         i_rcu;

        };

        atomic_t                             i_count;         // 使用 inode 的引用计数

        struct file_operations         *i_fop;

        struct address_space        i_data;

        union {         // 文件类型

                struct pipe_inode_info         *i_pipe;

                struct block_device              *i_bdev;

                struct cdev                            *i_cdev;

                char                                      *i_link;

                unsigned                               i_dir_seq;

        };

        void         *i_private;

};

struct   inode 中复合数据类型的成员有:

1. inode操作

即 struct inode_operations    *i_op;           

struct inode_operations    *i_op;                   操作文件的属性。

struct file_operations         *i_fop;                 操作文件的数据。

struct     inode_operations {

        struct  dentry     *(*lookup) (struct inode *,    struct dentry *,     unsigned int);

                //根据文件名查找其inode。

        char     *(*get_link) (struct dentry *,     struct inode *,     struct delayed_call *);

        int     (*readlink) (struct dentry *,     char __user *,    int);

        int     (*link) (struct dentry *,    struct inode *,    struct dentry *);

        int     (*symlink) (struct inode *,    struct dentry *,    const char *);

        int     (*unlink) (struct inode *,    struct dentry *);

        int     (*mknod) (struct inode *,    struct dentry *,    umode_t,dev_t);

        int     (*create) (struct inode *,    struct dentry *,     umode_t, bool);

        int     (*rmdir) (struct inode *,    struct dentry *);

        int     (*mkdir) (struct inode *,    struct dentry *,    umode_t);

        int     (*rename) (struct inode *, struct dentry *, struct inode *, struct dentry *, unsigned int);

        int     (*setattr) (struct dentry *,     struct iattr *);

                //扩展属性,实现文件ACL。

        ssize_t     (*listxattr) (struct dentry *,     char *,     size_t);

};

struct dentry 作用:

        关联文件名及其 inode。

文件ACL:

        提供比传统文件权限(user, group, others 的 rwx 权限)更细致管理。

        可对指定用户或用户组设定指定权限。

相关系统调用:

        setxattr()、getxattr()、listxattr()

命令工具:

        setfacl、getfacl

setfacl 使用举例:

        1. 赋予用户 john 读写权限:

                setfacl   -m   u:john:rw    file.txt

        2. 删除用户 jane 的所有权限:

                setfacl    -x   u:jane    file.txt

注:某些文件系统不支持ACL。

2. inode链表

一个 inode 可被包含在:

        1. 三个链表:

                1.1. inode_unused 链表:

                        该inode未关联到任何文件。

                1.2. inode_in_use 链表:

                        该inode关联到一个文件。

                1.3. 一个超级块的脏 inode 链表。

        2. 一个散列表:以支持根据 inode 编号和超级块访问 inode。

                全局数组变量:inode_hashtable

                struct    inode {

                        struct   hlist_node     i_hash;         // 用于连接 hash 冲突的 inode。

                }

struct    super_block {         // 表示文件系统的信息。

        struct list_head         s_inodes;         // 连接该文件系统所有 inode。

        struct list_head         s_dentry_lru;    // 管理 dentry 缓存的 LRU 列表。

        struct list_head         s_inode_lru;     // 管理 inode 缓存的 LRU 列表。

}

使用举例:

        list_add(&dentry->d_lru,    &dentry->d_sb->s_dentry_lru);

        dentry = list_entry(sb->s_dentry_lru.prev,    struct dentry,    d_lru);

        list_add(&inode->i_lru,    &inode->i_sb->s_inode_lru);

        inode = list_entry(sb->s_inode_lru.prev,    struct inode,    i_lru);

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

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

相关文章

Oracle数据泵和RMAN异机备份还原速度对比

一、数据泵迁移 1、原始库停止监听 命令:lsnrctl stop 耗时:1分钟 2、原始库expdp导出 expdp username/password schemasUSER dumpfilefilename.dmp directoryBAK_DIR version11.2.0.4.0 logfilelogfilename.log compressionall clusterN 耗时&…

001、Mac系统上Stable Diffusion WebUI环境搭建

一、目标 如标题所述,在苹果电脑(Mac)上搭建一套Stable Diffusion本地服务,以实现本地AI生图目的。 二、安装步骤 1、准备源码【等价于准备软件】 # 安装一系列工具库,包括cmake,protobuf,rust,python3.10,git,wge…

Nginx、LNMP万字详解

目录 Nginx 特点 Nginx安装 添加Nginx服务 Nginx配置文件 全局配置 HTTP配置 状态统计页面 Nginx访问控制 授权用户 授权IP 虚拟主机 基于域名 测试 基于IP 测试 基于端口 测试 LNAMP 解析方式 LNMP转发php-fpm解析 Nginx代理LAMP解析 LNMP部署示例 实…

linux之mysql安装和使用

数据库之Mysql 一、数据库介绍 1、什么是数据库 数据库就是一个存放计算机数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来对数据进行组织和存储的,可以通过数据库提供的多种方法来管理其中的数据。 2、数据库的种类 最常用的…

微分段Microsegmentation简介

目录 微分段Microsegmentation简介什么是微分段?微分段的防范措施微分段的防护层级 基于网络的微分段微分段基本工作机制微分段的角色VxLAN的额外字段 业务链分组与传输策略场景1:三层报文本地转发场景场景2:三层报文跨设备转发场景 微分段的…

中国贸易外经统计年鉴(2006-2023年)

数据年限:2006-2023年全 数据格式:pdf、excel、caj 数据内容:《中国贸易外经统计年鉴》是一部反映中国国内贸易、对外经济贸易和旅游业发展情况的资料性年刊。收录了 中国国内消费品市场、批发和零售业、住宿和餐饮业、国际收支、对外贸易、利…

2024年大数据高频面试题(下篇)

文章目录 Scala数据类型函数式编程闭包函数柯里化面向对象样例类对象与伴生对象特质(trait)模式匹配隐式转换即席查询KylinKylin特点Kylin工作原理核心算法Kylin总结Kylin的优点什么场景用KylinKylin的缺点Impala什么是ImpalaImpala为什么快FrontendBackendImpala总结:Presto什…

C++11新特性--委托构造和继承构造函数

1. 委托构造函数 委托构造函数允许使用同一个类中的一个构造函数调用其它的构造函数&#xff0c;从而简化相关变量的初始化。下面举例说明&#xff1a; #include <iostream> using namespace std;class Test { public:Test() {};Test(int max){this->m_max max >…

具有I2S输出的多模数字麦克风ICS-43434咪头LR引脚接地或电源WS接LRCLK

外观和丝印 ICS-43434麦克风3.50 mm x 2.65 mm&#xff0c;丝印为434&#xff08;图片不好拍&#xff0c;隐约可见434&#xff09; 一般描述 ICS-43434 是一款数字 IS 输出底部收音孔麦克风。完整的 ICS-43434 解决方案包括 MEMS 传感器、信号调理、模数转换器、抽取和抗混叠滤…

在mybatis-plus中关于@insert注解自定义批处理sql导致其雪花算法失效而无法自动生成id的解决方法

受到这位作者的启发 > 原文在点这里 为了自己实现批量插入&#xff0c;我在mapper层使用insert注解写了一段自定义sql //自定义的批量插入方法 Insert("<script>" "insert into rpt_material_hour(id,sample_time,rounding_time,cur_month,machine_no…

Elasticsearch 批量更新

Elasticsearch 批量更新 准备条件查询数据批量更新 准备条件 以下查询操作都基于索引crm_flow_info来操作&#xff0c;索引已经建过了&#xff0c;本文主要讲Elasticsearch批量更新指定字段语句&#xff0c;下面开始写更新语句执行更新啦&#xff01; 查询数据 查询指定shif…

leetcode_80. 删除有序数组中的重复项 II

leetcode_80. 删除有序数组中的重复项 II leetcode链接 题目描述 给你一个有序数组 nums &#xff0c;请你** 原地** 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须…

大龄程序员的出路在哪里?

对于许多资深程序员而言&#xff0c;年龄并非职业发展的桎梏&#xff0c;反而如同陈年的美酒&#xff0c;随着时间的流逝愈发醇厚。他们手握的是丰富的经验和不断进阶的技能&#xff0c;而这些都为他们打开了职业发展的无数扇大门。让我们一同探索这些令人心动的可能性吧&#…

视频号矩阵系统,AI自动生成文案,实现批量上传视频和定时发布

在数字化浪潮席卷全球的今天&#xff0c;视频内容已成为信息传播的重要载体。然而&#xff0c;对于众多自媒体创作者和企业而言&#xff0c;如何高效、精准地发布视频内容&#xff0c;依然是一个不小的挑战。幸运的是&#xff0c;随着技术的不断进步&#xff0c;视频号矩阵系统…

SQL概述及其规则与规范

SQL概述及其规则与规范 1.SQL概述 1.1 SQL背景知识 1946年&#xff0c;世界第一台电脑诞生&#xff0c;如今&#xff0c;互联网已经非常壮大&#xff0c;在这几十年间互联网得到了飞速的发展&#xff0c;无数的技术在其中起起伏伏&#xff0c;但是有一门技术从未消失&#xf…

Kafka消息队列python开发环境搭建

目录 引言 Kafka 的核心概念和组件 Kafka 的主要特性 使用场景 申请云服务器 安装docker及docker-compose VSCODE配置 开发环境搭建 搭建Kafka的python编程环境 Kafka的python编程示例 引言 Apache Kafka 是一个分布式流处理平台&#xff0c;由 LinkedIn 开发并在 2…

SpringBoot整合阿里云RocketMQ对接,商业版

1.需要阿里云开通商业版RocketMQ 普通消息新建普通主题,普通组,延迟消息新建延迟消息主题,延迟消息组 2.结构目录 3.引入依赖 <!--阿里云RocketMq整合--><dependency><groupId>com.aliyun.openservices</groupId><artifactId>ons-client</…

Qt类 | QLabel类详解

文章目录 一、QLabel类介绍二、Properties&#xff08;属性&#xff09;三、Public Functions&#xff08;公共函数&#xff09;1.构造函数2.alignment与setAlignment函数 -- 标签内容的对齐方式3.buddy与setBuddy函数 -- QLabel关联的伙伴控件4.hasScaledContents与setScaledC…

基于YOLOv8深度学习的水果智能检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测、卷积神经网络

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

End-to-End Object Detection with Transformers【目标检测-方法详细解读】

摘要 我们提出了一种新的方法,将目标检测视为一个直接的集合预测问题。我们的方法简化了检测流程,有效地消除了许多手工设计的组件,如非极大值抑制程序或锚生成,这些组件显式编码了我们关于任务的先验知识。新框架的主要成分,称为DEtection TRansformer或DETR,是一个基于…