最近手里有一个项目需要写一个简单的文件系统,利用周末时间把深入理解linux内核书第十二章虚拟文件系统学习了一下,加深了对vfs的理解,这里也做一下总结,以备后查。
linux成功的关键因素之一就是它与其他操作系统和谐共存的能力,在linux下可以安装挂载很多格式的文件系统,之所以能实现就是通过虚拟文件系统这一中间系统层,虚拟文件系统的主要思想是引入了一个通用文件模型,它能够表示所有的文件系统,这也要求,具体文件系统的实现中需要给VFS提供相应的物理组织结构。
通用文件模型有4大对象模型:超级块对象 索引节点对象 目录项对象 文件对象
要注意的是,在VFS看来,超级块以及索引节点是存在于实际物理磁盘的,而目录项和文件对象是VFS在内存中创建的结构,这里也预示着超级块对象和索引节点对象存在这个内存和物理磁盘的同步问题。
这里也说明在VFS看来,实际的物理磁盘除了实际数据外,应该还有超级块和索引节点表,当然这个我们可以在具体文件系统的实现来实现,因为不是所有的文件系统在物理磁盘上有超级块和索引节点表的。
我们首先从空间上来一一介绍VFS这4大对象模型:
1.superblock
1)superblock简介
超级块用来描述特定文件系统的信息。物理的超级块存放在磁盘特定的扇区中 ,分区被mount时将会读取磁盘superblock信息存在于内存中,也就是VFS的超级块对象。VFS超级块是各种具体文件系统在安装时建立的,并在这些文件系统卸载时被自动删除 。超级块对象由结构体 super_block来体现。
VFS中超级块对象的数据结构如下:
1318struct super_block {
1319 struct list_head s_list; // 超级快链表指针
1320 dev_t s_dev; // 设备表示符
1321 unsigned char s_dirt; //脏标志
1322 unsigned char s_blocksize_bits; //以位为单位的块的大小
1323 unsigned long s_blocksize; //以字节为单位的块大小
1324 loff_t s_maxbytes; //文件大小上限
1325 struct file_system_type *s_type; //指向文件系统的file_system_type 数据结构的指针
1326 const struct super_operations *s_op; //超级块方法
1327 const struct dquot_operations *dq_op; //磁盘限额方法
1328 const struct quotactl_ops *s_qcop; //限额控制方法
1329 const struct export_operations *s_export_op; //导出方法
1330 unsigned long s_flags; //登录标志
1331 unsigned long s_magic; //文件系统的魔数
1332 struct dentry *s_root; //目录登录点
1333 struct rw_semaphore s_umount; //卸载信号量
1334 struct mutex s_lock; //超级块信号量
1335 int s_count; //超级块引用计数
1336 atomic_t s_active; //活动引用记数
1337#ifdef CONFIG_SECURITY
1338 void *s_security; //安全模块
1339#endif
1340 const struct xattr_handler **s_xattr;
1341
1342 struct list_head

本文深入解析Linux内核的虚拟文件系统(VFS),介绍了VFS的四大核心对象:超级块、索引节点、目录项和文件对象。详细阐述了每个对象的作用、数据结构及其相互关系,帮助读者理解Linux如何通过VFS支持多种文件系统。
最低0.47元/天 解锁文章
1146

被折叠的 条评论
为什么被折叠?



