• 内核随记(四)文件系统(1)


    任务管理、内存管理和文件系统是内核最为核心的部分。其中内存管理最为复杂,文件系统最为庞大。内核通过引入虚拟文件系统,从而支持数十种不同的文件系统,不得不让人感叹Linux以及它显示出的开源的力量的强大。

    虚拟文件系统(Virtual Filesystem),也可以称为虚拟文件系统转换(Virual Filesystem Switch ,简称VFS),是Linux强大的集中体现。Linux通过VFS可以处理几十种特定的文件系统,它在内核中的位置如下:


    5.1、数据结构
    虚拟文件系统所隐含的主要思想在于引入了一个通用的文件模型,这个模型能够表示所有支持的文件系统。该模型严格遵守传统Unix文件系统提供的文件模型。通用文件模型由下列关键对象组成:
    (1)    超级块(superblock)对象:
    存放系统中已安装文件系统的有关信息。对于基于磁盘的文件系统,这类对象通常对应于存放在磁盘上的文件系统控制块,也就是说,每个文件系统都有一个超级块对象。
    (2)    索引节点(inode)对象:
    存放关于具体文件的一般信息。对于基于磁盘的文件系统,这类对象通常对应于存放在磁盘上的文件控制块(FCB),也就是说,每个文件都有一个索引节点对象。每个索引节点对象都有一个索引节点号,这个号唯一地标识某个文件系统中的指定文件。
    (3)    目录项(dentry)对象:
    存放目录项与对应文件进行链接的信息。VFS把每个目录看作一个由若干子目录和文件组成的常规文件。
    (4)    文件(file)对象:
    存放打开文件与进程之间进行交互的有关信息。这类信息仅当进程访问文件期间存在于内存中。
    进程与VFS之间的交互:

    5.1.1、超级块对象
    Code
    超级块和文件系统类型的关系如下:

    5.1.2、inode对象
    Code
    索引节点与超级块的关系:

    5.1.3、目录项对象
    Code
    超级块、索引节点与目录项的关系:

    5.1.4、文件对象
    Code
    超级块、索引节点、目录项和文件对象的关系:

    5.2、与进程相关的数据结构
    //include/linux/namespace.h
    //命名空间
    struct namespace {
        atomic_t        count; 
    //引用计数(共享命名空间的进程数)
        struct vfsmount *    root; //命名空间的根目录的安装文件系统描述符
        struct list_head    list;  //所有安装文件系统描述符的链表头
        struct rw_semaphore    sem; //读写信号量
    };
    //include/linux/fs_struct.h
    //进程的根目录和当前目录
    struct fs_struct {
        atomic_t count; 
    //引用计数(共享该结构的进程的个数)
        rwlock_t lock;
        
    int umask;
        
    struct dentry * root, * pwd, * altroot; //根目录对应的目录项,当前工作目录对应的目录项
        struct vfsmount * rootmnt, * pwdmnt, * altrootmnt; //根目录的安装点,当前工作目录的安装占
    };

    //include/linux/file.h
    //进程打开的文件表
    struct files_struct {
            atomic_t count;  
    //共享该表的进程个数
            spinlock_t file_lock;     /* Protects all the below members.  Nests inside tsk->alloc_lock */
            
    int max_fds;             /*当前文件对象的最大数*/
            
    int max_fdset;          /*当前文件描述符的最大数*/
            
    int next_fd;               /*已分配的文件描述符加1*/
            
    struct file ** fd;      /* 指向文件对象指针数组的指针 */
            fd_set 
    *close_on_exec; /*指向执行exec(  )时需要关闭的文件描述符*/
            fd_set 
    *open_fds;       /*指向打开文件描述符的指针*/
            fd_set close_on_exec_init;  
    /* 执行exec(  )时需要关闭的文件描述符的初值集合*/
            fd_set open_fds_init; 
    /*文件描述符的初值集合*/
            
    struct file * fd_array[NR_OPEN_DEFAULT]; /*文件对象指针的初始化数组*/
    };

    //include/linux/sched.h
    struct task_struct {
    //
        struct fs_struct *fs;  //文件系统信息
    /*
     open file information */
        
    struct files_struct *files;//打开的文件
    /*
     namespace */
        
    struct namespace *namespace;//文件系统命名空间
    //
    }
  • 相关阅读:
    年少时的"胡思乱想"
    daemon框架
    MVC框架,see again
    《Redis设计与实现》读书笔记
    小胖妞洗发水广告
    项目视图 Project Browser
    Unity 基础
    Unity手册-Unity概述
    rabbitmq 命令&& rabbitmq教程(一)
    C#动态方法调用 提高程序的扩展性
  • 原文地址:https://www.cnblogs.com/hustcat/p/1565012.html
Copyright © 2020-2023  润新知