通用文件模型
VFS的思想是把不同种类文件系统的共同部分抽象出来,其中有一个字段用来指向所支持的实际文件系统的操作方法。这些抽象出来的数据结构就是VFS的通用文件模型。
你可以把通用文件模型看作面向对象的,结构体中既定义了数据也定义了其上的操作方法。这个模型能够表示所有支持的文件系统,因此要实现具体的文件系统就必须要把其物理组织结构转换为虚拟文件系统的通用文件模型才可以使用VFS。
例如:通用模型中每个目录被看作一个文件,包含若干文件和其他子目录。但是存在几个非Unix基于磁盘的文件系统,他们利用文件分配表(File Allocation Table,FAT)存放每个文件在目录树中的位置,在这些文件系统中,存放的是目录而不是文件。为了符合VFS通用文件模型,对于上述基于FAT的文件系统的实现,必须建立对应于目录的文件,符合VFS的统一接口。这样的文件只作为内核内存的对象而存在。
1. 超级块对象(superblock object)
存放已安装文件系统信息。对基于磁盘的文件系统,这类对象通常对应于存放在磁盘上的文件系统控制块。
1.1 超级块数据结构
struct super_block {
struct list_head s_list; /* 指向超级块链表的指针 */
dev_t s_dev; /* 设备标识符 */
unsigned long s_blocksize; /* 以字节为单位的块大小 */
unsigned char s_blocksize_bits; /* 以位为单位的块大小 */
unsigned char s_dirt; /* 修改“脏”标识 */
unsigned long long s_maxbytes; /* 文件的最长长度 */
struct file_system_type *s_type; /* 文件系统类型 */
const struct super_operations *s_op; /* 超级块方法 */
struct dquot_operations *dq_op; /* 磁盘限额处理方法 */
struct quotactl_ops *s_qcop; /* 磁盘限额管理方法 */
struct export_operations *s_export_op; /* 网络文件系统使用的输出操作 */
unsigned long s_flags; /* 安装标志 */
unsigned long s_magic; /* 文件系统的魔数 */
struct dentry *s_root; /* 文件系统的根目录的目录项对象 */
struct rw_semaphore s_umount; /* 卸载所用的信号量 */
struct mutex s_lock; /* 超级块信号量 */
int s_count; /* 引用计数器 */
int s_syncing; /* 表示对超级块的索引节点进行同步的标志 */
int s_need_sync_fs; /* 对超级块的已安装文件系统进行同步的标志 */
atomic_t s_active; /* 次级引用计数器 */
void *s_security; /* 指向超级块安全数据结构的指针 */