Linux内核文件系统-虚拟文件系统-文件对象

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

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

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

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

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

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

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

站在用户角度,我们更关心的是文件对象。文件对象表示进程打开的文件,多个进程可能同时打开和操作同一个文件,同一个文件可能存在多个文件对象,最终指向同一个dentry

/*
 * f_{lock,count,pos_lock}成员可能存在高度争用,共享相同的缓存行。
 * 而f_{lock,mode}经常一起使用,因此也共享相同的缓存行。
 * 读取频率较高的f_{path,inode,op}被保存在单独的缓存行中。
 */
struct file {
        union {
                struct llist_node       f_llist; // 文件对象链表
                struct rcu_head         f_rcuhead; // 释放之后的rcu链表
                unsigned int            f_iocb_flags;
        };

        /*
         * 保护 f_ep 和 f_flags。
         * 禁止在 IRQ 上下文中获取。
         */
        spinlock_t              f_lock; // 单个文件结构锁
        fmode_t                 f_mode; // 访问模式
        atomic_long_t           f_count; // 引用计数
        struct mutex            f_pos_lock;
        loff_t                  f_pos; // 当前位移量(文件指针)
        unsigned int            f_flags; // 打开时指定的标志
        struct fown_struct      f_owner; // 拥有者通过信号进行异步IO数据的传送
        const struct cred       *f_cred; // 文件的信任状
        struct file_ra_state    f_ra; // 预读状态
        struct path             f_path; // 包含dentry和vfsmount
        struct inode            *f_inode;       /* cached value */
        const struct file_operations    *f_op; // 文件操作表

        u64                     f_version; // 版本号
#ifdef CONFIG_SECURITY
        void                    *f_security; // 安全模块
#endif
        /* tty 驱动程序以及其他驱动程序可能需要 */
        void                    *private_data; // tty设备驱动的钩子

#ifdef CONFIG_EPOLL
        /* 由 fs/eventpoll.c 用于链接所有的钩子到这个file对象 */
        struct hlist_head       *f_ep; // 事件池链表
#endif /* #ifdef CONFIG_EPOLL */
        struct address_space    *f_mapping; // 页缓存映射
        errseq_t                f_wb_err;
        errseq_t                f_sb_err; /* for syncfs */
} __randomize_layout
  __attribute__((aligned(4)));  /* 防止某些奇怪的情况认为 2 是可以的 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值