诗和远方

VFS(虚拟文件系统)四大对象

Linux

VFS(虚拟文件系统)四大对象:struct super_block 超级块、struct inode 索引节点、struct dentry 目录项、struct file 文件对象


struct super_block(超级块)

定义在 include/linux/fs.h

超级块代表了整个文件系统,超级块是文件系统的控制块,有整个文件系统信息,一个文件系统所有的inode都要连接到超级块上,可以说,一个超级块就代表了一个文件系统。


struct inode(索引节点inode)

内核中用inode结构表示具体的文件,而用file结构表示打开的文件描述符。

inode结构体定义 struct inode 在文件 include/linux/fs.h 中。

inode 译成中文就是索引节点。存储设备被格式化为文件系统后,有两部份,一部份是inode,另一部份是Block,Block是用来存储数据用的。而inode呢,就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。

inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,能通过inode值最快的找到相对应的文件。

存储设备或分区就相当于一本书,Block相当于书中的每一页,inode 就相当于这本书前面的目录。一本书有很多的内容,如果想查找某部份的内容,我们可以先查目录


struct dentry(目录项)

directory entry,目录项,就是多个文件或者目录的链接,通过这个链接可以找寻到目录之下的文件或者是目录项。dentry在文件系统里是极其重要的一个概念,dentry结构体在linux内核里也是用处广泛,这个结构体定义在 include/linux/dcache.h 里。

dentry 的中文名称是目录项,目录项是描述文件的逻辑属性,只存在于内存中,并没有实际对应的磁盘上的描述,更确切的说是存在于内存的目录项缓存,为了提高查找性能而设计。

dentry是Linux文件系统中某个索引节点(inode)的链接。这个索引节点可以是文件,也可以是目录。所有的目录项在一起构成一颗庞大的目录树。

inode(可理解为ext2 inode)对应于物理磁盘上的具体对象,dentry是一个内存实体,其中的d_inode成员指向对应的inode。也就是说,一个inode可以在运行的时候链接多个dentry,而d_count记录了这个链接的数量。

VFS在查找的时候,根据一层一层的目录项找到对应的每个目录项的inode,那么沿着目录项进行操作就可以找到最终的文件。

注意:目录也是一种文件(所以也存在对应的inode)。打开目录,实际上就是打开目录文件。


struct file(文件)

struct file结构体在 include/linux/fs.h 中定义。文件结构体代表一个打开的文件,系统中的每个打开的文件在内核空间都有一个关联的 struct file。

它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。

在内核创建和驱动源码中,struct file的指针通常被命名为file或filp。

一个文件可以被多个进程打开,所以一个文件可以存在多个struct file。

Linux用file结构体来保存打开的文件的位置,所以file称为打开的文件描述。file结构形成一个双链表,称为系统打开文件表。

struct file只是对一个文件而言,对于一个进程(用户)来说,可以同时处理多个文件,所以需要另一个结构来管理所有的files:用户打开文件表files_struct

每个进程用一个files_struct结构来记录文件描述符的使用情况,这个files_struct结构称为用户打开文件表,它是进程的私有数据。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Catalog
标签列表
最新
最热
常用网站
站点信息
  • 文章总数:2016
  • 页面总数:1
  • 分类总数:17
  • 标签总数:518
  • 评论总数:0
  • 浏览总数:592287
Archives
Copyright © 2017-2019 www.my889.com Some Rights Reserved.
推荐使用 Chrome 浏览器浏览本站
沪ICP备17052342号
Sitemap XML