先来看一下写文件函数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. [CC-CHEFINV]Chef and Swaps

    [CC-CHEFINV]Chef and Swaps 题目大意: 长度为\(n(n\le2\times10^5)\)的数列,\(q(q\le2\times10^5)\)次询问,每次问交换\(A_x\) ...

  2. SQL SERVER 2008 多边形问题的解决

    报错内容: 在执行用户定义例程或聚合 "geometry" 期间出现 .NET Framework 错误: System.ArgumentException: 24144: 由于该 ...

  3. 解耦你的HTML,CSS和JAVASRIPT

    注:本文为翻译文章,原文<Decoupling Your HTML, CSS, and JavaScript> 今天在web上任何大一点的网站或应用程序都包含大量的html,css和jav ...

  4. python mac环境搭建

    安装 virtualenv $ sudo pip install virtualenv 然后建立一个测试目录: $ mkdir testvirtual $ cd testvirtual 就可以成功创建 ...

  5. elasticsearch中文分词+全文搜索demo

    本文假设你已经搭建好elasticsearch服务器,并在上面装了kibana和IK中文分词组件 elasticsearch+kibana+ik的安装,之前的文章有介绍,可参考. mapping介绍: ...

  6. servlet注入service业务bean

    项目中用到spring容器来管理业务bean,在servlet中就收到前台传递来的请求参数后,调用业务bean,老是出错 部门代码如下 <span style="font-size:1 ...

  7. MVC日期格式化,后台使用Newtonsoft.Json序列化日期,前端使用”f”格式化日期

    MVC控制器中,经常使用Newtonsoft.Json把对象序列化成json字符串传递到前端视图.当对象中有DateTime类型的属性时,前后台如何处理才能把DateTime类型转换成想要的格式呢? ...

  8. Spring事务传播机制与隔离级别(转)

    Spring事务传播机制与隔离级别 博客分类: Spring   转自:http://blog.csdn.net/edward0830ly/article/details/7569954 (写的不错) ...

  9. CentOS7部署Nginx

    CentOS7部署Nginx 1.准备工作 Nginx的安装依赖于以下三个包,意思就是在安装Nginx之前首先必须安装一下的三个包,注意安装顺序如下: 1 SSL功能需要openssl库,直接通过yu ...

  10. 转 iOS获取软键盘的高度

    - (void)viewDidLoad { [super viewDidLoad]; //增加监听,当键盘出现或改变时收出消息 [[NSNotificationCenter defaultCenter ...