1. 超级块, 代表一个具体的已安装的文件系统。
struct super_block
2. 索引节点,代表一个具体文件。
struct inode
- 索引节点对象包含了内核操作文件或目录时需要的全部信息。对于Unix风格的文件系统来说,这些信息可以从磁盘索引节点直接读入。索引节点对象必须在内存中创建,以便于文件系统使用。 一个索引节点代表文件系统中(但是索引节点仅当文件被访问时,才在内存中创建)的一个文件,它也可以是设备或管道这样的特殊文件。
3. 目录项
struct dentry
- 为了方便对文件/目录的查找操作,提高查找性能,VFS引入了目录县的概念。解析一个路径并遍历其分量是一个耗时的操作。目录项对象的引入使得这个过程更加简单。每个dentry代表路径中的一个特定部分。对于/bin/vi 这个例子来说,/、bin、vi 都属于目录项对象。
- VFS在执行目录操作时(如果需要的话)会现场创建目录项对象。目录项与超级块/索引节点不同,目录项没有对应的磁盘数据结构。
- 内核会将目录项对象缓存在**目录项缓存(dcache)**中。
4. 文件
struct file
- 文件对象表示进程已经打开的文件。进程直接处理的是文件,而不是超级块、索引节点或目录项。
- 文件对象是已经打开的文件在内存中的表示。该对象(不是物理文件)由相应的open()系统调用创建,有close()系统调用撤销。
- 多个进程可以同时打开或操作同一个文件。所以同一个文件也可能存在多个对应的文件对象。文件对象仅仅在进程观点上代表已打开文件,它反过来指向目录项对象(目录项对象反过来指向索引节点),其中只有目录项对象才表示已经打开的实际文件。
- 文件对象实际上也没有对应的磁盘数据。