《linux内核设计与实现》笔记——vfs

xcy6666 xcy6666     2022-07-31     717

关键词:

关于VFS有一篇很好的博客http://www.ibm.com/developerworks/cn/linux/l-vfs/
建议先阅读本文为基础,然后继续阅读该文章。

VFS,虚拟文件系统,为用户提供了文件和文件系统相关的接口。
这些接口可以跨越各种文件系统和不同介质执行。
VFS提供了一个通用文件系统模型,该模型囊括了任何文件系统的常用功能集和行为。
这里写图片描述
该模型偏重于Unix风格的文件系统。

数据结构关系

如下图,下图描述了VFS相关数据结构的关系
这里写图片描述

Unix文件系统

Unix使用了4个和文件系统相关的传统概念:文件目录项索引节点安装点(mount point)

文件

简单的面向字节流的抽象

目录项

文件通过目录组织起来,目录中的每一个部分都是一个目录条目, /home/wolfman/butter , / , home, wolfman , butter 都是目录条目,统称为目录项

索引节点

Unix文件系统,将文件的相关信息和文件本身区分开来。文件控制信息,如权限,拥有者,大小,创建时间等”元数据”,被存储在一个单独的数据结构中,该结构被称为索引节点inode

安装点/挂载点

linux中的磁盘文件系统的入口目录,类似于windows中的用来访问不同分区的C:、D:、E:等盘符。[百度百科词条]

文件系统的信息存储在超级块中,集单独文件信息和文件系统信息于一身。
对于FAT,NTFS这种,虽然也可以在Linux上工作,但必须进行封装。比如:一个文件系统不支持索引节点,也必须在内存中装配索引节点结构体,就像它本身包含一样。

VFS对象及数据结构

  • 超级块对象

    • 代表一个具体的已安装文件系统,由super_block结构体表示,定义于<linux/fs.h>
    • 包含操作对象super_operations对象,包括内核针对特定文件系统所能调用的方法,定义于<linux/fs.h>
      • 超级块对象通过alloc_super()函数创建并初始化。在文件系统安装时,文件系统会调用该函数以便从磁盘读取文件系统超级块,并将其信息填充到内存中的超级块对象中
    • 各种文件系统都必须实现超级块对象,该对象用于存储特定文件系统信息,通常对应于存放在磁盘特定扇区的文件系统超级块或系统控制块。
      super_block
      http://lxr.free-electrons.com/source/include/linux/fs.h?v=3.11#L1242
      super_operations
      http://lxr.free-electrons.com/source/include/linux/fs.h?v=3.11#L1604
  • 索引节点对象

    • 代表一个具体文件,包含了内核在操作文件或目录时需要的全部信息,由inode结构体表示,定义于<linux/fs.h>
      • unix风格的文件系统可以直接从磁盘索引节点读入,如果一个文件系统没有索引节点,文件系统需要从磁盘上提取相关信息(没有inode的文件系统通常将文件描述信息作为文件的一部分)
      • 索引节点必须在内存中创建,以便于文件系统使用
    • 包含操作对象inode_operations对象,包括针对特定文件所能调用的方法,定义于<linux/fs.h>
    • 索引节点代表文件系统中的一个文件(但索引节点仅当文件被访问时,才在内存中创建),也可以是设备管道这样的特殊文件
      inode
      http://lxr.free-electrons.com/source/include/linux/fs.h?v=3.11#L523
      inode_operations
      http://lxr.free-electrons.com/source/include/linux/fs.h?v=3.11#L1559
  • 目录项对象
    • 代表一个目录项,是路径的一个组成部分,由dentry结构体表示,定义于<linux/dcache.h>
    • 包含dentry_operations对象,其中包括内核针对特定目录所能调用的方法,定义<linux/dcache.h>
    • VFS把目录当文件对待,路径中的每一个组成部分都由一个索引节点对象表示。为方便查找操作,vfs引入目录项,每个dentry代表路径中的一个特定部分,/bin/vi,这个路径,/,bin,vi(文件)都是目录项对象。
    • 目录项也可包括安装点,/mnt/cdrom/foo,构成元素/,mnt,cdrom,foo都是目录项
    • vfs在执行目录操作时,如果需要会现场创建目录项对象。
    • 目录学没有对应的磁盘数据结构,vfs根据字符串路径名现场创建
    • 目录项缓存在目录项缓存dcache中,以加速查找操作
      dentry
      http://lxr.free-electrons.com/source/include/linux/dcache.h?v=3.11#L106
      dentry_operations
      http://lxr.free-electrons.com/source/include/linux/dcache.h?v=3.11#L148
  • 文件对象
    • 代表由进程打开的文件,由file结构体表示,定义于<linux/fs.h>
    • 包含file_operations对象,其中包括进程针对已经打开的文件所能调用的方法,定义于<linux/fs.h>
    • 多个进程可以同时打开和操作同一个文件,所以同一个文件可能对应多个文件对象。
    • 文件对象仅在进程观点上代表已打开文件,它反过来指向dentry(反过来指向inode),只有目录项才代表打开的实际文件。文件对应的文件对象不是唯一的,但对应的索引节点和目录项对象和文件是唯一的。
      file
      http://lxr.free-electrons.com/source/include/linux/fs.h?v=3.11#L765
      file_operations
      http://lxr.free-electrons.com/source/include/linux/fs.h?v=3.11#L1528
      因为VFS将目录作为一个文件来处理,所以不存在目录对象。

其他相关数据结构

和文件系统相关的数据结构

  • file_system_type
    • 用来描述各种特定文件系统,定义于<linux/fs.h>,如ext3,ext4
    • 每种文件系统,不论是否被安装,都只有一个file_system_type结构体
      kernel 3.11
struct file_system_type {
         const char *name;
         int fs_flags;
#define FS_REQUIRES_DEV         1 
#define FS_BINARY_MOUNTDATA     2
#define FS_HAS_SUBTYPE          4
#define FS_USERNS_MOUNT         8       //Can be mounted by userns root 
#define FS_USERNS_DEV_MOUNT     16 // A userns mount does not imply MNT_NODEV 
#define FS_RENAME_DOES_D_MOVE   32768   /* FS will handle d_move() during rename() internally. */
         struct dentry *(*mount) (struct file_system_type *, int,const char *, void *);
        void (*kill_sb) (struct super_block *);
        struct module *owner;
        struct file_system_type * next;
        struct hlist_head fs_supers;

        struct lock_class_key s_lock_key;
        struct lock_class_key s_umount_key;
        struct lock_class_key s_vfs_rename_key;
        struct lock_class_key s_writers_key[SB_FREEZE_LEVELS];

        struct lock_class_key i_lock_key;
        struct lock_class_key i_mutex_key;
        struct lock_class_key i_mutex_dir_key;
};
  • vfsmont
    • 用来描述一个安装文件系统的实例,定义于<linux/mount.h>
    • 文件系统被实际安装时,一个vfsmount结构在安装点创建,代表文件系统的实例,换句话说,代表安装点。
struct vfsmount {
     struct dentry *mnt_root;/* root of the mounted tree */
     struct super_block *mnt_sb;/* pointer to superblock */
     int mnt_flags;
};

和进程相关的数据结构

file_struct
定义于<linux/fdtable.h> 与单个进程相关的信息都包含在内
fs_struct
定义于<linux/fs_struct.h> 包含文件系统和进程相关信息
namespace
定义于<linux/mnt_namespace.h>
使得每一个进程在系统中看到唯一的安装文件系统,不仅是唯一的根目录,而是唯一的文件系统层次结构

Linux存储栈

这里写图片描述
[ https://www.thomaskrenn.com/en/wiki/Linux_Storage_Stack_Diagram ]

《linux内核设计与实现》笔记——内核同步简介

相关概念竞争条件多个执行线程(进程/线程/中断处理程序)并发(并行)访问共享资源,因为执行顺序不一样造成结果不一样的情况,称为竞争条件(racecondition)举例说明#include<thread>usingnamespacestd;inti=0;voidthread1(){//for(intx=0;x&... 查看详情

《linux内核设计与实现》读书笔记从内核出发(代码片段)

内核源码获取①可以直接登录linux内核官方网站http://www.kernel.org,可以随时获取当前版本的linux源代码②也可以使用git工具从远程仓库下载,地址:LinuxKernel:Linux内核源码镜像如:gitclonegit@gitee.com:mirrors/linux_old1.git这... 查看详情

《linux内核设计与实现》读书笔记linux内核简介

Unix的历史①Unix诞生于1969年,至今仍然被认为是现存操作系统中最强大和最优秀的系统。②Unix起源于一个失败的多用户操作系统Multics,Multics终止而Unix萌生。③1973年整个Unix操作系统用C语言进行了重写,为后面各种... 查看详情

《linux内核设计与实现》读书笔记-内核同步方法(代码片段)

...3.读写自旋锁4.信号量5.读写信号量6.互斥体7.完成变量8.大内核锁9.顺序锁10.禁止抢占11.顺序和屏障12.总结内核中提供了多种方法来防止竞争条件,理解了这些方法的使用场景有助于我们在编写内核代码 查看详情

《linux内核设计与实现》学习笔记——中断中断处理程序

...线,每个irq线关联一个数值。中断处理程序响应中断时,内核会执行一个函数,中断处理程序/中断服务例程ISR,一个设备的中断处理程序是他的设备驱动的一部分。IO资源包括:中断,I/O端口,共享RAM,DMA。驱动程序需要管理注... 查看详情

《内核设计与实现》读书笔记-进程管理

...程序以及相关的资源的总称。线程是进程中活动的对象。内核调度的对象是线程,而不是进程。进程和线程的管理操作(比如创建和销毁)都是由内核来实现的。Linux中的进程于Windows相比是很轻量级的,而且不严格区分进程和线... 查看详情

《linux内核设计与实现》读书笔记linux进程管理(代码片段)

...于执行期的程序,通常进程还包含挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个或多个执行线程,还包含存放全局变量的数据段等。②线程是进程中活动的对象ÿ... 查看详情

《linux内核设计与实现》学习笔记——i/o调度算法

I/O调度子系统用于调度来自多个进程对块设备的I/O请求。电梯调度首先,如果队列中已存在一个对相邻磁盘扇区操作的请求,那么新请求将和这个已经存在的请求合并为一个请求。2.如果队列中存在一个驻留时间过长的请求,那... 查看详情

《linux设计与实现》笔记——系统调用工作原理添加系统调用的过程

系统调用的意义为了和用户空间上的进程进行交互,内核提供的提供的一组接口。应用程序通过这组接口访问硬件和其他操作系统资源。完成对硬件和资源访问的控制。安全、可靠,多任务、虚拟必须硬件设备的抽象(提供设备... 查看详情

《linux内核设计与实现》读书笔记-内核同步方法(代码片段)

...3.读写自旋锁4.信号量5.读写信号量6.互斥体7.完成变量8.大内核锁9.顺序锁10.禁止抢占11.顺序和屏障12.总结内核中提供了多种方法来防止竞争条件,理解了这些方法的使用场景有助于我们在编写内核代码时选用合适的同步方法&#... 查看详情

《linux内核设计与实现》知识整合与讲解-第一章

Linux内核简介第一章主要对Linux的内核进行一个大致的介绍,让大家对Linux的内核有一个比较全面的印象。众所周知Linux起源于unix系统,它们之间有着千丝万缕的联系,伟大的linux之父linus不满于当时unix对于源码更改的限制,花费... 查看详情

读薄《linux内核设计与实现》-中断与同步

这篇文章是《读薄「Linux内核设计与实现」》系列文章的第IV篇,本文主要讲了以下问题:中断和中断处理程序的概念与实现原理、Linux中的下半部以及内核同步方法。0x00中断和中断处理程序I中断中断是一种特殊的电信号,由硬... 查看详情

《linux内核设计与实现》读书笔记linux进程管理(代码片段)

...于执行期的程序,通常进程还包含挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个或多个执行线程,还包含存放全局变量的数据段等。②线程是进程中活动的对象ÿ... 查看详情

《linux设计与实现》学习笔记——定时器和时间管理

...驱动事件的准确度;调度的粒度更细,进程抢占更准确;内核定时器以更高的频度和准确度执行。 查看详情

linux内核编译步骤及配置详解(代码片段)

...3,RING0级别最高,这样linux用户代码运行在RING3下,内核运行在RING0,这样系统本身就得到了充分的保护用户空间(用户模式)转到内核空间(系统模式)方法:·系统调用·硬件中断linuxkernel体系结构:虚拟文件系统VFS:VFS(... 查看详情

linux文件存储抽象vfs

...#xff09;称为虚拟文件系统或虚拟文件系统转换,是一个内核软件层,在具体的文件系统之上抽象的一层,用来处理与Posix文件系统相关的所有调用,表现为能够给各种文件系统提供一个通用的接口,使上层的应... 查看详情

linux内核设计与实现的目录

参考技术A译者序序言前言作者简介第1章 Linux内核简介11.1 Unix的历史11.2 追寻Linus足迹:Linux简介21.3 操作系统和内核简介31.4 Linux内核和传统Unix内核的比较51.5 Linux内核版本71.6 Linux内核开发者社区81.7 小结8第2章 从内... 查看详情

vfs之基本数据结构

...统在Linux操作系统中担任着重大的作用。一、VFS介绍Linux内核通过虚拟文件系统(VirtualFileSyst 查看详情