首页 > 系统相关 >Linux内核文件系统-虚拟文件系统-索引节点对象

Linux内核文件系统-虚拟文件系统-索引节点对象

时间:2024-09-24 18:51:58浏览次数:9  
标签:struct endif list unsigned 文件系统 内核 Linux inode

建议点击这里查看个人主页上的最新原文

点击这里在哔哩哔哩bilibili在线观看配套的教学视频

点击这里在哔哩哔哩bilibili在线观看配套的加餐视频(就是一些补充)

点击跳转到内核课程所有目录

一般的Linux书籍都是先讲解进程和内存相关的知识,但我想先讲解文件系统。第一,因为我就是做文件系统的,更擅长这一块,其他模块的内容我还要再去好好看看书,毕竟不能误人子弟嘛;第二,是因为文件系统模块更接近于用户态,是相对比较好理解的内容(当然想深入还是要下大功夫的),由文件系统入手比较适合初学者。

虚拟文件系统英文全称Virtual file system,缩写为VFS,又称为虚拟文件切换系统(virtual filesystem switch)。所有的文件系统都要先经过虚拟文件系统层,虚拟文件系统相当于制定了一套规则,如果你想写一个新的文件系统,只需要遵守这套规则就可以了。

VFS虽然是用C语言写的,但使用了面向对象的设计思路。

索引节点包含了操作文件和目录时的全部信息,也定义在include/linux/fs.h。也不需要背,用到时查一下就可以。

/*
 * 将“struct inode”中的大多数已读字段和经常访问的字段(特别是用于RCU路径查找和“stat”数据的字段)放在前面。
 */
struct inode {
        umode_t                 i_mode; // 访问权限
        unsigned short          i_opflags;
        kuid_t                  i_uid; // 使用者的id
        kgid_t                  i_gid; // 使用组的id
        unsigned int            i_flags; // 文件系统标志

#ifdef CONFIG_FS_POSIX_ACL
        struct posix_acl        *i_acl;
        struct posix_acl        *i_default_acl;
#endif

        const struct inode_operations   *i_op; // 索引节点操作表
        struct super_block      *i_sb; // 相关的超级块
        struct address_space    *i_mapping; // 相关的地址映射

#ifdef CONFIG_SECURITY
        void                    *i_security; // 安全模块
#endif

        /* 统计数据,不在路径遍历中访问 */
        unsigned long           i_ino; // 索引节点号
        /*
         * 文件系统只能直接读取 i_nlink。它们应该使用以下函数进行修改:
         *
         *    (set|clear|inc|drop)_nlink
         *    inode_(inc|dec)_link_count
         */
        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_*_ctime accessors ! 最后改变时间 */
        spinlock_t              i_lock; /* 保护 i_blocks, i_bytes, 还有 i_size,自旋锁 */
        unsigned short          i_bytes; // 使用的字节数
        u8                      i_blkbits; // 以位为单位的块大小
        u8                      i_write_hint;
        blkcnt_t                i_blocks; // 文件的块数

#ifdef __NEED_I_SIZE_ORDERED
        seqcount_t              i_size_seqcount; // 对 i_size 进行串行计数
#endif

        /* Miscellaneous 杂项 */
        unsigned long           i_state; // 状态标志
        struct rw_semaphore     i_rwsem;

        unsigned long           dirtied_when;   /* 第一次弄脏时的 jiffies 值,第一次弄脏数据的时间 */
        unsigned long           dirtied_time_when;

        struct hlist_node       i_hash; // 散列表
        struct list_head        i_io_list;      /* 后备设备 IO 列表 */
#ifdef CONFIG_CGROUP_WRITEBACK
        struct bdi_writeback    *i_wb;          /* 关联的 cgroup wb */

        /* 外来 inode 检测,参见 wbc_detach_inode() */
        int                     i_wb_frn_winner;
        u16                     i_wb_frn_avg_time;
        u16                     i_wb_frn_history;
#endif
        struct list_head        i_lru;          /* inode LRU list,Least Recently Used 最近最少使用链表 */
        struct list_head        i_sb_list; // 超级块链表
        struct list_head        i_wb_list;      /* 后备设备回写列表 */
        union {
                struct hlist_head       i_dentry; // 目录项链表
                struct rcu_head         i_rcu;
        };
        atomic64_t              i_version; // 版本号
        atomic64_t              i_sequence; /* see futex */
        atomic_t                i_count; // 引用计数
        atomic_t                i_dio_count;
        atomic_t                i_writecount; // 写者计数
#if defined(CONFIG_IMA) || defined(CONFIG_FILE_LOCKING)
        atomic_t                i_readcount; /* struct files open RO */
#endif
        union {
                const struct file_operations    *i_fop; /* former ->i_op->default_file_ops,默认的索引节点操作 */
                void (*free_inode)(struct inode *);
        };
        struct file_lock_context        *i_flctx;
        struct address_space    i_data; // 设备地址映射
        struct list_head        i_devices; // 块设备链表
        union {
                struct pipe_inode_info  *i_pipe; // 管道信息
                struct cdev             *i_cdev; // 字符设备驱动
                char                    *i_link;
                unsigned                i_dir_seq;
        };

        __u32                   i_generation;

#ifdef CONFIG_FSNOTIFY
        __u32                   i_fsnotify_mask; /* 该 inode 关心的所有事件 */
        struct fsnotify_mark_connector __rcu    *i_fsnotify_marks;
#endif

#ifdef CONFIG_FS_ENCRYPTION
        struct fscrypt_info     *i_crypt_info;
#endif

#ifdef CONFIG_FS_VERITY
        struct fsverity_info    *i_verity_info;
#endif

        void                    *i_private; /* 文件系统或设备的私有指针 */
} __randomize_layout;

标签:struct,endif,list,unsigned,文件系统,内核,Linux,inode
From: https://blog.csdn.net/chenxiaosongcsdn/article/details/142469516

相关文章

  • 【Linux】指令和权限的这些细节,你确定都清楚吗?
    ......
  • ELK-03-skywalking监控linux系统
    文章目录前言一、下载node_exporter二、启动node_exporter三、下载OpenTelemetryCollector四、启动OpenTelemetryCollector4.1将配置文件下载到同级目录4.2启动五、查看总结前言skywalking安装完成后,开始我们的第一个监控-监控linux系统。参考官方文档:https:......
  • Linux便捷查询使用手册 第二章:安装与设置
    目录2.1安装准备2.1.1系统需求2.1.2硬件兼容性检查2.1.3下载安装镜像2.1.4制作启动介质2.2安装过程2.2.1进入安装程序2.2.2选择安装类型2.2.3分区设置2.2.4软件选择2.2.5设置用户和密码2.2.6完成安装2.3网络配置2.3.1网络连接设置2.3.2IP地址配......
  • [Linux]从零开始的Minecraft服务器搭建教程
    一、前言    学习Linux有一段时间了,当然,我们要把学习的知识运用到实际生活中去。最近朋友们都在玩我的世界,网易版的我的世界联机非常不稳定,用起来也算是非常难受了。所以还是准备转战JAVA版。为了联机,可以考虑一个人开一个房间,对外开放端口,不过这样太麻烦了。而且如果......
  • 手动下载和安装内核
    手动下载和安装内核是一个高级操作,需要从官方源或其他可信源手动下载和安装内核(1)选择合适的内核版本,可以访问官方操作系统网站或内核开发者网站,以获取可用的内核版本信息。(2)下载内核源代码:一旦确定了要安装的内核版本,可以通过以下方式之一获取内核源代码:官方操作系统网站提供......
  • Linux磁盘管理.二Day.19
    一.分配超过2TB的磁盘(fdiskgdisk)1.fdisk:[root@localhost~]#fdisk/dev/sdbWARNING:Thesizeofthisdiskis4.4TB(4398046511104bytes).DOSpartitiontableformatcannotbeusedondrivesforvolumeslargerthan(2199023255040bytes)for512-bytesecto......
  • Linux系统CentOS下挂载磁盘
    1.挂载磁盘步骤总结如下1.对磁盘进行分区2.对磁盘进行格式化3.将磁盘挂载到对应目录4.设置开机自动挂载磁盘2.对磁盘进行分区2.1查看系统设备信息lsblk指令显示所有块设备信息:显示系统中所有的块设备信息,包括磁盘和分区lsblk2.2查看未挂载的磁盘fdisk-l2.3对新建的磁盘进......
  • 11、Linux软件安装及使用
    Windows软件安装流程安装检查:检查系统是否满足软件的安装要求,包括操作系统版本、硬盘空间、内存要求等。释放文件:解压安装包中的文件到临时目录。复制可执行文件:将主要的可执行文件复制到指定的安装路径。安装DLL动态链接库/安装服务:根据需要安装动态链接库文件(DLL)和......
  • 在虚拟机Linux上运行redis,同时使用Another RedisDesktop Manager图形化界面工具连接
    VMwareWorkstationPro虚拟机启动Centos7MobaXterm连接虚拟机输入个人密码Redis启动进入Redis文件目录cd/usr/local/src/redis-6.2.6Redis自启动systemctlenableredissystemctlstartredis查看Redis进程ps-ef|grepredis进入Redis操作redis-cli-h......
  • Linux系统CentOS下挂载磁盘
    1.挂载磁盘步骤总结如下1.对磁盘进行分区2.对磁盘进行格式化3.将磁盘挂载到对应目录4.设置开机自动挂载磁盘2.对磁盘进行分区2.1查看系统设备信息lsblk指令显示所有块设备信息:显示系统中所有的块设备信息,包括磁盘和分区lsblk2.2查看未挂载的磁盘fdisk-l2.3......