VFS数据结构:
1 、超级快结构
struct super_block{
unsigned char s_dirt; //vfs允许对超级块结构中的字段进行修改, 如果超级快结构中的信息可能发现与磁盘上的数据不同步。 这字段表示 需要同步。
struct list_head s_dirty; // 它指向该文件系统所包含的脏索引节点链表的第一个元素和最后一个元素。
struct list_head s_instances;// 它指向超级块链表中相邻的超级块元素,该超级块链表中的超级块都是同一种类型文件系统类型。file_system_type结构体的fs_supers
//指向s_instances链表的标头?
void *s_fs_info; //指向超级快的附加信息,这些附加信息是具体文件系统所特有的。
};
2、索引节点结构
散列表,能减少查找特定索引节点的时间。索引节点也可以在三种双向链表的一个里面找到自己,如索引节点链表:
链表 i_count 是否脏 引用指针
有效未使用的链表 i_count=0 不脏 inode_unused(全局的)
有效在使用的链表 i_count>0 不脏 inode_use(全局的)
脏索引节点的链表 i_count>0 脏 超级块的s_dirty字段
struct inode{
struct hlist_node i_hash; // 是hlist_node类型的,它包含一个指向散列表的指针,散列表用来加速索引节点的查找。索引节点的散列表有全局变量inode_hashtable来引用
struct list_head i_list;//这个字段链接索引节点链表中相邻的结构体,索引节点可以再三个链表中的一个中找到自己。
};
3、目录项结构
目录项结构 表示目录中的一项, vfs用它来记录基于目录命名、目录组织以及文件逻辑布局之间的关系。每个目录项对像 对应于路径名中的一个分量。/home/b 目录节点是
/ , home/ , b/ ,目录项是 / , home , b 。
struct dentry{
struct list_head d_lru; //用于未使用目录项链表的指针
struct list_head d_child; //对于目录而言,用于同一父目录中的目录项链表的指针
struct list_head d_subdirs; //对于目录而言,子目录项链表的头
// 以上三行, 是指向目录项链表中相邻元素的指针。目录项对象能在下表的一种链表中找到自己:
链表名 链表指针 说明
已使用的目录项 d_alias 索引节点相同的所有目录项形成一个链表, i_dentry字段指向该链表的头
未使用的目录项 d_lru 这些目录项不再使用, 但是继续保持, 以防路径名中再次使用这个分量(?)
struct dentry * d_parent; //这个字段存放指向父目录项或者路径名中父分量对应的目录项的指针。如/home/paul中, 目录项paul 的d_parent 指向目录项home。
};
4 文件结构
进程所打开的表示文件的文件结构体是通过 进程描述符(task_struct)引用的。文件结构体用双向循环列表,文件结构体被嵌入三个链表中的一个,如下:
名字 指向链表头的指针 说明
空闲文件对象链表 全局变量free_list 有所有可用的文件对象组成的双向链表
正在使用但没分配的文件对象链表 全局变量anon_list 由正在被使用但是还没有分配给超级快的所有文件对象组成的双向链表
超级块的文件对象链表 超级块的s_files字段 一个双向链表,由包含与超级块相关的文件所有文件对象组成
内核利用 get_empty_filp() 创建文件结构体。如果没有空闲结构体(?), 或是系统已用完了内存就返回NULL。
6.3 与vfs相关的结构
fs_struct , files_stuct, namespa