我们知道Linux是借用虚拟文件系统作为上层抽象的管理者来统一支持下层的各具差异的逻辑文件系统。应用程序要访问任何已经注册并挂载的逻辑文件系统相应物理存储外设都是通过VFS层次提供的统一调用接口来实现。Linux中对物理外存上的数据块采用的组织管理方式是借助称为索引节点(inode)的数据结构,因此当应用进程要与具体的逻辑文件系统进行数据存取时,相应的逻辑文件系统将需要提供操作例程接口来实施具体的任务,其中会涉及到从VFS的inode到LFS inode的寻址过程,在根据入口参数中指定的VFS inode结构提供的信息定位到LFS的对应inode后,才能进而依据索引节点去寻找并存取相应的数据块。
以下是以EXT2文件系统的inode寻址为例来观察这一过程的详细步骤:(代码位置是/usr/src/linux x.x.x/fs/ext2/inode.c ext2_read_inode(struct inode* inode))
1. 检查入口参数指定的VFS inode的节点号是否在合法范围(11至EXT2_super_block_inodes_counts)内,检查不通过显然将提前返回。
2. 计算VFS inode 所在的块组号。这是由EXT系列文件系统数据块组织方案决定的。定位到具体的EXT2 inode前需要先找到管理这个节点的块组,因为块组中的组描述符将告之进一步寻址的关键信息。对应语句是block_group_ino = (inode->i_ino- 1)/EXT2_INODES_PER_GROUP(inode->i_sb).这里的宏指令用于返回每个块组中的inode总个数。
3. 利用上一步得到的结果,计算VFS inode块所对应EXT2 inode所在块组的块组描述符在该块中的位置即对应块号。这是由于整个EXT2文件系统的块组描述符表存储于每一块组中,而这张表又往往要占据多个数据块,因此这一步的寻址是必要的。对应语句是group_desc_index = block_group_ino / EXT2_DESC_PER_BLOCK_BITS(inode->i_sb);此处使用宏指令获取一个数据块中所能容纳的块组描述符的个数----一个块组描述符实体为相应的结构体。
4. 在第3步的基础上进一步计算所封需访问的EXT2 inode所在的块组描述符在已经定位的数据块中的位置,因为毕竟这一个数据块中包含着多个块组描述符结构。对应的语句为desc = block_group_ino & (EXT2_DESC_PER_BLOCK(inode->i_sb) - 1); 这实际上是为后面在块组描述符表的块高速缓冲区中索引要定位的EXT2 inode所在的索引节点表作准备的。
5. 计算所需访问的EXT2索引节点在其所在索引节点表中的偏移量,offset = (( inode->i_ino – 1) %EXT2_INODES_PER_GROUP(inode->i_sb)) * EXT2_INODE_SIZE(inode->i_sb);其中第一个宏指令用于计算每个块组中包含的索引节点个数,后者则是得到索引节点本身的大小。
6. 先定位目标EXT2 inode所在索引节点表,进而找到依据上步中得到的偏移定位所需的EXT2索引节点。
gdp = ((struct ext2_group_desc*)inode->i_sb->u.ext2_sb.s_group_desc[group_desc_index])->b_data;
block = gdp[desc].bg_inode_table + offset >> EXT2_BLOCK_SIZE_BITS(inode->i_sb);这里的宏指令也是用来返回索引节点的大小。
7. 利用前两步分别得到的offset 和 block即可定位到目标EXT2 inode,从这个磁盘索引节点中的信息容易访问到目标数据块。
以上便是EXT2提供的磁盘索引节点访问过程中的索引节点映射过程。事实上,其它的所有逻辑文件系统如果要通过VFS的统一接口被上层访问也都需要提供类似的逻辑文件系统层的操作例程。
分享到:
相关推荐
涉及到针对文件系统的操作时,VFS 把它们影射到与控制文件、目录以及 inode 相关的物理文件系统。 12. 当某个进程发布了一个面向文件的系统调用时,核心将调用 VFS 中相应的函数,这个函数处理一些与物理结构无关的...
在阅读`vfs.c`时,可以深入理解VFS如何处理文件系统的通用操作,以及如何调度这些操作到具体的文件系统驱动。 在`vfs.TXT`中,可能会详细解释VFS的工作原理,包括文件的打开、关闭、读取、写入、重命名、创建、删除...
"VFS(虚拟文件系统)简介" 虚拟文件系统(VFS)是一种抽象的文件系统,它提供了一个通用的接口来访问不同的文件系统。VFS 作为一个中间层,位于操作系统的内核和文件系统之间,负责管理文件系统的元数据和文件的存储...
- **挂载**:挂载过程涉及到查找VFS中的挂载点(通常是一个目录),然后通过`mount`系统调用将一个实际文件系统与该挂载点关联起来。挂载点在VFS目录树中创建一个`vfsmount`对象,并填充`super_block`信息。 - **...
3. **inode对象(Inode)**:在VFS中,inode代表文件的元数据,如文件的所有者、权限、创建时间、大小等。每个文件和目录都有一个唯一的inode号。 4. **dentry对象(Directory Entry)**:dentry是VFS中的目录项,...
文件系统注册是指将实际文件系统注册到 VFS 中的过程,每个实际文件系统都有其对应的数据结构,例如 struct file_system_type。 文章还详细介绍了 rootfs 文件系统的注册过程,rootfs 是 VFS 存在的基础,它是 ...
由于VFS的设计方式,新的文件系统可以很容易地被添加到系统中,而不会影响到其他部分的功能。 ##### 3. 高性能 VFS优化了数据缓存机制,通过缓冲区高速缓存(Buffer Cache)等技术提高文件读写性能。 #### 四、...
### 文件结构体 (`struct file`) 与 索引节点结构体 (`struct inode`) #### 一、`struct file` 结构体 `struct file` 是 Linux 内核中的一个重要数据结构,它用来描述内核空间中每一个打开的文件。这个结构体在 `...
此外,VFS还维护了inode cache和dentry cache,分别用于缓存inode和目录条目的信息,进一步加速了文件和目录的查找过程。 ### VFS与Page Cache的集成 VFS与page cache的紧密集成是Linux文件系统高效性的关键。page...
传统的字体加载方式可能会导致页面渲染延迟,而VFS Fonts通过将字体数据转化为JavaScript文件,可以在运行时动态注入到页面中,从而提高用户体验。 "vfs_fonts经典版.js"和"vfs_fonts微型版.js"是这个大全中的两个...
每个文件或目录在VFS中都有一个唯一的inode号,通过inode号可以在文件系统中快速定位文件。 4. **文件描述符(File Descriptors)**: 在用户空间,程序通过文件描述符访问文件,这是进程级别的抽象,每个进程有...
VFS文件编辑涉及到对这个层次结构的操作,包括读取、写入、创建、删除以及管理文件和目录。 在VFS中,每个文件系统都有一个文件系统驱动程序,负责与实际硬件或服务通信。VFS通过一组通用的系统调用来实现这些操作...
`struct file_operations`包含了对文件的各种操作,如打开、读取、写入等,这些操作通常从与file对象关联的inode复制而来。 总结来说,创建一个新的文件系统需要实现以下核心部分: 1. 实现`struct super_...
#### 二、从VFS到实际文件 ##### 2.1 存储介质中的核心数据 在深入了解VFS与实际文件之间的关系之前,我们需要首先明确存储介质中存放的数据类型。对于文件系统而言,存储介质中的数据主要包括两类:SuperBlock...
VFS的主要组成部分包括:k结构、dentry结构、inode结构、super block结构等数据结构,这些数据结构组成了VFS与逻辑文件系统之间的接口,提供了VFS对逻辑文件系统的操作。 在Linux中,VFS是内核的一个子系统,其它子...
3. **I/O操作**:实际的读写操作由底层文件系统完成,VFS在此过程中起到调度作用。 4. **缓存管理**:VFS使用缓冲区缓存(Buffer Cache)和页面缓存(Page Cache)来提高I/O性能。 5. **同步与异步**:VFS支持同步和...
在使用`commons-vfs-2.0`时,你需要将包含的jar文件添加到项目的类路径中。然后,你可以使用VFS提供的API来创建`FileObject`实例,进行后续的文件操作。例如,以下代码展示了如何打开并读取一个文件: ```java ...
在这个过程中,Linux会将实际文件系统的超级块挂载到VFS目录树中,并将文件系统的根目录挂载到VFS目录树的根目录下。 5. 安装根文件系统 安装根文件系统是指将根文件系统挂载到VFS目录树中的过程。在这个过程中,...
Linux采用虚拟文件系统(VFS)来处理不同文件系统的访问,VFS充当了一个中间层,使得系统可以透明地与各种类型的文件系统交互。 在基于inode的文件系统中,如常见的Ext2,每个文件都由两个关键部分组成:inode和...