解释字段:
字段 描述s_list 指向超级块链表的指针,这个struct list_head是很熟悉的结构了,里面其实就是用于连接关系的prev和next字段。内核单独使用一个简单的结构体将所有的super_block都链接起来。
s_dev 包含该具体文件系统的块设备标识符。例如,对于 /dev/hda1,其设备标识符为 0x301
s_blocksize_bits 上面的size大小占用位数,例如512字节就是9 bits
s_blocksize 文件系统中数据块大小,以字节单位
s_maxbytes 允许的最大的文件大小(字节数)
*struct file_system_type s_type 文件系统类型(也就是当前这个文件系统属于哪个类型?ext2还是fat32),要区分“文件系统”和“文件系统类型”不一样!一个文件系统类型下可以包括很多文件系统即很多的super_block,后面会说!
*struct super_operations s_op 指向某个特定的具体文件系统的用于超级块操作的函数集合
*struct dquot_operations dq_op 指向某个特定的具体文件系统用于限额操作的函数集合
*struct quotactl_ops s_qcop 用于配置磁盘限额的的方法,处理来自用户空间的请求
s_flags 安装标识
s_magic 区别于其他文件系统的标识
s_root 指向该具体文件系统安装目录的目录项
s_umount 对超级块读写时进行同步
s_count 对超级块的使用计数
s_active 引用计数
超级块方法
struct super_operations { //该函数在给定的超级块下创建并初始化一个新的索引节点对象 struct inode *(*alloc_inode)(struct super_block *sb); //释放指定的索引结点 。 void (*destroy_inode)(struct inode *); //VFS在索引节点被修改时会调用此函数。 void (*dirty_inode) (struct inode *, int flags); // 将指定的inode写回磁盘。 int (*write_inode) (struct inode *, struct writeback_control *wbc); //删除索引节点。 int (*drop_inode) (struct inode *); void (*evict_inode) (struct inode *); //用来释放超级块 void (*put_super) (struct super_block *); //使文件系统的数据元素与磁盘上的文件系统同步,wait参数指定操作是否同步。 int (*sync_fs)(struct super_block *sb, int wait); int (*freeze_fs) (struct super_block *); int (*unfreeze_fs) (struct super_block *); //获取文件系统状态。把文件系统相关的统计信息放在statfs中 int (*statfs) (struct dentry *, struct kstatfs *); int (*remount_fs) (struct super_block *, int *, char *); void (*umount_begin) (struct super_block *); 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); #endif int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t); long (*nr_cached_objects)(struct super_block *, int); long (*free_cached_objects)(struct super_block *, long, int); }; 2. 索引节点(inode)索引节点inode:
保存的其实是实际的数据的一些信息,这些信息称为“元数据”(也就是对文件属性的描述)。
例如:文件大小,设备标识符,用户标识符,用户组标识符,文件模式,扩展属性,文件读取或修改的时间戳,链接数量,指向存储该内容的磁盘区块的指针,文件分类等等。
( 注意数据分成:元数据+数据本身 )
同时注意:inode有两种,一种是VFS的inode,一种是具体文件系统的inode。前者在内存中,后者在磁盘中。所以每次其实是将磁盘中的inode调进填充内存中的inode,这样才是算使用了磁盘文件inode。
inode怎样生成的?每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定(现代OS可以动态变化),一般每2KB就设置一个inode。