### Linux虚拟文件系统(VFS)的数据结构关系
Linux操作系统中的虚拟文件系统(VFS)是内核中的一个重要组成部分,它提供了统一的接口来处理不同类型的文件系统。VFS通过抽象出一套通用的数据结构来实现这一目标,使得内核能够与各种具体的文件系统交互而无需关心它们的具体实现细节。下面详细介绍VFS中的关键数据结构及其相互之间的关系。
#### 1. inode 结构体
`inode` 是VFS中最核心的数据结构之一,代表了文件系统中的一个文件或目录。`inode` 包含了文件的所有元数据信息,例如:
- `i_mode`: 文件权限。
- `i_uid`: 文件所有者的用户ID。
- `i_gid`: 文件所有者的组ID。
- `i_op`: 指向该`inode`的操作函数指针数组。
- `i_sb`: 指向包含该`inode`的`super_block`。
- `i_mapping`: 指向该`inode`的`address_space`结构。
- `i_ino`: `inode`号,在文件系统内部唯一标识一个`inode`。
- `i_rdev`: 如果是设备文件,则存储设备号。
- `i_hash`: `inode`的哈希值,用于快速查找。
- `i_wb_list`: 写回缓存列表。
- `i_lru`: LRU链表节点,用于管理内存中的`inode`。
- `i_sb_list`: 链接`inode`到其所在`super_block`的列表。
- `i_dentry`: 指向该`inode`的`dentry`结构。
- `i_fop`: 对于目录等特殊文件,指向对应的文件操作函数指针数组。
#### 2. dentry (目录项)
`dentry` 结构体代表了文件系统中的目录条目,即文件或目录的名称。它主要用于缓存文件名和对应的`inode`之间的映射,以加快文件系统的访问速度。`dentry` 包含的关键成员有:
- `d_hash`: `dentry`的哈希值,用于快速查找。
- `d_parent`: 指向父`dentry`的指针。
- `d_name`: 文件名。
- `d_inode`: 指向关联的`inode`结构体。
- `d_count`: 引用计数。
- `d_op`: 操作函数指针数组。
- `d_sb`: 指向包含该`dentry`的`super_block`。
- `d_lru`: LRU链表节点。
- `d_child`: 子目录的`dentry`。
- `d_subdirs`: 所有子目录的链表。
- `d_alias`: 硬链接的链表。
`d_inode`为空表示对应的路径的文件不存在。
#### 3. super_block (超级块)
`super_block` 结构体描述了一个文件系统的信息,它是文件系统的入口点。`super_block` 包括:
- `s_list`: 超级块的双向循环链表节点。
- `S_dev`: 设备编号。
- `S_blocksize/S_blocksize_bits`: 块大小/块大小位数。
- `S_maxbytes`: 文件系统可以支持的最大文件大小。
- `Structfile_system_type*S_type`: 文件系统的类型。
- `S_op`: 操作函数指针数组。
- `S_root`: 指向根目录的`dentry`结构体。
- `S_count`: 使用该文件系统的挂载点数量。
- `S_inodes`: `inode`数组。
- `S_files`: 打开文件的数组。
- `S_dentry_lru`: `dentry`的LRU链表。
- `S_nr_dentry_unused`: 未使用的`dentry`数量。
- `S_inode_lru`: `inode`的LRU链表。
- `S_nr_inode_unused`: 未使用的`inode`数量。
- `S_instances`: 当前使用该文件系统的进程数。
#### 4. vfsmount
`vfsmount` 描述了文件系统的挂载点信息,包括:
- `mnt_hash`: 用于查找挂载点的哈希值。
- `mnt_parent`: 指向父`vfsmount`的指针。
- `mnt_mountpoint`: 挂载点的`dentry`。
- `mnt_root`: 指向根目录的`dentry`。
- `mnt_sb`: 指向`super_block`。
- `mnt_count`: 引用计数。
- `mnt_mounts`: 子`vfsmount`链表。
- `mnt_child`: 子`vfsmount`的指针。
- `mnt_list`: 所有`vfsmount`的链表。
- `mnt_expire`: 过期时间。
#### 5. 其他相关结构
- **inode_hashtable**: `inode`的哈希表,用于快速查找。
- **dentry_hashtable**: `dentry`的哈希表,用于快速查找文件名到`inode`的映射。
- **super_blocks**: `super_block`的哈希表,用于快速查找文件系统。
#### 总结
这些数据结构共同构成了Linux VFS的核心框架,它们之间的紧密联系和协作确保了文件系统的一致性和高效性。`inode`、`dentry` 和 `super_block`是VFS中最基本也是最重要的三个结构,它们各自负责文件元数据、文件名到`inode`的映射以及文件系统信息。通过这些结构的相互作用,VFS能够支持多种不同的文件系统类型,并为应用程序提供一致的接口。