当前课程知识点:Linux 内核分析与应用 > 第8章 文件系统 > 8.2 虚拟文件系统的主要数据结构 > Video
大家好今天我们讲文件系统中的第二讲
VFS中的主要数据结构
那么首先我们来看一下虚拟文件系统中对象的引入
虚拟文件系统的第一个词是虚拟这就意味着
这样的文件系统在磁盘或者其他存储介质上呢
并没有对应的存储信息
那么这样一个虚无的文件系统到底是怎么样形成的
尽管Linux支持多达几十种文件系统
但这些真实的文件系统并不是一下子都挂在系统中
他们实际上是按需被挂载的
老子说有无相生这个虚的VFS的信息
都来源于实的文件系统
所以VFS必须承载
各种文件系统的共有属性
另外这些实的文件系统
只有安装到系统中
VFS才予以认可也就是说
VFS只管理挂载到系统中的实际文件系统
既然VFS承担管家的角色
那么我们分析一下它到底要管理哪些对象
Linux在文件系统的设计中
全然汲取了Unix的设计思想
Unix在文件系统的设计中抽象出四个概念
文件目录项索引节点和超级块
VFS中共性对象的抽象
首先看超级块对象
它存放系统中已安装文件系统的有关信息
文件对象存放打开文件
与进程之间进行交互的有关信息
索引节点对象存放关于具体文件的一般信息
而目录项对象呢
是文件目录树中一个路径的组成部分
不管是目录还是普通文件
都是一个目录项对象
如图给出了这几种对象之间
简要的一种关系图
我们说超级块对象它是描述文件系统的属性
超级块用来描述整个文件系统的信息
每个具体的文件系统都有各自的超级块
VFS超级块是各种具体文件系统
在安装时建立的并在卸载时被自动删除
其数据结构就是super_block
所有超级块对象以双向链表的形式链接在一起
与超级块关联的方法就是超级块操作表
这些操作是由数据结构super_operations来描述的
如图所示
索引节点对象存储了文件的相关信息
代表了存储设备上的一个实际的物理文件
当一个文件首次被访问的时候呢 内核
会在内存中组织相应的索引节点对象
以便向内核提供对一个文件进行操作时
所必需的全部信息
这些信息一部分存储在磁盘特定位置
另外一部分是在加载时动态填充的
那么大家要通过这个数据结构
具体来了解索引节点到底描述了文件的哪些属性
下面我们来介绍一下目录项对象
我们说目录项对象它是描述文件的路径的
那么引入目录项的概念主要好处在于方便查找文件为目的
一个路径的各个组成部分不管是目录还是普通文件
都是一个目录项比如说在路径/home
/home/source/test.c中呢
其中呢目录/
目录home目录source和文件 test.c呢
都对应一个目录项对象
不同于前面的两个对象
目录项对象没有对应的磁盘数据结构
VFS在遍历路径名的过程中现场将它们逐个地解析成目录项对象
下面我们来介绍一下文件对象
它是来描述进程打开的文件
那么从这个数据结构里头我们可以看出呢
文件对象是对已打开的文件在内存中的表示
主要用于建立进程和磁盘上文件的对应关系
它由sys_open() 现场创建由sys_close()销毁
文件对象和物理文件的关系有点像
进程和程序的关系一样
当我们站在用户空间来看待VFS时候呢
我们只需与文件对象打交道
而无须关心超级块索引节点或者目录项
因为多个进程可以同时打开和操作同一个文件
所以同一个文件也可能存在多个对应的文件对象
文件对象仅仅在进程观点上代表已经打开的文件
它反过来指向目录项对象
一个文件对应的文件对象可能不是惟一的
但是其对应的索引节点和目录项对象无疑是唯一
下面我们来介绍用户打开文件表
这是与进程相关的文件结构
文件描述符是用来描述打开的文件的
每个进程用一个files_struct结构来记录
文件描述符的使用情况
这个files_struct结构称为进程打开文件表
它是进程的私有数据
再次强调每个打开的文件在内核中都有file对象
file_struct结构呢它是用来
记录进程打开的文件表
我们看一下具体数据结构的各个字段
fs_sturct结构呢它是来描述进程与文件系统之间的关系的
我们在这里列出这两个数据结构
主要字段以及相关的含义
下面我们对前面所介绍的这几个数据结构的关系来给予描述
我们说进程它是通过task_struct结构的
files域来了解当前所打开的文件对象
通过fs域了解进程所在的文件系统
文件对象通过域f_dentry呢
找到它对应的目录项对象
再由目录项对象的d_inode域呢
找到它所对应的索引结点
这样就建立了文件对象与实际的物理文件的关联
最后还有一点要说明的是
索引节点对象目录项对象以及文件对象所对应的操作函数列表呢
都是通过相应的操作域得到的
那么下面我们介绍一下与文件系统相关的三个数据结构
在上一讲里头已经介绍了两个数据结构
一个是文件系统类型我这讲介绍的超级块
那么在这里给出第三个数据结构
就是安装点数据结构vfsmount在这里列出了
这个数据结构及主要字段
以及它的含义那么下面我们来给出
超级块安装点或具体文件系统之间的关系
被Linux支持的文件系统
即使它有零个或多个实例被安装到系统中
但有且只有一个file_system_type的结构
也就是说它的文件的类型呢只有一个
每安装一个文件系统呢
都对应有一个超级块和安装点
超级块通过它的一个域s_type指向其对应的
具体的文件系统类型
具体的文件系统通过file_system_type中的一个域
fs_supers把具有
同一种文件类型的超级块链接起来
而同一种文件系统类型的超级块通过
s_instances域链接起来了
下面我们给一个小结
本讲介绍了文件系统的四种对象
每个对象都对应两个数据结构
也就是对象的属性以及操作的方法
这是面向对象思想在文件系统设计中的一种体现
与进程相关的结构
除file结构外还介绍了用户打开文件表和fs结构
文件系统相关的结构呢
除超级块外还介绍了安装点和文件系统类型
这些结构之间都有密切的关系
搞清楚它们之间的关系对于理解文件系统
并阅读源代码有非常大的帮助
最后我们来介绍一下参考资料
大家阅读深入理解Linux架构的第八章
还给出了一篇文章的链接
最后大家带着疑问上路
给定一个文件名通过文件系统的数据结构关系图
如何查找到相关的文件请大家初步阅读
open的源代码看大家会产生什么样的疑问出来
本讲就讲到这里谢谢大家
-1.1 Linux操作系统概述
-1.2 Linux内核结构以及内核模块编程
--Video
-1.3 Linux内核源码中的双链表结构
--Video
-1.4 源码分析-内核中的哈希表
--Video
-1.5 动手实践-Linux内核模块的插入和删除
--Video
-第1章 概述--章节测验
-2.1 内存管理之内存寻址
--Video
-2.2 段机制
--Video
-2.3分页机制
--Video
-2.4 动手实践-把虚拟地址转换成物理地址
--Video
-第2章 内存寻址--章节测验
-3.1 进程概述
--Video
-3.2 Linux进程创建
--Video
-3.3 Linux进程调度
--Video
-3.4 动手实践-打印进程描述符task_struct中的字段
--Video
-3.5工程实践-基于内核模块的负载监控
--Video
-第3章 进程管理--章节测验
-4.1 Linux内存管理机制
--Video
-4.2 进程用户空间管理机制
--Video
-4.3 物理内存分配与回收机制(上)
--Video
-4.4 物理内存分配与回收机制(下)
--Video
-4.5 动手实践-Linux内存映射基础(上)
--Video
-4.6 动手实践-Linux内存映射实现(中)
--Video
-4.7 动手实践-Linux内存映射测试(下)
--Video
-4.8 初学者对内存管理的常见疑惑
-第4章 内存管理--章节测验
-5.1 中断机制概述
--Video
-5.2 中断处理机制
--Video
-5.3 中断下半部处理机制
--Video
-5.4 时钟中断机制
--Video
-5.5 动手实践-中断上半部的代码分析及应用
--Video
-5.6 动手实践-中断下半部的代码分析及应用
--Video
-第5章 中断--章节测验
-6.1 Linux中的各种API
--Video
-6.2 系统调用机制
--Video
-6.3 动手实践-添加系统调用(系统调用日志收集系统)
--Video
-第6章 系统调用--章节测验
-7.1 内核同步概述
--Video
-7.2 内核同步机制
--Video
-7.3 动手实践-内核多任务并发实例(上)
--Video
-7.4 动手实践-内核多任务并发实例(下)
--Video
-第7章 内核同步--章节测验
-8.1 虚拟文件系统的引入
--Video
-8.2 虚拟文件系统的主要数据结构
--Video
-8.3 文件系统中的各种缓存
--Video
-8.4 页高速缓存机制以及读写
--Video
-8.5 动手实践-编写一个文件系统(上)
--Video
-8.6 动手实践-编写一个文件系统(中)
--Video
-8.7 动手实践-编写一个文件系统(下)
--Video
-第8章 文件系统--章节测验
-9.1 设备驱动概述
--Video
-9.2 I/O空间管理
--Video
-9.3 设备驱动模型
--Video
-9.4 字符设备驱动程序简介
--Video
-9.5 块设备驱动程序简介
--Video
-9.6 动手实践-编写字符设备驱动程序
--Video
-9.7工程实践-编写块设备驱动的基础(上)
--Video
-9.8 工程实践-块设备驱动程序分析(中)
--Video
-9.9 工程实践-块设备驱动程序实现(下)
--Video
-第9章 设备驱动--章节测验
-致谢与说明
--Video