Linux内核设计基础(四)之虚拟文件系统

先来看一下写文件函数write的运行过程:

ret = write(fd, buf, len);

write适用于各种文件系统。它首先运行sys_write(),而正是这个sys_write()进行实际文件系统类型的判别并运行该类型文件系统下的写操作。

我们能够看出在多种多样的文件系统上抽象出了一个通用接口性质的虚拟文件系统。



我们这里很关心Linux 2.6是怎样去实现VFS的。

先来看一下VFS中的四个基本的对象类型:

  • 超级块对象,它代表一个详细的已安装文件系统。
  • 索引节点对象,它代表一个详细文件。
  • 文件夹项对象,它代表一个文件夹项,是路径的一个组成部分。

  • 文件对象。它代表由进程打开的文件。
超级块
该对象用于存储特定文件系统的信息。由super_block结构体表示。

在文件系统安装时,文件系统会调用alloc_super()以便从磁盘读取文件系统超级块。并将其信息填充到内存中的超级块对象中。用超级块对索引节点进行操作,如创建和初始化、释放、写入磁盘等。


索引节点inode
用来代表文件,该对象包括了内核在操作文件或文件夹时须要的所有信息。

inode的存在是将文件的数据信息和控制信息进行分离。用结构体struct inode描写叙述。我们常见的文件操作create(创建文件)、mkdir(创建新文件夹)等,都是由索引节点对象来完毕的。


文件夹项对象
VFS中文件夹本身按文件对待,所以文件夹不是文件夹项对象。文件夹项对象是为了方便查找引入的,用结构体struct dentry描写叙述。


文件对象
不是用inode来描写叙述文件吗,怎么又有一个文件对象。这个文件对象表示进程已打开的文件。是已打开的文件在内存中的表示。由于多个进程能够同一时候打开和操作一个文件,所以同一个文件也可能存在多个相应的文件对象。

用struct file进行描写叙述,常见操作如open()、write()等。

原文地址:https://www.cnblogs.com/clnchanpin/p/6742118.html