第 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,一经查实,立即删除!

相关文章

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 数据内容:《中国贸易外经统计年鉴》是一部反映中国国内贸易、对外经济贸易和旅游业发展情况的资料性年刊。收录了 中国国内消费品市场、批发和零售业、住宿和餐饮业、国际收支、对外贸易、利…

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

外观和丝印 ICS-43434麦克风3.50 mm x 2.65 mm,丝印为434(图片不好拍,隐约可见434) 一般描述 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…

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

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

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; 《------往期经典推…

C#字符串基本操作

1、代码 //1、创建字符串&#xff08;获取长度&#xff09;string str "Hello, World!";Console.WriteLine($"string:{str},length:{str.Length}");//2、字符串连接string str1 "Hello, ";string str2 "World!";Console.WriteLine…

在 Windows 11/10/8 上恢复误删除文件的最佳方法

如果您刚刚在计算机上重新安装了 Windows 操作系统&#xff0c;结果硬盘上的所有文件都消失了&#xff0c;有没有办法从 Windows 11/10 中恢复误删除的文件&#xff1f; 许多因素都可能导致 PC 上的文件被删除。除了重新安装操作系统外&#xff0c;其他常见原因还包括意外删除…

Vue.js 生命周期详解:从创建到销毁的全过程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

【BUG】已解决:java.lang.reflect.InvocationTargetException

已解决&#xff1a;java.lang.reflect.InvocationTargetException 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发…

STM32 IAP 需要关注的一些事

1、首先要知道STM32的程序是如何分布在FLASH中的。 2、升级的时候涉及到两个程序&#xff0c;一个是bootloader&#xff0c;一个是user程序&#xff0c;这两个程序的功能分别的什么作用的&#xff1f; 3、编译的固件是怎么分布的&#xff1f;通过那个配置文件去指导编译器去排布…

Spring Boot集成kudu快速入门Demo

1.什么是kudu 在Kudu出现前&#xff0c;由于传统存储系统的局限性&#xff0c;对于数据的快速输入和分析还没有一个完美的解决方案&#xff0c;要么以缓慢的数据输入为代价实现快速分析&#xff0c;要么以缓慢的分析为代价实现数据快速输入。随着快速输入和分析场景越来越多&a…

十五、【机器学习】【监督学习】- 神经网络回归

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…