时建立的,并在这些文件系统卸载时自动删除。
当系统初启时,所有被初始化的文件系统类型都要向VFS登记。每个已安装的文件系统由一个VFS超级块表示。实际上,应该把VFS超级块说成是某个物理文件系统的VFS超级块。在Linux中,超级块由super_block结构描述,所有的超级块都以双向循环链表方式链接,链表头节点保存在super_blocks变量中。
2.VFS索引节点(inode)
每一个索引节点节点都由一个inode结构描述,主要包括以下几个方面:
(1)描述文件信息的域:①文件类型和访问权限i_mode;②文件所有者的id号i_uid和所有者所属群组的id号i_gid;③该文件大小i_size和文件占用块数i_blocks;④块大小i_blksize、节点所使用的块数i_blocks和可用块的剩余数i_bytes;⑤文件最后访问时间i_atime、文件最后修改时间i_mtime和节点修改时间i_ctime;⑥块设备链表指针i_bdev和字符设备链表指针i_cdev;⑦实际设备号i_rdev;⑧与该索引节点建立的连接数i_nlink等。
(2)用于索引节点管理的域:①哈希链表i_hash;②索引节点所在文件系统的超级块链表的头节点i_sb_list;③形成分类的索引节点链表i_list;④指向该索引节点的目录项链表的头节点i_dentry。
(3)用于索引节点操作的域:①索引节点的标识符i_ino;②指向inode_operations结构的指针i_op,该结构包含一组对索引节点操作的函数;③指向file_operations结构的指针i_fop,该结构包含一组对文件操作的函数;④指向该文件系统的超级块的指针i_sb;⑤使用该节点的进程数i_count;⑥有关更改目录的事件数i_dnotify_mask和指向更改目录事件表的指针i_dnotify;⑦用于实现I/O缓冲的i_mapping和i_data等。
为了加快对索引节点的
查询,除未用索引节点链表外,其它两个链表同时也在索引节点散
列表(inode_hashtable)中存放。该散列表中保存了每个索引节点的节点号,以及与该索引节点对应文件所在文件系统的超级块的地址。为了解决Hash冲突,Linux在索引节点中设置一个hash域,其中包含next和prev两个指针,分别指向具有相同hash地址的上一个和下一个索引节点,将一组具有相同hash地址的索引节点链接为一个双向链表,并记入在索引节点散列表中该地址对应项,其结构如下图所示。
3.目录项(dentry)
每个文件除了有一个索引节点结构外,还有目录项─dentry结构,主要用于描述文件名及与其关联的索引节点信息。
目录项代表的是逻辑意义上的文件,记录的文件名、访问权限等,在磁盘上没有对应的映象。而索引节点代表的是物理意义上的文件,记录的文件的文件系统类型,文件所在的物理存储设备等,对于一个物理文件系统,在磁盘上有对应的映象。
在dentry结构中,主要包含如下的信息:
①目录项标识d_flags;
②对应目录项的索引节点d_inode;
③对应的超级块d_sb;
④文件名d_name、短文件名d_iname;
⑤父节点d_parent、子孙节点队列d_subdirs、目录项节点队列d_alias、连接到父节点的d_subdirs队列d_child、连接的散列表d_hash和LRU链表d_lru;
⑥对目录项的使用次数d_count;
⑦加载到dentry的文件系统数量d_mounted;
⑧指向dentry_operations结构的指针d_op,该结构包含对dentry结构的操作函数等。
4.文件(file)
在Linux中,进程通过文件描述符(File descriptors,简称fd)来访问文件,与此同时,创建了一个file结构,并将打开文件的位置保存在file结构中。多个file结构可以指向同一个文件。
文件和索引节点也许看起来很相像,但它们之间有一些非常明显的不