linux的vfs

linux VFS结构:

1.superblock:

每个文件系统有且只有一个superblock,系统初始化完毕之后将维护一个superblock链表,里面包含所有

注册的文件系统的superblock。

2.inode:

保存一个文件的信息,比如文件的名字,文件在磁盘上的数据位置等

3.file:

这个结构用来描述进程跟一个文件交互的信息

4.dentry:

因为在linux中一个目录也是一个文件,文件里面的是一个个的entry,描述对应目录下的文件和目录信息,

而dentry就是描述目录entry信息的结构。由于dentry在解释文件路径中的作用,linux来保留有dentry

cache,用来缓存过去被访问的entry信息,以便下次解释文件路径时可以加快速度。

5.file_system_type:

用于文件系统向系统注册文件系统内容

6.vfsmount:

描述被mount的文件系统的信息,每当一个文件系统被mount的时候就会创建这样一个结构,同一个文件

系统被mount多少次就会创建多少个这样的结构。

 交互示意图:见《understanding the linux kernel》-460页 figure 12-2.

 

Linux 虚拟文件系统(VFS)是 Linux 内核中的一个抽象层,它为各种具体的文件系统提供了一个统一的接口。这种设计使得应用程序可以以一致的方式访问不同的文件系统,而无需关心底层实现的具体细节。 ### 架构概述 Linux VFS 的核心架构包括几个关键的数据结构和操作方法: - **超级块对象**:每个已安装的文件系统都有一个对应的超级块对象,该对象包含了文件系统的全局信息,如文件系统的类型、状态以及指向根目录索引节点的指针等。 - **索引节点对象**:每一个文件或目录都对应着一个索引节点对象,其中存储了文件的元数据,比如权限、拥有者、时间戳以及文件的实际数据块位置等[^2]。 - **目录项对象**:目录项对象表示的是路径名称的一部分,并且它与索引节点相关联。这些对象构成了缓存,用于加速对文件名到索引节点映射的查找过程。 - **文件对象**:当进程打开一个文件时,内核会创建一个文件对象,这个对象代表了进程与已打开文件之间的交互关系,包含读写位置等运行时的信息[^3]。 ### 工作原理 在用户空间程序进行文件操作时,例如使用 `open()` 或 `read()` 系统调用,VFS 层负责将这些通用的操作转换成特定于实际文件系统的操作。以下是几个主要的工作流程: #### 挂载 挂载操作是指把一个具体的文件系统连接到 VFS 层次结构中某个点上。当一个新的文件系统被挂载时,内核会读取其超级块并初始化相关的 VFS 结构体,从而建立起从 VFS 到具体文件系统的联系。 #### 查找索引节点 为了找到特定文件的索引节点,VFS 会调用父目录索引节点的 `lookup()` 方法。这个方法由驻留其中的特定文件系统实现。一旦找到了所需的目录项(dentry),也就意味着获得了相应的 inode,这样就可以执行进一步的操作,如打开文件或获取文件状态信息[^3]。 #### 文件访问 对于文件的读写操作,VFS 提供了一组标准的函数指针,它们指向具体文件系统提供的实际实现。这样即使底层文件系统不同,上层应用也能通过相同的 API 来完成文件的访问。 ### 技术细节示例 以下是一个简单的代码片段,展示了如何利用 VFS 接口来遍历给定目录下的所有条目: ```c #include <linux/fs.h> #include <linux/dcache.h> // 假设dir是已经获取的struct inode *指向目标目录 struct file *filp_open_at(struct path *path, int flags, umode_t mode); int iterate_dir(struct file *file, filldir_t filler, void *buf, size_t size); void list_directory_entries(struct inode *dir) { struct file *fp; struct path dir_path; // 初始化路径 dir_path.dentry = dget(dir->i_dentry); dir_path.mnt = mntget(current->fs->rootmnt); fp = filp_open_at(&dir_path, O_RDONLY, 0); if (!IS_ERR(fp)) { // 使用默认填充器打印目录内容 iterate_dir(fp, (filldir_t)generic_filldir, NULL, PAGE_SIZE); filp_close(fp); } path_put(&dir_path); } ``` 这段代码首先构造了一个指向目标目录的路径,然后尝试以只读模式打开该目录。如果成功,则使用 `iterate_dir` 函数配合默认的填充器 `generic_filldir` 来列出目录中的所有条目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值