题外话:Linux内核从2.x和3.x到现在最新的4.x变化非常大,最直观的表现就是很多书上的内核代码已经无法直接继续使用,所以看看新的源码是非常有意义的!

(下文中的内核源码都来自于 kernel 4.0.4 版本,本人都验证过正确,正文假设读者对 linux系统下mount命令有操作经验。另外,linux内核源码中关于文件操作的代码量比内存管理或者设备管理多了不止一个数量级,所以想要把每一 个地方完全说清楚是远在我能力之外的..这篇文章的意义就是帮助建立起来一个超级块,索引和目录的有层次的模型。以下的代码中我尽量保留了源码中的英文注 释,然后对于比较重要的部分都进行了翻译注解)

一. VFS(Virtual File System)处理文件系统挂载最基本的数据结构---vfsmount

vfsmount 这个结构体的功能不深入讨论,但是必须清楚的一点是每个文件系统都有一个这样的结构。首先必须要知道这个结构体是做什么用的,当文件系统要进行挂载工作的 时候,是与之对应的vfsmount结构体被添加到内核之中的一个全局链表---mount_hashtable数组链表之中。 mount_hashtable是个数组,每一个成员都是一个hash链表,例如在进行文件搜索的时候,遍历到一个“特殊的目录“(比如U盘挂载的目录) 时,就会进行从mount_table找到对应的链表头部,再遍历整个hash链表直到找到与之对应的vfsmount结构,然后将该特殊目录的目录结构 体dentry(下文详述)进行替换,使之成为新文件系统的根目录。如下是vfsmount结构体:

(一些较早的vfsmount结构体成员定义有十几个但是这里就只剩下了3个成员)


二. 文件系统“三大元老”

(1)super_block超级块

 
 超级块代表了整个文件系统的本身,一般来讲,超级块与vfsmount虽然一样是和整个文件系统一一对应的关系,但是super_block负责的是控
制的部分,而vfsmount单纯是挂载方面。这些在之后的文件操作之中详细再说,超级块和下面要说的索引结点和目录结点都是运用了C语言来实现面向对象编程,
用一个结构体来作为C++中的虚表或者JAVA中的接口。超级块结构体保存的是文件系统设定的文件块的大小,超级块的操作函数,和整个文件系统中的所有索
引结点。不同文件系统的控制会包含不同的控制信息,而super_block结构体保存了这些我们需要的结构体信息。super_block结构体的每个
成员都是推荐理解而不是强记,一是容易忘记,二是版本迭代太快,当然除非工作需要~


 

附:file_system_type结构体,可以跳过

(2)目录结点 dentry

  
件系统一般是以树状结构进行管理的,目录是最直观的表现,所有的目录一层一层组织,最终汇聚于根目录。对于这个树状结构是用dentry结构体进行组织
的。正如在linux中目录本身也是一个特殊的文件。每一个文件都一个dentry,这个dentry都被递归地链接到上层,直到根目录。为了加快进行查
找的速度,内核同样使用了hash表来缓存dentry,被称作dentry
cache,这个数据结构使用的非常的频繁,因为往往要反复对同一个文件继续操作,如果每次操作都需要在文件系统中进行一次搜索的话时间代价是非常高的,
所以大部分的遍历查找dentry之前都要先对dentry cache内进行查找。

 

(3)索引结点对象 inode

  索引结点对象和目录结点对象的最大不同在于:目录结点对象指的是逻辑意义上的文件,而索引结点对象指的是物理意义上
的文件,目录项在磁盘上并没有与之对应的映像,而每个索引节点在磁盘上都个与之对应的映像。inode就代表了一个文件,inode保存了文件的大小,创
建时间,文件的块的大小等参数,因为指向文件的路径可以有多个(比如ln命令产生的文件),而inode只有一个!inode结构和文件系统是无关
的,inode在文件的整个生命周期都存在,而且包含了磁盘上的维护的数据。

三. 内核中的文件对象 file

这个结构体实际上是和vfs架构没有联系的,只是在linux内核之中的文件对象,每当打开一个文件,内核之中就会创建一个对之相关联的file结构,并且传递给文件上进行操作的任何函数。在文件的所有实例都被释放了之后,内核中的file结构也就会被释放。

总结归纳:

(1)vfsmount,super_block,dentry,inode
结构在内核之中都有一个全局的hash表缓存用来加快访问的速度,每个hash数组存着hash链表将相同种类的结点种类放在同一个链表中,并专门设置一
个成员变量用来访问在hash链表中与之相邻的结点。

(2)file和dentry更多是逻辑意义上的,super_block和inode更多是物理意义上的。

(3)最后献上一张图,个人认为是总结linux文件系统结构最全面的一张图

<Linux内核源码>文件系统VFS内核4.0.4版本基本概念源码的更多相关文章

  1. 国产深度学习框架mindspore-1.3.0 gpu版本无法进行源码编译

    官网地址: https://www.mindspore.cn/install 所有依赖环境 进行sudo make install 安装,最终报错: 错误记录信息: cat     /tmp/mind ...

  2. linux文件系统体系结构 和 虚拟文件系统(VFS)

    图 1. Linux 文件系统组件的体系结构 用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开.读取.写和关闭)提供用户接口.系统调用接口的 ...

  3. 鸿蒙内核源码分析(VFS篇) | 文件系统和谐共处的基础 | 百篇博客分析OpenHarmony源码 | v68.01

    子曰:"质胜文则野,文胜质则史.文质彬彬,然后君子." <论语>:雍也篇 百篇博客系列篇.本篇为: v68.xx 鸿蒙内核源码分析(VFS篇) | 文件系统和谐共处的基 ...

  4. 使用 /proc 文件系统来访问 linux操作系统 内核的内容 && 虚拟文件系统vfs及proc详解

    http://blog.163.com/he_junwei/blog/static/19793764620152743325659/ http://www.01yun.com/other/201304 ...

  5. Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7)

    http://blog.chinaunix.net/uid-20543672-id-3157283.html Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3 ...

  6. Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7)【转】

    原文地址:Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://bl ...

  7. 鸿蒙内核源码分析(挂载目录篇) | 为何文件系统需要挂载 | 百篇博客分析OpenHarmony源码 | v65.01

    百篇博客系列篇.本篇为: v65.xx 鸿蒙内核源码分析(挂载目录篇) | 为何文件系统需要挂载 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...

  8. Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7)【转】

    原文地址:Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.c ...

  9. Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7)【转】

    前面粗略分析start_kernel函数,此函数中基本上是对内存管理和各子系统的数据结构初始化.在内核初始化函数start_kernel执行到最后,就是调用rest_init函数,这个函数的主要使命就 ...

随机推荐

  1. 防止Spinner初始化加载

    spinner在初始化的时候会自动调用一次OnItemSelectedListener,我们很多时候需要他不加载这一次,使用下面的代码spinner.setSelection(0, true);

  2. go结构体组合函数

    结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就简的语言,一切令人困惑的特性都必须去掉. 简单来讲,Go提供的结构体就是把使用各种数据类型定义的不同变量组合起来的高级数 ...

  3. jQuery 基础学习笔记总结(一)

    Jquery 学习笔记 总结 感想: 此前在做站点时用到过jquery相关,特别是Ajax相关技术.但是并没有系统的进行学习和了解Jquery的强大的功能,趁这几天跟着资料基本的了解下Jquery的特 ...

  4. Ubuntu16.04下搜狗输入法、Sublime Text 3的安装

    Ubuntu16.04下搜狗输入法.Sublime Text 3的安装 一.搜狗输入法 1. 安装中文语言 默认在Ubuntu16.04下是没有中文的,需要安装中文,在System Settings- ...

  5. Problem A. Dynamic Grid

    Problem We have a grid with R rows and C columns in which every entry is either 0 or 1. We are going ...

  6. label 标签的用法,点label选中单选、复选框或文本框

    <label>拥有的权限</label> <label class="checkbox" id="privilege_id" st ...

  7. cmake实战第一篇:初试 cmake

    1.准备工作: 首先,在/code_test 目录下建立一个 cmake 目录,用来放置我们学习过程中的所有练习.(如果以下命令出现xxx: cannot create directory ‘x’:  ...

  8. windows安装apache

    由于个人有强迫倾向,下载软件都喜欢从官网下载,摸索了好久终于摸清楚怎么从Apache官网下载windows安装版的Apache服务器了,现在分享给大家.   工具/原料   apache 方法/步骤 ...

  9. 博弈SG函数

    转自:Sprague-Grundy Function-SG函数--博弈论(3) 公平游戏的Sprague-Grundy定理 公平游戏是一种双人游戏,在游戏中双方都有完整的信息,没有牵涉,任何状态的合法 ...

  10. 基于PLSQL的数据库备份方法及如何解决导出clob和blob类型数据报错的问题

    基于PL/SQL的数据库备份方法 PL/SQL Developer是Oracle 数据库中用于导入或导出数据库的主要工具,本文主要介绍了利用PL/SQL Developer导入和导出数据库的过程,并对 ...