閱讀382 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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_systemsstruct file_system_type *file_systems)。這個字段指向鏈表中下一個文件係統類型結構;
(6) fs_supers:同一個文件係統類型下的所有超級塊形成一個雙聯表,這個字段是這個雙聯表的頭結點。超級塊之間通過s_instances字段相互鏈接.

3.2 vfsmount結構體

當文件係統被實際安裝時,將有一個vfsmount 結構體在安裝點被創建。該結構體用來代表文件係統的實例即代表一個安裝點。

vfsmount結構體被定義在 include/linux/mount.h。vfsmount 結構還保存了在安裝時指定的標誌信息,該信息存儲在mmt_flags中。

MNT_NOSUID:禁止該文件係統的可執行文件設置setuidsetgid標誌

MNT_NODEV:禁止訪問該文件係統上的設備文件

MNT_NOEXEC:禁止執行該文件係統上的可執行文件

說明:

在管理員安裝一些不是很安全的移動設備時,這些標誌很有用。

我們來看個圖:


最後更新:2017-04-03 12:55:35

  上一篇:go slf4j-api、slf4j-log4j12以及log4j之間的關係
  下一篇:go static——直屬單位