`

从VFS inode到LFS inode的寻址过程

阅读更多
我们知道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_fonts大全

    vfs_fonts大全

    解析Linux的VFS机制

    本文侧重于通过具体的代码分析来解释 Linux 内核中 VFS 的内在机制,在这过程中会涉及到上层文件系统调用和下层实际文件系统的如何挂载。文章试图从一个比较高的角度来解释 Linux 下的 VFS 文件系统机制。

    VFS文件编辑

    VFS文件编辑

    commons-vfs jar包

    apache 虚拟文件系统 vfs jar包~~~~

    yaffs_vfs.c, android

    s/yaffs2/yaffs_vfs.c: In function 'yaffs_read_super': fs/yaffs2/yaffs_vfs.c:2383:2: error: implicit declaration of function 'get_sb_bdev' fs/yaffs2/yaffs_vfs.c: At top level: fs/yaffs2/yaffs_vfs.c:...

    设计和实现MINIX VFS

    设计和实现MINIX VFS 本书详细描述了minix3 vfs

    Linux VFS 虚拟文件系统资料收集

    解析 Linux 中的 VFS 文件系统机制.doc 比较好,写出了文件系统的初始化过程,我在网上找很多有关VFS虚拟文件系统的教程均没有写出这一过程,而这篇文章则写的很清楚且有图解.对没有看过此文档的兄弟强烈推荐! 2...

    default_vfs-normal.js

    (我是在引用jspdf插件时,出现中文乱码的时候,引用文件default_vfs.js解决中文乱码后由于文件过大,导致页面卡顿,后制作的default_vfs-normal.js字体文件,大概2M左右解决了加载慢的问题)jspdf中引入js后,加入...

    一遍很好介绍VFS文件系统结构的文章

    一遍很好介绍VFS文件系统结构的文章,主要介绍了如何在系统成形成文件系统、超级块、目录项、inode以及mnt表。并且详细介绍,新建目录和mount到另一个文件的时候,这几个数据块之间关系的变化

    打印VFS中的超级块

    打印VFS中的超级块打印VFS中的超级块打印VFS中的超级块打印VFS中的超级块打印VFS中的超级块打印VFS中的超级块打印VFS中的超级块打印VFS中的超级块打印VFS中的超级块打印VFS中的超级块打印VFS中的超级块打印VFS中的...

    commons-vfs-2.1源码

    commons-vfs-2.1源码

    linux操作系统vfs( ppt )

    linux操作系统vfs -- linux操作系统vfs

    commons-vfs-2.0.zip

    commons vfs 系列jar包 2.0版本 上传共享 方便下载

    commons-vfs2-2.2.jar

    通过VFS对文件进行一些操作,包括写入、读取文件,判断文件是否可读可写等使用2.0版本来实现。

    vfs.rar_VFS_linux vfs_linux 文件系统_vfs.c_vfs文件系统

    linux 的 VFS 文件系统说明

    commons-vfs2-2.1源码

    commons-vfs2-2.1-sources.jar

    VFS文件系统简要分析

    VFS文件系统简要介绍,重要数据结构与算法分析。

    commons-vfs-1.0的javaDoc

    apache 的vfs包的javaDoc,提供了API及其说明。

    commons-vfs-1.0-src

    apache的vfs源码。版本1.0,支持屏蔽协议的文件操作,包括文件上传,文件删除等。

Global site tag (gtag.js) - Google Analytics