当前课程知识点:Linux 内核分析与应用 >  第8章 文件系统 >  8.2 虚拟文件系统的主要数据结构 >  Video

返回《Linux 内核分析与应用》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《Linux 内核分析与应用》慕课在线视频列表

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的源代码看大家会产生什么样的疑问出来

本讲就讲到这里谢谢大家

Linux 内核分析与应用课程列表:

第1章 概述

-1.1 Linux操作系统概述

--1.1 Linux 操作系统概述

-1.2 Linux内核结构以及内核模块编程

--Video

-1.3 Linux内核源码中的双链表结构

--Video

-1.4 源码分析-内核中的哈希表

--Video

-1.5 动手实践-Linux内核模块的插入和删除

--Video

-第1章 概述--章节测验

-第1章导学--引领你进入Linux内核的大门

第2章 内存寻址

-2.1 内存管理之内存寻址

--Video

-2.2 段机制

--Video

-2.3分页机制

--Video

-2.4 动手实践-把虚拟地址转换成物理地址

--Video

-第2章 内存寻址--章节测验

-第二章导学-从零打造自己的操作系统

第3章 进程管理

-3.1 进程概述

--Video

-3.2 Linux进程创建

--Video

-3.3 Linux进程调度

--Video

-3.4 动手实践-打印进程描述符task_struct中的字段

--Video

-3.5工程实践-基于内核模块的负载监控

--Video

-第3章 进程管理--章节测验

-第三章导学-进程背后琳琅满目的宝贝到哪里挖?

第4章 内存管理

-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章 中断

-5.1 中断机制概述

--Video

-5.2 中断处理机制

--Video

-5.3 中断下半部处理机制

--Video

-5.4 时钟中断机制

--Video

-5.5 动手实践-中断上半部的代码分析及应用

--Video

-5.6 动手实践-中断下半部的代码分析及应用

--Video

-第5章 中断--章节测验

第6章 系统调用

-6.1 Linux中的各种API

--Video

-6.2 系统调用机制

--Video

-6.3 动手实践-添加系统调用(系统调用日志收集系统)

--Video

-第6章 系统调用--章节测验

第7章 内核同步

-7.1 内核同步概述

--Video

-7.2 内核同步机制

--Video

-7.3 动手实践-内核多任务并发实例(上)

--Video

-7.4 动手实践-内核多任务并发实例(下)

--Video

-第7章 内核同步--章节测验

第8章 文件系统

-8.1 虚拟文件系统的引入

--Video

-8.2 虚拟文件系统的主要数据结构

--Video

-8.3 文件系统中的各种缓存

--Video

-8.4 页高速缓存机制以及读写

--Video

-8.5 动手实践-编写一个文件系统(上)

--Video

-8.6 动手实践-编写一个文件系统(中)

--Video

-8.7 动手实践-编写一个文件系统(下)

--Video

-第8章 文件系统--章节测验

第9章 设备驱动

-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

直播视频:从Linux内核学习到自主操作系统研发

-从Linux内核学习到自主操作系统研发

附录:实验代码、课件以及相关素材

-各章实验代码

-《Linux内核分析与应用》课件

-《Linux操作系统原理与应用》教材课堂视频

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。