VFS,super_block,inode,dentry—結構體圖解


總結:
VFS只存在於內存中,它在系統啟動時被創建,系統關閉時注銷。
VFS的作用就是屏蔽各類文件系統的差異,給用戶、應用程序、甚至Linux其他管理模塊提供統一的接口集合。
管理VFS數據結構的組成部分主要包括超級塊和inode。
 
VFS是物理文件系統與服務之間的一個接口層,它對Linux的每個文件系統的所有細節進行抽象,使得不同的文件系統在Linux核心以及系統中運行的進程看來都是相同的。
嚴格的說,VFS並不是一種實際的文件系統。它只存在於內存中,不存在於任何外存空間。VFS在系統啟動時建立,在系統關閉時消亡。
 
VFS使Linux同時安裝、支持許多不同類型的文件系統成為可能。VFS擁有關於各種特殊文件系統的公共界面,當某個進程發布了一個面向文件的系統調用時,內核將調用VFS中對應的函數,這個函數處理一些與物理結構無關的操作,並且把它重定向為真實文件系統中相應的函數調用,后者用來處理那些與物理結構相關的操作。
 
下圖就是邏輯上對VFS及其下層實際文件系統的組織圖,可以看到用戶層只能於VFS打交道,而不能直接訪問實際的文件系統,比如EXT2、EXT3、PROC,換句話說,
就是用戶層不用也不能區別對待這些真正的文件系統,不過,SOCKET雖然也屬於VFS的管轄范圍,但是有其特殊性,
就是不能像打開大部分文件系統下的“文件”一樣打開socket,它只能被創建,而且內核中對其有特殊性處理。
 
 
    VFS描述文件系統使用超級塊和inode 的方式,所謂超級塊就是對所有文件系統的管理機構,每種文件系統都要把自己的信息掛到super_blocks這么一個全局鏈表上。
內核中是分成2個步驟完成:首先每個文件系統必須通過register_filesystem函數將自己的file_system_type掛接到file_systems這個全局變量上,
然后調用kern_mount函數把自己的文件相關操作函數集合表掛到super_blocks上。每種文件系統類型的讀超級塊的例程(get_sb)必須由自己實現。
 
    文件系統由子目錄和文件構成。每個子目錄和文件只能由唯一的inode 描述。inode 是Linux管理文件系統的最基本單位,也是文件系統連接任何子目錄、文件的橋梁。
VFS inode的內容取自物理設備上的文件系統,由文件系統指定的操作函數(i_op 屬性指定)填寫。VFS inode只存在於內存中,可通過inode緩存訪問。
 

1、super_block

  • 相關的數據結構為:
  1. struct super_block
  2. {
  3. struct list_head s_list;/* Keep this first */// 連接super_block的鏈表
  4. dev_t s_dev;/* search index; _not_ kdev_t */
  5. unsignedlong s_blocksize;
  6. unsignedlong s_old_blocksize;
  7. unsignedchar s_blocksize_bits;
  8. unsignedchar s_dirt;
  9. unsignedlonglong s_maxbytes;/* Max file size */
  10. struct file_system_type *s_type;// 所表示的文件系統的類型
  11. struct super_operations *s_op;// 文件相關操作函數集合表
  12. struct dquot_operations *dq_op;//
  13. struct quotactl_ops *s_qcop;//
  14. struct export_operations *s_export_op;//
  15. unsignedlong s_flags;//
  16. unsignedlong s_magic;//
  17. struct dentry *s_root;// Linux文件系統中某個索引節點(inode)的鏈接
  18. struct rw_semaphore s_umount;//
  19. struct semaphore s_lock;//
  20. int s_count;//
  21. int s_syncing;//
  22. int s_need_sync_fs;//
  23. atomic_t s_active;//
  24. void*s_security;//
  25. struct xattr_handler **s_xattr;//
  26. struct list_head s_inodes;/* all inodes */// 鏈接文件系統的inode
  27. struct list_head s_dirty;/* dirty inodes */
  28. struct list_head s_io;/* parked for writeback */
  29. struct hlist_head s_anon;/* anonymous dentries for (nfs) exporting */
  30. struct list_head s_files;// 對於每一個打開的文件,由file對象來表示。鏈接文件系統中file
  31. struct block_device *s_bdev;//
  32. struct list_head s_instances;//
  33. struct quota_info s_dquot;/* Diskquota specific options */
  34. int s_frozen;//
  35. wait_queue_head_t s_wait_unfrozen;//
  36. char s_id[32];/* Informational name */
  37. void*s_fs_info;/* Filesystem private info */
  38. /**
  39. * The next field is for VFS *only*. No filesystems have any business
  40. * even looking at it. You had been warned.
  41. */
  42. struct semaphore s_vfs_rename_sem;/* Kludge */
  43. /* Granuality of c/m/atime in ns.
  44. Cannot be worse than a second */
  45. u32 s_time_gran;
  46. };
 
  • super_block存在於兩個鏈表中,一個是系統所有super_block的鏈表, 一個是對於特定的文件系統的super_block鏈表.
      所有的super_block都存在於 super_blocks(VFS管理層) 鏈表中:

  • 對於特定的文件系統(文件系統層的具體文件系統), 該文件系統的所有的super_block 都存在於file_sytem_type中的fs_supers鏈表中.
     而所有的文件系統,都存在於file_systems鏈表中.這是通過調用register_filesystem接口來注冊文件系統的.
     int register_filesystem(struct file_system_type * fs) 

 
 
2、inode
inode(發音:eye-node)譯成中文就是 索引節點 ,它用來存放檔案及目錄的基本信息,包含時間、檔名、使用者及群組等。
 
inode  是 UNIX 操作系統中的一種數據結構,其本質是 結構體 ,它包含了與文件系統中各個文件相關的一些重要信息。在 UNIX 中創建文件系統時,同時將會創建大量的 inode 。
通常,文件系統磁盤空間中大約百分之一空間分配給了 inode 表。
dentry的中文名稱是目錄項,是Linux文件系統中某個 索引節點 (inode)的鏈接。這個 索引節點 可以是文件的,也可以是目錄的。
 
inode對應於 物理磁盤 上的具體對象, dentry是一個內存實體,其中的d_inode成員指向對應的inode。
相關的數據結構為:
  1. /*
  2. * Keep mostly read-only and often accessed (especially for
  3. * the RCU path lookup and 'stat' data) fields at the beginning
  4. * of the 'struct inode'
  5. */
  6. struct inode
  7. {
  8. umode_t i_mode;
  9. unsignedshort i_opflags;
  10. kuid_t i_uid;
  11. kgid_t i_gid;
  12. unsignedint i_flags;
  13. #ifdef CONFIG_FS_POSIX_ACL
  14. struct posix_acl *i_acl;
  15. struct posix_acl *i_default_acl;
  16. #endif
  17. conststruct inode_operations *i_op;
  18. struct super_block *i_sb;
  19. struct address_space *i_mapping;
  20. #ifdef CONFIG_SECURITY
  21. void*i_security;
  22. #endif
  23. /* Stat data, not accessed from path walking */
  24. unsignedlong i_ino;
  25. /*
  26. * Filesystems may only read i_nlink directly. They shall use the
  27. * following functions for modification:
  28. *
  29. * (set|clear|inc|drop)_nlink
  30. * inode_(inc|dec)_link_count
  31. */
  32. union
  33. {
  34. constunsignedint i_nlink;
  35. unsignedint __i_nlink;
  36. };
  37. dev_t i_rdev;
  38. loff_t i_size;
  39. struct timespec i_atime;
  40. struct timespec i_mtime;
  41. struct timespec i_ctime;
  42. spinlock_t i_lock;/* i_blocks, i_bytes, maybe i_size */
  43. unsignedshort i_bytes;
  44. unsignedint i_blkbits;
  45. blkcnt_t i_blocks;
  46. #ifdef __NEED_I_SIZE_ORDERED
  47. seqcount_t i_size_seqcount;
  48. #endif
  49. /* Misc */
  50. unsignedlong i_state;
  51. struct mutex i_mutex;
  52. unsignedlong dirtied_when;/* jiffies of first dirtying */
  53. unsignedlong dirtied_time_when;
  54. struct hlist_node i_hash;
  55. struct list_head i_wb_list;/* backing dev IO list */
  56. struct list_head i_lru;/* inode LRU list */
  57. struct list_head i_sb_list;
  58. union
  59. {
  60. struct hlist_head i_dentry;
  61. struct rcu_head i_rcu;
  62. };
  63. u64 i_version;
  64. atomic_t i_count;
  65. atomic_t i_dio_count;
  66. atomic_t i_writecount;
  67. #ifdef CONFIG_IMA
  68. atomic_t i_readcount;/* struct files open RO */
  69. #endif
  70. conststruct file_operations *i_fop;/* former ->i_op->default_file_ops */
  71. struct file_lock_context *i_flctx;
  72. struct address_space i_data;
  73. struct list_head i_devices;
  74. union
  75. {
  76. struct pipe_inode_info *i_pipe;
  77. struct block_device *i_bdev;
  78. struct cdev *i_cdev;
  79. };
  80. __u32 i_generation;
  81. #ifdef CONFIG_FSNOTIFY
  82. __u32 i_fsnotify_mask;/* all events this inode cares about */
  83. struct hlist_head i_fsnotify_marks;
  84. #endif
  85. void*i_private;/* fs or device private pointer */
  86. };
inode存在於兩個雙向鏈表中:
一個是inode所在文件系統的super_block的 s_inodes 鏈表中
一個是根據inode的使用狀態存在於以下三個鏈表中的某個鏈表中:
  • 未用的: inode_unused 鏈表
  • 正在使用的: inode_in_use 鏈表
  • 臟的: super block中的s_dirty 鏈表
另外,還有一個重要的鏈表: inode_hashtable(這個暫不介紹).

3、 dentry
  1. struct dentry
  2. {
  3. /* RCU lookup touched fields */
  4. unsignedint d_flags;/* protected by d_lock */
  5. seqcount_t d_seq;/* per dentry seqlock */
  6. struct hlist_bl_node d_hash;/* lookup hash list */
  7. struct dentry *d_parent;/* parent directory */
  8. struct qstr d_name;
  9. struct inode *d_inode;/* Where the name belongs to - NULL is
  10. * negative */
  11. unsignedchar d_iname[DNAME_INLINE_LEN];/* small names */
  12. /* Ref lookup also touches following */
  13. struct lockref d_lockref;/* per-dentry lock and refcount */
  14. conststruct dentry_operations *d_op;
  15. struct super_block *d_sb;/* The root of the dentry tree */
  16. unsignedlong d_time;/* used by d_revalidate */
  17. void*d_fsdata;/* fs-specific data */
  18. struct list_head d_lru;/* LRU list */
  19. struct list_head d_child;/* child of parent list */
  20. struct list_head d_subdirs;/* our children */
  21. /*
  22. * d_alias and d_rcu can share memory
  23. */
  24. union
  25. {
  26. struct hlist_node d_alias;/* inode alias list */
  27. struct rcu_head d_rcu;
  28. } d_u;
  29. };
dentry對象存在於三個雙向鏈表中:
  • 所有未用的目錄項: dentry_unused 鏈表
  • 正在使用的目錄項: 對應inode的 i_dentry 鏈表
  • 表示父子目錄結構的鏈表
另外,還有一個重要的鏈表: inode_hashtable(這個暫不介紹).






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM