题外话: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. vim命令行模式

    1. 激活命令行模式 : 进入命令行模式 <Esc>  退出命令行模式 2. 常用命令 :p 打印 (:print) :e 读入文件 (:edit) :w 写入文件 (:write) :t ...

  2. 李洪强经典面试题40-可能碰到的iOS笔试面试题-C语言

    可能碰到的iOS笔试面试题(4)--C语言 可能碰到的iOS笔试面试题(4)--C语言 C语言,开发的基础功底,iOS很多高级应用都要和C语言打交道,所以,C语言在iOS开发中的重要性,你懂的.里面的 ...

  3. 通过pyenv进行多版本python管理

    1.安装pyenv brew install pyenv 2.配置.zshrc文件 export PYENV_ROOT=/usr/local/var/pyenv if which pyenv > ...

  4. 关于并发模型 Actor 和 CSP

    最近在看<七天七并发模型>这本书,在书上介绍了 Actor 和 CSP 这两种并发模型.这两种模型很像,但还是有一些不同的地方.看完之后,比较困扰的是: 在什么场合使用哪种模型比较好呢? ...

  5. strpos 判断字符串是否存在

    strpos    中为什么要用逗号隔开的原因是因为   防止找出相匹配的中 ,  如   查找1    而数组中  存在  12  那么这个结果也是可以找出来的 ,分别在1 前后加个,  就是为了区 ...

  6. 怎样去掉a标签的蓝框

    直接上代码 *{-webkit-tap-highlight-color:rgba(255,0,0,0);} 我是直接给每一个都加了这个属性   其实没有必要 因为 只有a 标签 input 标签 和t ...

  7. Java 学习 day07

    01-面向对象(继承-概述).avi package myFirstCode; /* 将学生和工人的共性描述提取出来,单独进行描述, 只要让学生和工人与单独描述的这个类有关系,就可以了. 继承: 1. ...

  8. Discrete Function(简单数学题)

    Discrete Function There is a discrete function. It is specified for integer arguments from 1 to N (2 ...

  9. shell 字符串处理汇总(查找,替换等等)

    字符串: 简称“串”.有限字符的序列.数据元素为字符的线性表,是一种数据的逻辑结构.在计算机中可有不同的存储结构.在串上可进行求子串.插入字符.删除字符.置换字符等运算. 字符: 计算机程序设计及操作 ...

  10. 九度OJ 1196:成绩排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4339 解决:1476 题目描述: 用一维数组存储学号和成绩,然后,按成绩排序输出. 输入: 输入第一行包括一个整数N(1<=N< ...