Linux内核原理之虚拟文件系统(上)

虚拟文件系统(VFS): 作为内核子系统,为用户空间程序提供了文件和文件系统相关的接口

通用文件模型

在处理文件时,内核空间和用户空间使用的主要对象是不同的。在用户空间,一个文件由一个文件描述符标识,在打开文件时由内核分配,只在一个进程内部有效;内核空间中处理文件的关键是inode,每个文件或目录有且只有一个对应的inode,其中包含元数据(如访问权限、修改日期等)和指向文件数据的指针,但inode不包含文件名

inode

目录可看做一种特殊的文件

inode的成员分为两类:

  • 描述文件状态的元数据
  • 保存实际文件内容的数据段(或指向数据的指针)

举例说明,内核查找/usr/bin/emacs的过程:

  • 查找起始于inode,对应于/目录,它对应一个inode,其数据段包含根目录下的各个目录项(这些目录项可能代表文件或目录),每个项由两个成员组成:
    1. 该目录项数据所在的inode编号
    2. 文件或目录的名称(文件名和inode之间的关联通过inode编号建立)
  • 在/目录的inode数据段中查找名为usr的目录项,根据对应的inode编号定位/usr目录的inode;重复相同的步骤查找bin目录、emacs文件的inode
  • 最后,emacs的inode数据段包含实际文件的内容

注意:VFS实际的文件查找过程和以上基本一致,但会有些细节差异,如实际的实现使用了缓存加速查找操作,另外VFS需要和提供实际信息的底层文件系统通信

通用文件系统接口

在UNIX系统中,万物皆文件

VFS使得用户可以直接使用统一的系统调用,无需考虑具体的文件系统和物理介质

大多数设备都通过VFS定义的文件接口访问:

  • 字符和块设备
  • 进程之间的管道
  • 用于所有网络协议的套接字
  • 用于交互式输入和输出的终端

内核在底层文件系统接口上建立了一个抽象层,使得Linux能够支持各种文件系统。

实际文件系统的代码在统一的接口和数据结构下隐藏各自具体的实现细节,它们通过编程提供VFS所期望的抽象接口和数据结构

VFS结构

VFS由文件和文件系统两部分组成

结构概观
  1. 文件的表示

    对底层文件系统的操作使用函数指针来实现,他们保存在两个结构中:

    • inode操作:创建链接、文件重命名、在目录创建文件、删除文件
    • 文件操作:文件读写、设置文件位置指针、创建内存映射之类的操作

    每个inode包含一个指向底层文件系统超级块对象的指针,用于执行inode本身的一些操作

    文件和进程的联系:task_struct结构中的files数组,包含所有的打开文件(file结构),文件描述符作为数组的索引,同时file对象总包含一个指针指向用于加速查找操作的目录项缓存dentry对象

  1. 文件系统和超级块信息

    超级块包含了文件系统的关键信息(块长度、最大文件长度等),还有读、写、操作inode的函数指针

    内核建立了一个链表,包含了所有活动的文件系统超级块实例

    超级块结构中包含一个列表,包含相关文件系统所有修改过的inode脏inode),用于回写到存储介质(磁盘等)

Unix文件系统

四个基本要素:文件、目录项、索引节点和安装点(挂载点)

  • 目录项:路径中的每一部分都被称为目录条目,统称为目录项
  • 索引节点:Unix系统将文件的相关信息和文件本身这两个概念加以区分(如访问控制权限、大小、创建时间等),文件的相关信息(文件的元数据信息)被存储在一个单独的数据结构,称为索引节点(inode)
  • 超级块:是一种包含文件系统控制信息的数据结构,这些信息称为文件系统数据元

参考资料

  • Linux内核设计与实现
  • 深入Linux内核架构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值