先来看一下写文件函数write的运行过程:

ret = write(fd, buf, len);

write适用于各种文件系统。它首先运行sys_write(),而正是这个sys_write()进行实际文件系统类型的判别并运行该类型文件系统下的写操作。

我们能够看出在多种多样的文件系统上抽象出了一个通用接口性质的虚拟文件系统。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQmx1ZUNsb3VkTWF0cml4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

我们这里很关心Linux 2.6是怎样去实现VFS的。

先来看一下VFS中的四个基本的对象类型:

  • 超级块对象,它代表一个详细的已安装文件系统。
  • 索引节点对象,它代表一个详细文件。
  • 文件夹项对象,它代表一个文件夹项,是路径的一个组成部分。

  • 文件对象。它代表由进程打开的文件。
超级块
该对象用于存储特定文件系统的信息。由super_block结构体表示。

在文件系统安装时,文件系统会调用alloc_super()以便从磁盘读取文件系统超级块。并将其信息填充到内存中的超级块对象中。用超级块对索引节点进行操作,如创建和初始化、释放、写入磁盘等。


索引节点inode
用来代表文件,该对象包括了内核在操作文件或文件夹时须要的所有信息。

inode的存在是将文件的数据信息和控制信息进行分离。用结构体struct inode描写叙述。我们常见的文件操作create(创建文件)、mkdir(创建新文件夹)等,都是由索引节点对象来完毕的。


文件夹项对象
VFS中文件夹本身按文件对待,所以文件夹不是文件夹项对象。文件夹项对象是为了方便查找引入的,用结构体struct dentry描写叙述。


文件对象
不是用inode来描写叙述文件吗,怎么又有一个文件对象。这个文件对象表示进程已打开的文件。是已打开的文件在内存中的表示。由于多个进程能够同一时候打开和操作一个文件,所以同一个文件也可能存在多个相应的文件对象。

用struct file进行描写叙述,常见操作如open()、write()等。

Linux内核设计基础(四)之虚拟文件系统的更多相关文章

  1. Linux内核设计笔记13——虚拟文件系统

    虚拟文件系统 内核在它的底层文件系统系统接口上建立一个抽象层,该抽象层使Linux可以支持各种文件系统,即便他们在功能和行为上存在很大差异. VFS抽象层定义了各个文件系统都支持的基本的.概念上的接口 ...

  2. linux内核(五)虚拟文件系统

    虚拟文件系统(VFS)是linux内核和具体I/O设备之间的封装的一层共通访问接口,通过这层接口,linux内核可以以同一的方式访问各种I/O设备. 虚拟文件系统本身是linux内核的一部分,是纯软件 ...

  3. (笔记)Linux内核学习(十)之虚拟文件系统概念

    虚拟文件系统 虚拟文件系统:内核子系统VFS,VFS是内核中文件系统的抽象层,为用户空间提供文件系统相关接口: 通过虚拟文件系统,程序可以利用标准Linux文件系统调用在不同的文件系统中进行交互和操作 ...

  4. Linux内核入门到放弃-虚拟文件系统-《深入Linux内核架构》笔记

    VFS的任务并不简单.一方面,它用来提供了一种操作文件.目录及其他对象的统一方法.另一方面,它必须能够与各种方法给出的具体文件系统的实现达成妥协,这些实现在具体细节.总体设计方面都有一些不同之处. 文 ...

  5. Linux内核设计基础(十)之内核开发与总结

    (1)Linux层次结构: (2)Linux内核组成: 主要由进程调度(SCHED).内存管理(MM).虚拟文件系统(VFS).网络接口(NET)和进程间通信(IPC)等5个子系统组成. (3)与Un ...

  6. Linux套接字与虚拟文件系统(1):初始化和创建

    http://www.cppblog.com/qinqing1984/archive/2015/05/03/210521.html 引言   在Unix的世界里,万物皆文件,通过虚拟文件系统VFS,程 ...

  7. (笔记)Linux内核学习(四)之系统调用

    一 用户空间和内核空间 Linux内核将这4G字节虚拟地址空间的空间分为两部分: l  将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”. l  ...

  8. 内核移植和文件系统制作(2):linux内核最小系统和initramfs文件系统

    linux内核最小系统,使用内核版本:https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.8.1.tar.bz2 1,FL2440板子的基本硬件: ...

  9. Linux内核设计基础(五)之内存管理

    我感觉学习操作系统首先要从内存分配和管理入手. 首先我们应该知道现代操作系统是以页为单位进行内存管理的,32位体系结构支持4KB的页.而64位体系结构支持8KB的页.页是用来分配的.怎样才干进行高效和 ...

随机推荐

  1. [HDU6198]number number number

    题目大意: 给定一个数k表示你可以从包括0的斐波那契数列中任取k个数,得到它们的和.求最小的不能得到的自然数. 思路: 打表找规律,可以发现答案为f(2k+3)-1,然后用公式f(i)=f(i/2)* ...

  2. 【BZOJ】4318: OSU!【期望DP】

    4318: OSU! Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 1473  Solved: 1174[Submit][Status][Discuss ...

  3. bzoj 1336 最小圆覆盖

    最小圆覆盖 问题:给定平面上的一个点集,求半径最小的一个圆,使得点集中的点都在其内部或上面. 随机增量算法: 定义:点集A的最小圆覆盖是Circle(A) 定理:如果Circle(A)=C1,且a不被 ...

  4. tyvj 1031 热浪 最短路

    热浪 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://tyvj.cn/p/1031 Description 德克萨斯纯朴的民眾们这个夏天正在遭受 ...

  5. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  6. java编译优化

    #java编译器对`String常量表达式`的优化:  - 1.String+String 可以被编译器识别为常量表达 String a="ab" ; String b=" ...

  7. amfphp2.1.1的使用经过

    这两天看了一个FLASH的教程,是arrowyong写的名为 <<ActionScript3.0从零基础学习类>>,这个教程好用,没有ActionScript编程经验的人,可以 ...

  8. 如何让access空值变成0?(确切的说是让access Null值变成0)

    方法一 if  IsNull(Me.新_退休费) = True Then Me.新_退休费 = 0 方法二 if Nz(Me.原_退休费) = Me.原_退休费 Then Me.原_退休费 = 0 有 ...

  9. 【微信小程序】处理时间格式,时间戳转化展示时间格式问题,调用外部js的默认方法function的问题

    默认的 小程序中new Date()显示的时间是这样的: 格式化时间的显示怎么做: 小程序的根目录下util目录下默认有一个util.js文件 其中util.js文件内容是: //数据转化 funct ...

  10. Spring+Quartz实现文件中转站

    其实这个功能QQ邮箱就有,为什么还要自己开发一个呢?因为有的文件非常重要...其实是客户要求... 那么我们先来看一下QQ的界面: 我们设计的界面: 文件要到期了是否通知用户?这里我们支持邮件及短信方 ...