linux文件系统(三)——进程与VFS的关系

声明:本Linux文件系统博客,共分四节,是根据网上多个相关博客,以及自己的理解加上相关资料总结而成。(作者:lvyilong316)

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

我们先看两个图:

 

 

1.files_struct

文件描述符是用来描述打开的文件的。每个进程用一个files_struct结构来记录文件描述符的使用情况,这个结构称为用户打开文件表(含有描述符表)。它是进程的私有数据。 

1.1数据结构

files_struct 结构体定义在文件 include/linux/fdtable.h该结构体由进程描述符中的files 域指向。所有与每个进程相关的信息如打开的文件及文件描述符都包含在其中。
  44struct files_struct {//文件描述符表
  45  /*
  46   * read mostly part
  47   */
  48        atomic_t count;                           //共享该表的进程数
  49        struct fdtable *fdt;                     
  50        struct fdtable fdtab;                  //定义了文件的一些属性
  51  /*
  52   * written part on a separate cache line in SMP
  53   */
  54        spinlock_t file_lock ____cacheline_aligned_in_smp;
  55        int next_fd;                                  //下一个文件描述符
  56        struct embedded_fd_set close_on_exec_init;   //*exec()关闭的文件描述符
  57        struct embedded_fd_set open_fds_init;        //文件描述符的初始集合
  58        struct file * fd_array[NR_OPEN_DEFAULT];    //默认的文件对象数组
  59};
1. 看看 struct fdtable结构:
struct fdtable {//位于struct files_struct中
          unsigned int max_fds;   //文件对象的上限
          struct file ** fd;      //全部文件对象数组
          fd_set *close_on_exec;   //*exec()关闭的文件描述符
          fd_set *open_fds;        //指向打开文件的描述符
          struct rcu_head rcu;    
          struct fdtable *next;    //指向该链表的下一个对象
  };
2.  fd数组指针指向已打开的文件对象链表,默认情况下,指向fd_arry数组。因为NR_OPEN_DEFAULT等于32,所以该数组可以容纳32个文件对象。如果一个进程所打开的文件对象超过32个。内核将分配一个新数组,并且将fd指向它。

 
对于在fd数组中有入口地址的每个文件来说,数组的索引就是文件描述符。通常,数组的第一个元素(索引为0)表示进程的标准输入文件,数组的第二个元素(索引为1)是进程的标准输出文件,数组的第三个元素(索引为2)是进程的标准错误文件)

1. fs_struct 

fs_struct 结构描述进程与文件系统的关系

2.1数据结构 

我们来深入分析其代码,它的定义在 include/linux/fs_struct.h,
  struct fs_struct {
           int users;            
           spinlock_t lock;                  //保护该结构体的锁
           int umask;                          //默认的文件访问权限
          int in_exec;
          struct path root, pwd;    
  };
看一下struct path 结构的定义 :
  struct path {
           struct vfsmount *mnt;
           struct dentry *dentry;
  }
可以看到struct path 封装了vfsmount 和dentry;,所以struct path root,pwd包含了当前进程的当前工作目录和根目录以及根目录安装点对象和pwd安装点对象。

3. file_system_type

在Linux中,用file_system_type来描述各种特定文件系统类型,比如ext3。也就是说Linux支持的所有文件系统类型都分别唯一的对应一个file_system_type结构。

3.1 数据结构

它的定义在 include/linux/fs.h中。

struct file_system_type {
        ......
};

成员说明:

(1) name:文件系统的名字,不能为空;
(2) get_sb:在安装文件系统时,调用此指针所指函数以在磁盘中获取超级块;
(3) kill_sb:卸载文件文件系统时候,调用此指针所指函数以进行一些清理工作;
(4) owner:如果一个文件系统以模块的形式加载到内核,则该字段用来说明哪个模块拥有这个结构。一般为THIS_MODULE;
(5) next:所有的文件系统类型结构形成一个链表,该链表的头指针为全局变量file_systems(struct file_system_type *file_systems)。这个字段指向链表中下一个文件系统类型结构;
(6) fs_supers:同一个文件系统类型下的所有超级块形成一个双联表,这个字段是这个双联表的头结点。超级块之间通过s_instances字段相互链接.

3.2 vfsmount结构体

当文件系统被实际安装时,将有一个vfsmount 结构体在安装点被创建。该结构体用来代表文件系统的实例即代表一个安装点。

vfsmount结构体被定义在 include/linux/mount.h中。vfsmount 结构还保存了在安装时指定的标志信息,该信息存储在mmt_flags中。

MNT_NOSUID:禁止该文件系统的可执行文件设置setuid和setgid标志

MNT_NODEV:禁止访问该文件系统上的设备文件

MNT_NOEXEC:禁止执行该文件系统上的可执行文件

说明:

在管理员安装一些不是很安全的移动设备时,这些标志很有用。

我们来看个图:

时间: 2024-08-18 02:22:29

linux文件系统(三)——进程与VFS的关系的相关文章

linux文件系统(二)——VFS四个主要对象的实现

声明:本Linux文件系统博客,共分四节,是根据网上多个相关博客,以及自己的理解加上相关资料总结而成.(作者:lvyilong316) VFS采用的是面向对象的设计思想,使用一簇数据结构来代表通用文件对象.所有内核中的数据结构都使用C结构体实现. 1.superblock(超级块)对象 保存一个挂在的文件系统的相关信息(Stores information concerning a mounted filesystem. For disk-based filesystems, this obje

linux文件系统(一)——VFS的概念

声明:本Linux文件系统博客,共分四节,是根据网上多个相关博客,以及自己的理解加上相关资料总结而成.(作者:lvyilong316) Linux 之所以能支持除了Ext2文件系统之外的各种文件系统,是因为Linux提供了一种统一的框架,就是所谓的虚拟文件系统转换(Virtual FilesystemSwitch),简称虚拟文件系统(VFS).这样, 用户程序可以通过同一个文件系统界面,也就是同一组系统调用,能够对各种不同的文件系统以及文件进行操作. 1. Linux中支持几十种文件系统,它是怎

linux中主进程与主线程的关系

问题描述 linux中主进程与主线程的关系 一直很困惑,linux环境下,程序启动时,会有主线程吗?如果有,这个主线程是在什么时候生成的,主进程又是什么时候生成的呢? 谢谢各位大大赐教! 解决方案 主线程和主进程是相对而言的,主函数里面fork了子进程那么主函数就是主进程.类似的,pthread_create了子线程,主函数就是主线程. 解决方案二: 进程启动的时候会有一个主线程,来执行Init初始化,调用_main() 函数等,这个线程就是主线程. 这个主进程概念是类似当它启动了子进程以后,那

Linux使用fuser命令找出访问文件系统的进程

fuser用于标识访问文件或socket的进程信息.下面以经常会遇到的不能卸载光驱为例,讨论fuser的用法: 1).卸载光驱文件系统: [root@vserver01 ~]# umount /mnt umount: /mnt: device is busy umount: /mnt: device is busy 2).找出依然在访问该文件系统的进程号: [root@vserver01 ~]# fuser -c /mnt /mnt: 2563c [root@vserver01 ~]# ps -

Linux文件系统及常用命令

Linux文件系统介绍: 一 .Linux文件结构 文件结构是文件存放在磁盘等存贮设备上的组织方法.主要体现在对文件和目录的组织上.目录提供了管理文件的一个方便而有效的途径. Linux使用树状目录结构,在安装的时候,安装程序已经为用户创建了文件系统和完整而固定的目录组成形式,并指定了每个目录的作用和其中的文件类型.                                                               ┃  /根目录 ┏━━┳━━━┳━━━┳━━━╋━━━┳

十天学Linux内核之第五天---有关Linux文件系统实现的问题

原文:十天学Linux内核之第五天---有关Linux文件系统实现的问题 有时间睡懒觉了,却还是五点多醒了,不过一直躺倒九点多才算起来,昨晚一直在弄飞凌的嵌入式开发板,有些问题没解决,自己电脑系统的问题,虽然Win10发布了,,但我还是好喜欢XP呀,好想回家用用家里的XP来玩玩这块板子,不知不觉也第五天了,感觉代码都有些模糊,连自己都不是很清楚了,担心现在分享起来比较困惑,各路大神多加批评呀,觉得渣渣的尽量指正出来,拉出来批评,今天还是来总结一下有关Linux文件系统的问题吧~ Linux的使用

linux文件系统初始化过程(1)---概述

术语表: struct task:进程 struct mnt_namespace:命名空间 struct mount:挂载点 struct vfsmount:挂载项 struct file:文件 struct super_block:超级块 struct dentry:目录 struct inode:索引节点   一.目的     linux文件系统主要分为三个部分:文件系统调用:虚拟文件系统(VFS):挂载到VFS的实际文件系统.     其中,VFS是核心,linux文件系统的本质就是在内存

linux文件系统初始化过程(2)---挂载rootfs文件系统

一.目的     本文主要讲述linux3.10文件系统初始化过程的第一阶段:挂载rootfs文件系统.     rootfs是基于内存的文件系统,所有操作都在内存中完成:也没有实际的存储设备,所以不需要设备驱动程序的参与.基于以上原因,linux在启动阶段使用rootfs文件系统,当磁盘驱动程序和磁盘文件系统成功加载后,linux系统会将系统根目录从rootfs切换到磁盘文件系统.   二.主要函数调用过程     图1描述了挂载rootfs的函数调用关系(图中红色部分),便于后面的分析.  

【ARM】制作Linux 文件系统

1从零开始由busybox 建立文件系统 1文件系统在LINUX 中的结构图 2编译好kernel 3Uboot 状态下显示的环境设置信息 4开始busybox 生成文件系统 5完善文件系统 第一步 init 会调用etcinittab 文件并根据其做相应的操作 第二步可以手工做些设置 第三步play MP3 第四步添加Login 修改inittab 为 创造文件rcS 2Linux 文件系统结构 1ext2 文件系统的总体存储布局 11Block 12Boot block 13Block Gr