VFS四大对象之一 struct super_block

linux虚拟文件系统四大对象:

1)超级块(super block)

2)索引节点(inode)

3)目录项(dentry)

4)文件对象(file)

现在先介绍第一个

一、super_block的含义:

超级块代表了整个文件系统,超级块是文件系统的控制块,有整个文件系统信息,一个文件系统所有的inode都要连接到超级块上,可以说,一个超级块就代表了一个文件系统。

说到inode是啥?参照下一篇博客;

 1 struct super_block {
 2     struct list_head    s_list;        /* Keep this first */
 3     dev_t            s_dev;        /* search index; _not_ kdev_t */
 4     unsigned char        s_dirt;
 5     unsigned char        s_blocksize_bits;
 6     unsigned long        s_blocksize;
 7     loff_t            s_maxbytes;    /* Max file size */
 8     struct file_system_type    *s_type;
 9     const struct super_operations    *s_op;
10     const struct dquot_operations    *dq_op;
11     const struct quotactl_ops    *s_qcop;
12     const struct export_operations *s_export_op;
13     unsigned long        s_flags;
14     unsigned long        s_magic;
15     struct dentry        *s_root;
16     struct rw_semaphore    s_umount;
17     struct mutex        s_lock;
18     int            s_count;
19     atomic_t        s_active;
20 #ifdef CONFIG_SECURITY
21     void                    *s_security;
22 #endif
23     const struct xattr_handler **s_xattr;
24 
25     struct list_head    s_inodes;    /* all inodes */
26     struct hlist_bl_head    s_anon;        /* anonymous dentries for (nfs) exporting */
27 #ifdef CONFIG_SMP
28     struct list_head __percpu *s_files;
29 #else
30     struct list_head    s_files;
31 #endif
32     struct list_head    s_mounts;    /* list of mounts; _not_ for fs use */
33     /* s_dentry_lru, s_nr_dentry_unused protected by dcache.c lru locks */
34     struct list_head    s_dentry_lru;    /* unused dentry lru */
35     int            s_nr_dentry_unused;    /* # of dentry on lru */
36 
37     /* s_inode_lru_lock protects s_inode_lru and s_nr_inodes_unused */
38     spinlock_t        s_inode_lru_lock ____cacheline_aligned_in_smp;
39     struct list_head    s_inode_lru;        /* unused inode lru */
40     int            s_nr_inodes_unused;    /* # of inodes on lru */
41 
42     struct block_device    *s_bdev;
43     struct backing_dev_info *s_bdi;
44     struct mtd_info        *s_mtd;
45     struct hlist_node    s_instances;
46     struct quota_info    s_dquot;    /* Diskquota specific options */
47 
48     int            s_frozen;
49     wait_queue_head_t    s_wait_unfrozen;
50 
51     char s_id[32];                /* Informational name */
52     u8 s_uuid[16];                /* UUID */
53 
54     void             *s_fs_info;    /* Filesystem private info */
55     unsigned int        s_max_links;
56     fmode_t            s_mode;
57 
58     /* Granularity of c/m/atime in ns.
59        Cannot be worse than a second */
60     u32           s_time_gran;
61 
62     /*
63      * The next field is for VFS *only*. No filesystems have any business
64      * even looking at it. You had been warned.
65      */
66     struct mutex s_vfs_rename_mutex;    /* Kludge */
67 
68     /*
69      * Filesystem subtype.  If non-empty the filesystem type field
70      * in /proc/mounts will be "type.subtype"
71      */
72     char *s_subtype;
73 
74     /*
75      * Saved mount options for lazy filesystems using
76      * generic_show_options()
77      */
78     char __rcu *s_options;
79     const struct dentry_operations *s_d_op; /* default d_op for dentries */
80 
81     /*
82      * Saved pool identifier for cleancache (-1 means none)
83      */
84     int cleancache_poolid;
85 
86     struct shrinker s_shrink;    /* per-sb shrinker handle */
87 
88     /* Number of inodes with nlink == 0 but still referenced */
89     atomic_long_t s_remove_count;
90 
91     /* Being remounted read-only */
92     int s_readonly_remount;
93 };

这个数据结构十分庞大,毕竟是聚集了一个文件系统的重要信息,我们关注一些比较重要的信息就行了。

1 struct list_head    s_list;

s_list 这是第一个成员,是一个双向循环链表,把所有的super_block连接起来,一个super_block代表一个在linux上的文件系统,这个list上边的就是所有的在linux上记录的文件系统。

1 dev_t s_dev;

s_dev:设备标识符

1 unsigned char        s_dirt;
2 unsigned char        s_blocksize_bits;
3 unsigned long        s_blocksize;
4 loff_t            s_maxbytes;    /* Max file size */

s_dev:包含该具体文件系统的块设备标识符。例如,对于 /dev/hda1,其设备标识符为 0x301

s_blocksize:文件系统中数据块大小,以字节单位

s_blocksize_bits:上面的size大小占用位数,例如512字节就是9 bits

s_dirt:脏位,标识是否超级块被修改

1 loff_t            s_maxbytes;    /* Max file size */

s_maxbytes:允许的最大的文件大小(字节数)

1 struct file_system_type    *s_type;

struct file_system_type *s_type:文件系统类型(也就是当前这个文件系统属于哪个类型?ext2还是fat32)要区分“文件系统”和“文件系统类型”不一样!一个文件系统类型下可以包括很多文件系统即很多的super_block。

1 const struct super_operations    *s_op;
2 const struct dquot_operations    *dq_op;

struct super_operations *s_op:指向某个特定的具体文件系统的用于超级块操作的函数集合。

struct dquot_operations *dq_op:指向某个特定的具体文件系统用于限额操作的函数集合。

1 const struct quotactl_ops    *s_qcop;

struct quotactl_ops     *s_qcop:用于配置磁盘限额的的方法,处理来自用户空间的请求。

1 const struct export_operations *s_export_op;

struct export_operations *s_export_op:导出方法

1 unsigned long        s_flags;

s_flags:安装标识

1 unsigned long        s_magic;

s_magic:区别于其他文件系统的标识

1 struct dentry        *s_root;

s_root:指向该具体文件系统安装目录的目录项

1 struct rw_semaphore    s_umount;

s_umount:对超级块读写时进行同步

1 struct mutex        s_lock;

s_lock:锁标志位,若置该位,则其它进程不能对该超级块操作

1 int            s_count;

s_count:对超级块的使用计数

1 atomic_t        s_active;

s_active:引用计数

s_dirty:已修改的索引节点inode形成的链表,一个文件系统中有很多的inode,有些inode节点的内容会被修改,那么会先被记录,然后写回磁盘。

s_locked_inodes:要进行同步的索引节点形成的链表

s_files:所有的已经打开文件的链表,这个file和实实在在的进程相关的

s_bdev:指向文件系统被安装的块设备

u:u 联合体域包括属于具体文件系统的超级块信息

s_instances:具体的意义后来会说的!(同一类型的文件系统通过这个子墩将所有的super_block连接起来)

s_dquot:磁盘限额相关选项

Reference:

http://www.linuxidc.com/Linux/2011-02/32127.htm

http://blog.csdn.net/shanshanpt/article/details/38943731

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

5478
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2936
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

3015
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

39010
来自专栏落花落雨不落叶

canvas画简单电路图

85711
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.4K7
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

8718
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2787
来自专栏java 成神之路

使用 NIO 实现 echo 服务器

5607
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

3007

扫码关注云+社区