linux文件系统分析,Linux文件系统架构分析

Linux文件系统架构分析

1:架构设计

1.1:首先看一下Linux 中文件系统的逻辑关系示意图,如下:

0818b9ca8b590ca3270a3433284dd417.png

图1.1Linux 中文件系统的逻辑关系示意图

1.2:VFS虚拟文件系统又称虚拟文件系统转换( Virual Filesystem Switch)

之所以说它虚拟, 是因为它所有的数据结构都是在运行以后才建立, 并在卸载时删除, 而在磁盘上并没有存储这些数据结构, 显然如果只有 VFS, 系统是无法工作的, 因为它的这些数据结构不能凭空而来, 只有与实际的文件系统, 如 Ext2、 Minix、 MSDOS、 VFAT 等相结合, 才能开始工作, 所以 VFS 并不是一个真正的文件系统。 与 VFS 相对, 我们称 Ext2、 Minix、 MSDOS 等为具体文件系统。

VFS相当于在用户和真实文件系统之间加了层中介,使用户可以访问不同的文件系统。

1.3:MINIX,EXT2,MSDOS

真实的文件系统,用户调用的文件操作接口底层调用到这里,实现底层操作

0818b9ca8b590ca3270a3433284dd417.png

2:VFS设计解析

VFS设计思想上使用的是面向对象的思路(建立类描述共同的特性),使用一族数据结构来代表通用文件对象。

这些数据结构之间分别代表不同属性信息,从起始节点一层一层向下描述描述一个具体的文件。

VFS中有四个主要的对象,分别是:

a. 超级块对象(superblock):它代表一个已安装文件系统。

b. 索引节点对象(inode):它代表一个文件。

c. 目录项对象(dentry):它代表一个目录项,是路径的组成部分。

d. 文件对象(file):它代表由进程打开的文件。这类信息仅当进程访问文件期间存在于内存中。

每个对象都对应一个操作对象,相当于面向对象中的方法。

lSuper_operation对象,内核针对特定文件系统所能调用的方法,如:read_inode

lInode_operation对象,如:create()和link()等方法。

lDentry_opeartion对象,针对特定目录所能调用的方法,如:d_compare()和d_delete()

lFile对象:针对文件所能调用的方法,如read()和write()

2.1 超级快

很多具体文件系统中都有超级块结构, 超级块是这些文件系统中最重要的数据结构,它是来描述整个文件系统信息的, 可以说是一个全局的数据结构。 Minix、 Ext2 等有超级块,VFS 也有超级块, 为了避免与后面介绍的 Ext2 超级块发生混淆, 这里用 VFS 超级块来表示。VFS 超级块是各种具体文件系统在安装时建立的, 并在这些文件系统卸载时自动删除, 可见,VFS 超级块确实只存在于内存中,同时提到 VFS 超级块也应该说成是哪个具体文件系统的 VFS超级块。 VFS 超级块在 inculde/fs/fs.h 中定义, 即数据结构 super_block。

2.2索引节点

文件系统处理文件所需要的所有信息都放在称为索引节点的数据结构中。 文件名可以随时更改, 但是索引节点对文件是唯一的, 并且随文件的存在而存在。 有关使用索引节点的原因将在下一章中进一步介绍, 这里主要是强调一点, 具体文件系统的索引节点是存储在磁盘上的, 是一种静态结构, 要使用它, 必须调入内存, 填写 VFS 的索引节点, 因此, 也称VFS 索引节点是动态节点。 这里用 VFS 索引节点来避免与下一章的 Ext2 索引节点混淆。 VFS索引节点的数据结构 inode 在/includ/fs/fs.h 中。

2.3目录项

每个文件除了有一个索引节点 inode 数据结构外, 还有一个目录项 dentry(directoryenrty)数据结构。 dentry 结构中有个 d_inode 指针指向相应的 inode 结构。 读者也许会问,既然 inode 结构和 dentry 结构都是对文件各方面属性的描述, 那为什么不把这两个结构 “ 合而为一” 呢? 这是因为二者所描述的目标不同, dentry 结构代表的是逻辑意义上的文件,所描述的是文件逻辑上的属性, 因此, 目录项对象在磁盘上并没有对应的映像; 而 inode结构代表的是物理意义上的文件, 记录的是物理上的属性, 对于一个具体的文件系统( 如Ext2), Ext2_ inode 结构在磁盘上就有对应的映像。 所以说, 一个索引节点对象可能对应多个目录项对象。dentry 的定义在 include/linux/dcache.h 中。

2.4文件对象

在 Linux 中, 进程是通过文件描述符( file descriptors, 简称 fd) 而不是文件名来访问文件的, 文件描述符实际上是一个整数。 Linux 中规定每个进程能最多能同时使用NR_OPEN 个文件描述符, 这个值在 fs.h 中定义, 为 1024*1024( 2.0 版中仅定义为 256)。每个文件都有一个32 位的数字来表示下一个读写的字节位置,这个数字叫做文件位置。每次打开一个文件, 除非明确要求, 否则文件位置都被置为 0, 即文件的开始处, 此后的读或写操作都将从文件的开始处执行, 但你可以通过执行系统调用 LSEEK( 随机存储) 对这个文件位置进行修改。 Linux 中专门用了一个数据结构 file 来保存打开文件的文件位置, 这个结构称为打开的文件描述( open file description)。 这个数据结构的设置是煞费苦心。File结构如下:

0818b9ca8b590ca3270a3433284dd417.png

和进程结构的关系可以看我另外一篇task_stuct解析的文章。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值