系统中的每一个进程都有自己的一组打开的文件,像根文件系统,当前工作目录,安装点等。有三个数据结构将 VFS 层和系统的进程紧密的联系在一起,它们分别是:

file_struct,fs_struct 和 namespace 结构体。

 

      file_struct 结构体定义在文件 <linux/fdtable.h> 中。该结构体由进程描述符中的 files 目录项指向。所有的单个进程相关的信息(如打开的文件和文件描述符)都包含在其中,其结构和描述如下:

      struct files_struct {

          atomic_t count;   /*结构的使用计数*/
          struct fdtable *fdt;  /*指向其他 fd 表的指针*/
          struct fdtable fdtab;  /*基 fd 表*/
    
          spinlock_t file_lock;  /*单个文件的锁*/
          int next_fd;  /*缓存下一个可用的 fd */
          struct embedded_fd_set close_on_exec_init;  /*exec() 时关闭的文件描述符链表*/
          struct embedded_fd_set open_fds_init;  /*打开的文件描述符链表*/
          struct file * fd_array[NR_OPEN_DEFAULT];  /*缺省的文件对象数组*/
        };

 

      和进程相关的第二个结构体是 fs_struct 。该结构由进程描述符的 fs 域指向。它包含文件系统和进程的相关信息,定义在文件 <linux/fs_struct.h> 中,下面是它的具体结构体和各项描述:

        struct fs_struct {
                 int users;   /*用户数目*/
                 rwlock_t lock;  /*保护该结构体的锁*/
                 int umask;  /*掩码*/
                 int in_exec;  /*当前正在执行的文件*/
                 struct path root;  /*根目录路径*/
struct path pwd;   /*当前工作目录的路径*/
         };

      该结构包含了当前进程的当前工作目录(pwd)和根目录。

 

      第三个也是最后一个相关的结构体是 namespace 结构体。它定义在文件 <linux/mnt_namespace.h> 中,由进程描述符中的 mnt_namespace 域指向。2.4版内核以后,单进程命名空间被加入到内核中,它使得每一个进程在系统中都看到唯一的安装文件系统,不仅是唯一的根目录,而且是唯一的文件系统层次结构。下面是其具体结构和描述:

    struct mnt_namespace {
          atomic_t                count;   /*结构的使用数目*/
          struct vfsmount *       root;    /*根目录的安装点对象*/
          struct list_head        list;    /*安装点链表*/
          wait_queue_head_t poll;          /*轮询的等待队列*/
          int event;                       /*事件计数*/ 
};

list域是连接已安装文件系统的双向链表,它包含的元素组成了全体命名空间。

Linux2.6内核--VFS层中和进程相关的数据结构的更多相关文章

  1. linux内核中与进程相关的数据结构(基于linux3.16-rc4)

    1.进程描述符 struct task_struct { volatile long state; ....... struct list_head tasks; ....... struct mm_ ...

  2. linux内核数据结构--进程相关

    linux里面,有一个结构体task_struct,也叫“进程描述符”的数据结构,它包含了与进程相关的所有信息,它非常复杂,每一个字段都可能与一个功能相关,所以大部分细节不在我的研究范围之内,在这篇文 ...

  3. Linux2.6 内核的 Initrd 机制解析(转)

    from: https://www.ibm.com/developerworks/cn/linux/l-k26initrd/ 简介: Linux 的 initrd 技术是一个非常普遍使用的机制,lin ...

  4. 【转载】linux2.6内核initrd机制解析

    题记 很久之前就分析过这部分内容,但是那个时候不够深入,姑且知道这么个东西存在,到底怎么用,来龙去脉咋回事就不知道了.前段时间工作上遇到了一个initrd的问题,没办法只能再去研究研究,还好,有点眉目 ...

  5. Linux2.6内核实现的是NPTL

    NPTL是一个1×1的线程模型,即一个线程对于一个操作系统的调度进程,优点是非常简单.而其他一些操作系统比如Solaris则是MxN的,M对应创建的线程数,N对应操作系统可以运行的实体.(N<M ...

  6. 鸿蒙内核源码分析(进程概念篇) | 进程在管理哪些资源 | 百篇博客分析OpenHarmony源码 | v24.01

    百篇博客系列篇.本篇为: v24.xx 鸿蒙内核源码分析(进程概念篇) | 进程在管理哪些资源 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内 ...

  7. 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源 | 百篇博客分析OpenHarmonyOS | v2.07

    百篇博客系列篇.本篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核 ...

  8. linux内核分析作业6:分析Linux内核创建一个新进程的过程

    task_struct结构: struct task_struct {   volatile long state;进程状态  void *stack; 堆栈  pid_t pid; 进程标识符  u ...

  9. 第六周——分析Linux内核创建一个新进程的过程

    "万子恵 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 &q ...

随机推荐

  1. Aircrack-ng 工具箱

    官网为:http://www.aircrack-ng.org/, 它就是一个与WiFi 相关的工具啦,可以进行一些注入,抓包.破解WiFI等.里面有很多不同的套件. 另外,http://blog.cs ...

  2. Decorator Wrapper 装饰模式 包装

    简介 装饰模式 装饰模式以对客户端[透明]的方式[扩展]对象的功能,客户端并不会觉得对象在装饰前和装饰后有什么不同,是继承关系的一个替代方案. 若只为增加功能而使用继承,当基类较多时会导致继承体系越来 ...

  3. Android深入浅出之 AudioTrack分析

    Android深入浅出之Audio 第一部分 AudioTrack分析 一 目的 本文的目的是通过从Audio系统来分析Android的代码,包括Android自定义的那套机制和一些常见类的使用,比如 ...

  4. 关于c#流

     C#流的简单认识 前言 本篇文章简单总结了在C#编程中经常会用到的一些流.比如说FileStream.MemoryStream. BufferedStream. NetWorkStream. Str ...

  5. 通同select便签实现简单的二级联动

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. form表单中的label标签

    小伙伴们,你们在前面学习表单各种控件的时候,有没有发现一个标签--label,这一小节就来揭晓它的作用. label标签不会向用户呈现任何特殊效果,它的作用是为鼠标用户改进了可用性.如果你在 labe ...

  7. java面试题及答案(基础题122道,代码题19道)

    JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分, ...

  8. Nginx源码研究六:NGINX的配置文件分析

    上一篇写到nginx的各个模块的配置信息的存储结构,大体描述了对配置信息的配置项生成,定制,初始化过程.这里重点研究实现定制的过程,所谓实现定制,这里指的是,nginx系统提供使用者定义nginx的配 ...

  9. sock_ntop等函数

    inet_ntop的一个基本问题是:它要求调用者传递一个指向某个二进制地址的指针, 而该地址通常包含在一个套接字地址结构中,这就要求调用者必须知道这个结构的格式和地址簇, 为了使用这个函数,我们必须为 ...

  10. 集合及特殊集合arrayList

    1,运用集合  arrayList 首先复制Colections加  : 创建arrayList ar =new arrayList(); ArrayList具体提供的功能:属性            ...