从VFS inode到LFS inode的寻址过程

来源:互联网 发布:厦门智业软件 编辑:程序博客网 时间:2024/05/16 11:24

我们知道Linux是借用虚拟文件系统作为上层抽象的管理者来统一支持下层的各具差异的逻辑文件系统。应用程序要访问任何已经注册并挂载的逻辑文件系统相应物理存储外设都是通过VFS层次提供的统一调用接口来实现。Linux中对物理外存上的数据块采用的组织管理方式是借助称为索引节点(inode)的数据结构,因此当应用进程要与具体的逻辑文件系统进行数据存取时,相应的逻辑文件系统将需要提供操作例程接口来实施具体的任务,其中会涉及到从VFSinodeLFS 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的节点号是否在合法范围(11EXT2_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的统一接口被上层访问也都需要提供类似的逻辑文件系统层的操作例程。