Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系 (3)

解释字段:

字段 描述
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。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssgzj.html