题外话: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. MQTT--入门

    一.简述  MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议 ...

  2. Android项目:使用pulltorefresh开源项目扩展为下拉刷新上拉加载更多的处理方法,监听listview滚动方向

    很多android应用的下拉刷新都是使用的pulltorefresh这个开源项目,但是它的扩展性在下拉刷新同时又上拉加载更多时会有一定的局限性.查了很多地方,发现这个开源项目并不能很好的同时支持下拉刷 ...

  3. python char()和ord()

    通过help 查看相关函数的帮助文档 >>>help (chr) chr(...) chr(i) -> character Return a string of one cha ...

  4. angularjs2中的父子组件通信

    父组件模板中引用子组件 // father template: ... <child-item [name] = "fatherItemName" > </chi ...

  5. IPython introduction

    转载:http://blog.csdn.net/gavin_john/article/details/53086766 1. IPython介绍 ipython是一个python的交互式shell,比 ...

  6. 从Java视角理解CPU缓存和伪共享

    转载自:http://ifeve.com/from-javaeye-cpu-cache/               http://ifeve.com/from-javaeye-false-shari ...

  7. C指针解析 ------ 指针的算术运算

    本文是自己学习所做笔记.欢迎转载.但请注明出处:http://blog.csdn.net/jesson20121020 指针是一个特殊的变量,表示一个地址,而地址能够上减去或加上一个整数,从而能够表示 ...

  8. 解决google登录界面input输入框颜色不正确问题

    加入以下样式: input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px #e2e2e2 inset !important; }

  9. Android Studio 2.0 稳定版新特性介绍

    Android Studio 2.0 最终迎来了稳定版本号,喜大普奔. 以下这篇文章是2.0新特性的一些简介. 假设想看具体内容请看这里<Android Studio有用指南> 文章转自这 ...

  10. Redis(Windows安装方法与Java调用实例 & 配置文件参数说明 & Java使用Redis所用Jar包 & Redis与Memcached区别 & redis-cli.exe命令及示例)

    Windows下Redis的安装使用 0.前言 因为是初次使用,所以是在windows下进行安装和使用,参考了几篇博客,下面整理一下 1.安装Redis 官方网站:http://redis.io/ 官 ...