zoukankan      html  css  js  c++  java
  • linux文件系统相关概念

    struct task_struct {

    .........................

    struct mm_struct*mm;//内存描述符的指针

    struct files_struct *file;    //进程打开文件表

    pid_t pid;

    ..............................

    };

    struct files_struct {
            atomic_t count;                               //引用计数
            spinlock_t file_lock;     /* Protects all the below members.  Nests inside tsk->alloc_lock */
     struct fdtable *fdt;                          //管理文件描述符
     struct fdtable fdtab;                         //管理文件描述符
            fd_set close_on_exec_init;                    //位图
            fd_set open_fds_init;                         //位图
            struct file * fd_array[NR_OPEN_DEFAULT];      //文件描述符数组
    };

    注意文件表项中有一个引用计数,来表示,多几个文件描述符,指向这个文件表项。。不同的文件描述符可以指向相同的文件表项

    /文件描述符数组/

    文件描述符数组对应的struct file指针,数组的元素,是指向file的指针

    apue中的对应图片是

    其中文件表项是struct file类型对象

    struct file {
        ……
         struct list_head        f_list;        /*文件对象链表*/
        struct dentry          *f_dentry;       /*相关目录项对象*/
        struct vfsmount        *f_vfsmnt;       /*相关的安装文件系统*/
        struct file_operations *f_op;           /*文件操作表*/
        ……
    };

    struct file_operations {
        ……
        //文件读操作
        ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
        ……
        //文件写操作
        ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
        ……
        int (*readdir) (struct file *, void *, filldir_t);
        ……
        //文件打开操作
        int (*open) (struct inode *, struct file *);
        ……
    };

    每个file结构体都有一个指向dentry结构体的指针,“dentry”是directory entry(目录项)的缩写。

    file对象中包含一个指针,指向dentry对象。dentry对象代表一个独立的文件路径,如果一个文件路径被打开多次,那么会建立多个file对象,但它们都指向同一个dentry对象。

    struct dentry {
      atomic_t d_count; 目录项对象使用计数器
      unsigned int d_flags; 目录项标志
      struct inode * d_inode; 与文件名关联的索引节点
      struct dentry * d_parent; 父目录的目录项对象
      struct list_head d_hash; 散列表表项的指针
      struct list_head d_lru; 未使用链表的指针
      struct list_head d_child; 父目录中目录项对象的链表的指针
      struct list_head d_subdirs;对目录而言,表示子目录目录项对象的链表
      struct list_head d_alias; 相关索引节点(别名)的链表
      int d_mounted; 对于安装点而言,表示被安装文件系统根项
      struct qstr d_name; 文件名
      unsigned long d_time; /* used by d_revalidate */
      struct dentry_operations *d_op; 目录项方法
      struct super_block * d_sb; 文件的超级块对象
      vunsigned long d_vfs_flags;
      void * d_fsdata;与文件系统相关的数据 
      unsigned char d_iname [DNAME_INLINE_LEN]; 存放短文件名
      }; 

    struct inode {
    unsigned long                     i_ino;
    atomic_t                               i_count;
    umode_t                               i_mode;
    unsigned int                        i_nlink;
    uid_t                                      i_uid;
    gid_t                                      i_gid;
    dev_t                                     i_rdev;
    loff_t                                      i_size;
    struct timespec                   i_atime;
    unsigned long                     i_blocks;
    unsigned short                    i_bytes;
    unsigned char                      _sock;
    12
    struct inode_operations *i_op;
    struct file_operations *i_fop; /* former ->i_op->default_file_ops */
    struct super_block *i_sb;
    ......
    }; 

    在内存中, 每个文件都有一个dentry(目录项)和inode(索引节点)结构,dentry记录着文件名,上级目录等信息,正是它形成了我们所看到的树状结构;而有关该文件(该文件可以是磁盘上面的目录文件)的组织和管理的信息主要存放inode里面,它记录着文件在存储介质上的位置与分布。同时dentry->d_inode指向相应的inode结构。dentry与inode是多对一的关系,因为有可能一个文件有好几个文件名(inode(可理解为ext2 inode)对应于物理磁盘上的具体对象,dentry是一个内存实体,其中的d_inode成员指向对应的inode。也就是说,一个inode可以在运行的时候链接多个dentry,而d_count记录了这个链接的数量。)

    VFS文件系统中的inode和dentry与实际文件系统的inode和dentry有一定的关系,但不能等同。真实磁盘文件的inode和dentry是存在于物理外存上的,但VFS中的inode和dentry是存在于内存中的,系统读取外存中的inode和dentry信息进行一定加工后,生成内存中的inode和dentry。虚拟的文件系统也具有inode和dentry结构,只是这是系统根据相应的规则生成的,不存在于实际外存中。

    我们谈到目录项和索引节点时,有两种含义。一种是在存储介质(硬盘)中的(如ext3_inode),一种是在内存中的,后者是根据在前者生成的。内存中的表示就是dentry和inode,它是VFS中的一层,不管什么样的文件系统,最后在内存中描述它的都是dentry和inode结构。

    VFS dentry结构:

    每个文件都有一个dentry(可能不止一个),这个dentry链接到上级目录的dentry。根目录有一个dentry结构,而根目录里的文件和目录都链接到这个根dentry,二级目录里的文件和目录,同样通过dentry链接到二级目录。这样一层层链接,就形成了一颗dentry树。从树顶可以遍历整个文件系统的所有目录和文件。

    为了加快对dentry的查找,内核使用了hash表来缓存dentry,称为dentry cache。dentry cache在后面的分析中经常用到,因为dentry的查找一般都先在dentry cache里进行查找。

    磁盘上面的概念:

    目录项:包括文件名和inode节点号(磁盘上面的概念)(用于指向磁盘数据块)inode是指向一个文件数据区的指针号码,一个inode对应着系统中唯一的一片物理数据区,而位于两个不同物理数据区的文件必定分别对应着两个不同的inode号码,这里是磁盘的dentry

    Inode:又称文件索引节点,是文件基本信息的存放地和数据块指针存放地。

    数据块:文件的具体内容存放地。

    inode指向的是数据块(数据块包括:普通文件块和目录文件块)

    硬连接和软连接:在磁盘层面上升到内存层面,linux操作系统的vfs层面。

    一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Linux系统允许,多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。

    即VFS中的多个dentry,对应同一个VFD中的inode。就是硬连接

    软连接:

    文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。这种文件的数据部分仅包含它所要链接文件的路径名

    软链接有自己的inode,并在磁盘上有一小片空间存放路径名。因此,软链接能够跨文件系统,也可以和目录链接!其二,软链接可以对一个不存在的文件名进行链接,但直到这个名字对应的文件被创建后,才能打开其链接。

    超级块和dentry关系:

    inode有一个指针指向超级块,超级块主要是描述文件类型(ext3还是别的类型),同时超级块有一个指针,指向dentry缓存中的dentry。表明此此文件系统是挂载在什么目录下面

  • 相关阅读:
    Linux ansible 常用模块二
    Linux之ansible 常用模块
    flask websocket实现用例
    flask--上下文原理
    python Django
    python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式
    并发编程 process 模块的方法及运用 僵尸与孤儿
    python 并发编程 操作系统 进程 并发.并行 及 同步/异步,阻塞/非阻塞
    python 网络编程粘包解决方案2 + ftp上传 + socketserver
    第一节 机器学习基础
  • 原文地址:https://www.cnblogs.com/kkshaq/p/4450973.html
Copyright © 2011-2022 走看看