VFS文件系统
<br />linux内核在用户程序(或C标准库)和文件系统实现之间引入了一个抽象层。该抽象层称之为虚拟文件系统(Virtual File system),简称VFS。<br />VFS的任务并不简单。一方面,他用来提供一种操作文件、目录以及其他对象的同一方法(对上层应用层)。另一方面,它必须能够与各种给出的具体文件系统的实现达成妥协(对下层的具体的文件系统),这些实现在具体细节、总体设计方面都有
linux内核在用户程序(或C标准库)和文件系统实现之间引入了一个抽象层。该抽象层称之为虚拟文件系统(Virtual File system),简称VFS。
VFS的任务并不简单。一方面,他用来提供一种操作文件、目录以及其他对象的同一方法(对上层应用层)。另一方面,它必须能够与各种给出的具体文件系统的实现达成妥协(对下层的具体的文件系统),这些实现在具体细节、总体设计方面都有一些不同之处。
文件系统的类型
文件系统分为三种类型
1、基于磁盘的文件系统,普通的文件系统
2、虚拟文件系统,在内核中生成,是一种使用户程序和用户通信的方法。eg,proc文件系统
3、网络文件系统是基于磁盘的文件系统和虚拟文件系统之间的折中。
通用文件模型
VFS提供一种结构模型,包含了一个功能强大文件系统所应具备的所有组件。但该模型只存在于虚拟中,必须使用各种对象和函数指针与每种文件系统适配。所有文件系统的实现都必须提供与VFS定义的结构配合的例程,以弥合两种视图之间的差异。
在处理文件时,内核空间和用户空间使用的主要对象是不同的。对用户程序来说,一个文件由一个文件描述符标识。该标识符是一个整数,在所有有文件相关的操作中用作标识文件的参数。文件描述符是在打开文件时由内核分配,只在一个进程中有效。两个不同的进程可以使用相同的文件标识符,但两者并不指向同一个文件。
内核处理文件的关键是inode.每个文件(和目录)都有且只有一个对应的Inode.
inode
如何用数据结构表示目录的层次结构?inode可以实现文件,也用于实现目录。
inode的成员可分为下列两类
1)描述文件状态的元数据
2)保存实际文件内容的数据段(或指向数据的指针)
为了阐明如何用Inode来构造文件系统的层次目录结构,我们来考察内核查找对应于/usr/bin/emacs的inode过程。
查找开始于inode,它表示根目录/,对系统来说总是已知的。该目录由一个Inode表示,其数据段并不包括普通数据,而是根目录下的各个目录项。这些项可能代表文件或其他目录。每个目录项由两个成员组成。(对于一个目录来说,他的Inode的数据段是目录项表,目录项表表示此目录下的文件/目录的文件名/目录名与其inode编号的关系)
1)该目录项的数据所在inode的编号
2)文件/目录的名称
系统中的所有inode都一个特定的编号,用于唯一的标识各个inode.文件名和inode之间的关联就是通过这个编号建立的。(inode块是在磁盘中专门保存inode结点的空间。inode块中保存了一个文件系统所有的inode结点。当系统创建一个文件或者添加一个设备时,系统就会从这个块中给这个文件分配一个inode结点。)
查找操作的第一步是查找子目录usr的inode.这一步会扫描根inode的数据段,直到找到一个名为usr的目录项(如果查找失败,则返回File not found错误)。相关的inode可以根据inode编号定位。
重复上面操作,但这一次在usr对应的inode的数据段中查找名为bin的目录项,以便根据bin的inode编号定位到bin的inode.下一步在bin的inode的数据段,将查找名为emacs的目录项。这仍返回一个Inode编号,这一次的inode表示文件而不是目录。
最后一个inode的内容,与前三个inode不同。前三个inode都表示目录,而文件内容是目录项的一个列表,包括子目录和文件。与emacs文件相关的inode,其数据段存储了文件的内容。过程如下:
这是普通文件的查找过程。
更多推荐
所有评论(0)