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
- MongoDB中各种类型的索引
- 敲一天代码了,轻松下吧,精彩 !看人潮如海
- MongoDB副本集其他细节
- 数据库表设计对性能的影响
- V部落博客管理平台开源啦! Vue+SpringBoot强强联合!
- SpringBoot+SpringSecurity处理Ajax登录请求
- MongoDB副本集配置
- MongoDB副本集搭建
- vhr部门管理数据库设计与编程
- SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(六)
- 权限管理模块中动态加载Vue组件
- axios请求封装和异常统一处理
- SpringSecurity中密码加盐与SpringBoot中异常统一处理
- SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(二)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Django后台管理界面修改(源文件修改)
- 前端工程师不可不知的Nginx知识
- Django1.11 简单登录注册
- 基因表达聚类分析之初探SOM - 自组织特征图
- JMH - Java 代码性能测试的终极利器、必须掌握
- 从零搭建Spring Boot脚手架(6):整合Redis作为缓存
- 换一种姿势挖掘CORS漏洞
- 新的Spring OAuth2.0 授权服务器项目正式发布
- spring boot整合apollo
- 枚举和List的几个共有方法
- AtomicInteger源码解析
- AtomicIntegerArray源码解析
- AtomicIntegerFieldUpdater源码解析
- “终于懂了” 系列:Android屏幕刷新机制—VSync、Choreographer 全面理解!
- 一些PHP选项参数相关的函数