首页 > 代码库 > Linux内核设计基础(四)之虚拟文件系统

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()等。