
VFS依赖于数据结构来保存其对于一个文件系统的一般表示。
超级块结构:存放已安装的文件系统的相关信息
索引节点结构:对于文件信息的完全的描述
文件结构:存放一个被进程打开的文件的相关信息
目录项结构:存放有关路径名及路径名所指向的文件的信息
组成VFS的结构与一些操作相关联,这些操作可应用于有这些结构所表示的对象。这些操作在每个对象的操作表中定义。操作表示函数指针的集合。
2.1超级块结构
当文件系统被挂载时,所有有关它的信息均被存放在super_block结构体中。每个安装好的文件系统都有一个超级块结构。这个结构体定义如下:
---------------------------------------------------------------------
---------------------------------------------------------------------
一些重要成员的说明:
s_list:指向双向循环链表中前一个和下一个元素的指针。如同linux内核中的许多其他结构一样,super_block也用双向循环链表维护,而正是这个成员将系统中安装的文件系统的super_block相互链接起来。全局变量super_blocks(fs/super.c,LIST_HEAD(super_blocks);)指向链表中的第一个元素。
s_dirt:在基于磁盘的文件系统中,用最初存放于磁盘上特定扇区中的数据会被用来填充超级块结构的一些字段。VFS允许对super_block进行修改,而这个成员正是用于说明超级块结构是否被修改,也即是否与磁盘上的数据一致。以便于在适当的时候将超级块数据写回磁盘。
s_maxbytes:这个成员用于说明文件系统支持的文件的最大长度。
s_type:超级块结构包含文件系统通用的信息,而这个成员则使超级块与特定的文件系统类型(如ext2,NFS等)关联起来。file_system_type结构体保存具体文件系统的信息。这个成员指向适当具体文件系统的结构体,VFS利用它可管理从一般请求到具体文件系统操作的交互。
下图显示了file_system_type和超级块之间的关系:
s_op:super_operations结构体类型的指针,这个结构体保存超级块的操作函数表。super_operations结构体由一些函数指针组成,这些函数指针用特定文件系统的超级块操作函数来初始化。
s_root:这个成员是一个dentry结构体指针,dentry结构体用于保存目录项。这个成员指向该文件系统安装目录对应的目录项。
s_inodes:是一个list_head结构体,指向属于该文件系统的索引节点的双向链表。
s_files:这个成员文件结构体链表,这个文件结构体不但正在使用,而且已分配给超级块。
s_instances:指向相同的文件系统类型的超级块链表中相邻的超级块元素。
s_fs_info:指向特定文件系统的超级块信息的指针。
2.2超级块操作结构
超级块的s_op成员指向文件系统的超级块操作结构,他描述了VFS能够如何管理特定的文件系统的超级块。每个具体的文件系统都可以定义自己的超级快操作,因为它直接针对文件系统的实现进行操作。
---------------------------------------------------------------------
include/linux/fs.h
1558 struct super_operations {
1559 struct inode *(*alloc_inode)(struct super_block *sb);
1560 void (*destroy_inode)(struct inode *);
1561
1562 void (*dirty_inode) (struct inode *);
1563 int (*write_inode) (struct inode *, struct writeback_control *wbc);
1564 void (*drop_inode) (struct inode *);
1565 void (*delete_inode) (struct inode *);
1566 void (*put_super) (struct super_block *);
1567 void (*write_super) (struct super_block *);
1568 int (*sync_fs)(struct super_block *sb, int wait);
1569 int (*freeze_fs) (struct super_block *);
1570 int (*unfreeze_fs) (struct super_block *);
1571 int (*statfs) (struct dentry *, struct kstatfs *);
1572 int (*remount_fs) (struct super_block *, int *, char *);
1573 void (*clear_inode) (struct inode *);
1574 void (*umount_begin) (struct super_block *);
1575
1576 int (*show_options)(struct seq_file *, struct vfsmount *);
1577 int (*show_stats)(struct seq_file *, struct vfsmount *);
1578 #ifdef CONFIG_QUOTA
1579 ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t);
1580 ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);
1581 #endif
1582 int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t);
1583 };
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-76619-1.html
这首最好听
建议中国军舰对美军舰前后20海里进行军事导弹实弹射击演练
全国人民恭喜南方黑芝麻蛆子节节高