报告内容
一、 概述
Linux能够支持各种不同的文件系统是通过VFS实现的,由于不同的物理文件系统具有不同的组织结构和不同的处理方式,为了能够处理各种不同的物理文件系统,操作系统必须把它们所具有的特性进行抽象,并建立一个面向各种物理文件系统的转换机制,通过这个转换机制,把各种不同物理文件系统转换为一个具有统一共性的虚拟文件系统。
VFS是一个软件层,用来处理与 Unix标准文件系统相关的所有系统调用,是用户应用程序与文件系统实现之间的抽象层。它实际上向Linux 内核和系统中运行的进程提供了一个处理各种物理文件系统的公共接口,通过这个接口使得不同的物理文件系统在内核看来都是相同的。
VFS通用文件模型将文件以及其操作抽象为以下几种对象类型:超级块对象( superblock object)存放文件系统相关信息;索引节点对象(inode object)存放具体文件的一般信息;文件对象(file object)存放已打开的文件和进程之间交互的信息;目录项对象(dentry object)存放目录项与文件的链接信息。
二、 VFS相关的数据结构以及其分析
1.超级块对象
VFS
超级块是各种具体文件系统在安装时建立的,并在这些文件系统卸载时自动删除,它只存在于内存中。VFS超级块在
inculde/Linux/fs.h
中定义,即数据结构
super_block
,该结构及其主要域的含义如下:
struct super_block {
struct list_head s_list;
/*
指向超级块链表的指针
*/
/*
*
包含该具体文件系统的块设备标识符。
*例如,对于 /dev/hda1,其设备标识符为 0x301
*/
kdev_t s_dev;
/*
该具体文件系统中数据块的大小,以字节为单位
*/
unsigned long s_blocksize;
/*
块大小的值占用的位数,例如,如果块大小为
1024
字节,则该值为
10*/
unsigned char s_blocksize_bits;
unsigned char s_dirt;
/*
修改标志
*/
unsigned long long s_maxbytes;
/*
文件的最大长度
*/
struct file_system_type *s_type;
/*
指向某个特定的具体文件系统的用于超级块操作的函数集合的指针
*/
struct super_operations *s_op;
struct dquot_operations *dq_op;
/*
指向磁盘限额方法的指针
*/
unsigned long s_flags;
/*
魔数,即该具体文件系统区别于其它文系统的一个标志
*/
unsigned long s_magic;
struct dentry *s_root;
struct rw_semaphore s_umount;
struct semaphore s_lock;
int s_count;
atomic_t s_active;
struct list_head s_dirty;
/*
已修改索引节点的链表
*/
struct list_head s_locked_inodes;
/*
涉及
I/O
的索引节点的链表
*/
struct list_head s_files;
/*
分配给超级的文件对象的链表
*/
struct block_device *s_bdev;
struct list_head s_instances;
struct quota_mount_options s_dquot;
/*
磁盘限额的选项
*/
/*
一个共用体,其成员是各种文件系统的
fsname_sb_info
数据结构
*/
union {
|