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

Linux为了对超级块,i节点,逻辑块这三部分进行高效的管理,Linux创建了几种不同的数据结构,分别是文件系统类型、inode、dentry等几种。

其中,文件系统类型规定了某种文件系统的行为,利用该数据结构可以构造某种文件系统类型的实例,另外,该实例也被称为超级块实例。

超级块则是反映了文件系统整体的控制信息。超级块能够以多种的方式存在,对于基于磁盘的文件系统,它以特定的格式存在于磁盘的固定区域(取决于文件系统类型)上。在挂载文件系统时,该超级块中的内容被读入磁盘中,从而构建出位于内存中的新的超级块。

inode则反映了文件系统对象中的一般元数据信息。dentry则是反映出某个文件系统对象在全局文件系统树中的位置。

Linux对这四种数据结构进行了相关的关联。
如下图:

结构体关系

1. 超级块(super block)

超级块:一个超级块对应一个文件系统(已经安装的文件系统类型如ext2,此处是实际的文件系统,不是VFS)。

之前我们已经说了文件系统用于管理这些文件的数据格式和操作之类的,系统文件有系统文件自己的文件系统,同时对于不同的磁盘分区也有可以是不同的文件系统。那么一个超级块对于一个独立的文件系统。保存文件系统的类型、大小、状态等等。

(“文件系统”和“文件系统类型”不一样!一个文件系统类型下可以包括很多文件系统即很多的super_block)

既然我们知道对于不同的文件系统有不同的super_block,那么对于不同的super_block的操作肯定也是不同的,所以我们在下面的super_block结构中可以看到上面说的抽象的struct结构(例如下面的:struct super_operations):

(linux内核3.14)

1246 struct super_block { 1247 struct list_head s_list; /* Keep this first */ 1248 dev_t s_dev; /* search index; _not_ kdev_t */ 1249 unsigned char s_blocksize_bits; 1250 unsigned long s_blocksize; 1251 loff_t s_maxbytes; /* Max file size */ 1252 struct file_system_type *s_type; 1253 const struct super_operations *s_op; 1254 const struct dquot_operations *dq_op; 1255 const struct quotactl_ops *s_qcop; 1256 const struct export_operations *s_export_op; 1257 unsigned long s_flags; 1258 unsigned long s_magic; 1259 struct dentry *s_root; 1260 struct rw_semaphore s_umount; 1261 int s_count; 1262 atomic_t s_active; 1263 #ifdef CONFIG_SECURITY 1264 void *s_security; 1265 #endif 1266 const struct xattr_handler **s_xattr; 1267 1268 struct list_head s_inodes; /* all inodes */ 1269 struct hlist_bl_head s_anon; /* anonymous dentries for (nfs) exporting */ 1270 struct list_head s_mounts; /* list of mounts; _not_ for fs use */ 1271 struct block_device *s_bdev; 1272 struct backing_dev_info *s_bdi; 1273 struct mtd_info *s_mtd; 1274 struct hlist_node s_instances; 1275 struct quota_info s_dquot; /* Diskquota specific options */ 1276 1277 struct sb_writers s_writers; 1278 1279 char s_id[32]; /* Informational name */ 1280 u8 s_uuid[16]; /* UUID */ 1281 1282 void *s_fs_info; /* Filesystem private info */ 1283 unsigned int s_max_links; 1284 fmode_t s_mode; 1285 1286 /* Granularity of c/m/atime in ns. 1287 Cannot be worse than a second */ 1288 u32 s_time_gran; 1289 1290 /* 1291 * The next field is for VFS *only*. No filesystems have any business 1292 * even looking at it. You had been warned. 1293 */ 1294 struct mutex s_vfs_rename_mutex; /* Kludge */ 1295 1296 /* 1297 * Filesystem subtype. If non-empty the filesystem type field 1298 * in /proc/mounts will be "type.subtype" 1299 */ 1300 char *s_subtype; 1301 1302 /* 1303 * Saved mount options for lazy filesystems using 1304 * generic_show_options() 1305 */ 1306 char __rcu *s_options; 1307 const struct dentry_operations *s_d_op; /* default d_op for dentries */ 1308 1309 /* 1310 * Saved pool identifier for cleancache (-1 means none) 1311 */ 1312 int cleancache_poolid; 1313 1314 struct shrinker s_shrink; /* per-sb shrinker handle */ 1315 1316 /* Number of inodes with nlink == 0 but still referenced */ 1317 atomic_long_t s_remove_count; 1318 1319 /* Being remounted read-only */ 1320 int s_readonly_remount; 1321 1322 /* AIO completions deferred from interrupt context */ 1323 struct workqueue_struct *s_dio_done_wq; 1324 1325 /* 1326 * Keep the lru lists last in the structure so they always sit on their 1327 * own individual cachelines. 1328 */ 1329 struct list_lru s_dentry_lru ____cacheline_aligned_in_smp; 1330 struct list_lru s_inode_lru ____cacheline_aligned_in_smp; 1331 struct rcu_head rcu; 1332 };

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

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