Linux内核文件系统-虚拟文件系统-超级块操作

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

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

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

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

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

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

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

超级块对象中最重要的一个成员是s_op,也是面向对象思想的一个体现,超级块操作函数表结构体也是定义在文件include/linux/fs.h中。也不需要背,用到时查一下就可以。

struct super_operations {
        struct inode *(*alloc_inode)(struct super_block *sb); // 创建和初始化一个新的索引节点对象
        void (*destroy_inode)(struct inode *); // 销毁索引节点
        void (*free_inode)(struct inode *); // 释放索引节点

  void (*dirty_inode) (struct inode *, int flags); // 索引节点脏(也就是数据被修改了)时调用,日志更新(如ext4的jbd2)
        int (*write_inode) (struct inode *, struct writeback_control *wbc); // 将索引节点写入磁盘
        int (*drop_inode) (struct inode *); // 最后一个索引节点的引用释放后调用,普通unix文件系统不会定义这个函数
        void (*evict_inode) (struct inode *); // 从磁盘删除索引节点
        void (*put_super) (struct super_block *); // 释放超级块,要持有超级块锁
        int (*sync_fs)(struct super_block *sb, int wait); // 文件系统的元数据与磁盘同步
        int (*freeze_super) (struct super_block *, enum freeze_holder who);
        int (*freeze_fs) (struct super_block *);
        int (*thaw_super) (struct super_block *, enum freeze_holder who);
        int (*unfreeze_fs) (struct super_block *);
        int (*statfs) (struct dentry *, struct kstatfs *); // 获取文件系统状态
        int (*remount_fs) (struct super_block *, int *, char *); // 指定新的选项重新安装文件系统
        void (*umount_begin) (struct super_block *); // 中断安装操作,目前只有网络相关的文件系统以及fuse实现了

        int (*show_options)(struct seq_file *, struct dentry *);
        int (*show_devname)(struct seq_file *, struct dentry *);
        int (*show_path)(struct seq_file *, struct dentry *);
        int (*show_stats)(struct seq_file *, struct dentry *);
#ifdef CONFIG_QUOTA
        ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t);
        ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);
        struct dquot **(*get_dquots)(struct inode *);
#endif
        long (*nr_cached_objects)(struct super_block *,
                                  struct shrink_control *);
        long (*free_cached_objects)(struct super_block *,
                                    struct shrink_control *);
        void (*shutdown)(struct super_block *sb);
};

注意在C语言的实现中,如果要获取struct super_block *父对象,必须要传入指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值