1. 程式人生 > >Linux文件系統學習(二)之重要數據結構(1)

Linux文件系統學習(二)之重要數據結構(1)

class targe html evel 系統結構 會有 集合 spec lan

轉載自:https://blog.csdn.net/wudongxu/article/details/6436894

《Linux內核設計與實現》

http://www.ibm.com/developerworks/cn/linux/l-cn-vfs/

http://www.ibm.com/developerworks/cn/linux/l-linux-filesystem/

http://www.ibm.com/developerworks/cn/linux/l-cn-read/index.html

(1)file_system_type:

用於描述具體的文件系統的類型信息,所以被Linux支持的文件系統,都有且僅有一個file_system_type結構而不管它有零個或多個實例被安裝到系統中。如ext2,ext3,NFS。

struct file_system_type {
  const char *name;
  int fs_flags;
#define FS_REQUIRES_DEV   1 
#define FS_BINARY_MOUNTDATA 2
#define FS_HAS_SUBTYPE    4
#define FS_USERNS_MOUNT   8 /* Can be mounted by userns root */
#define FS_USERNS_DEV_MOUNT 16 /* A userns mount does not imply MNT_NODEV */
#define FS_RENAME_DOES_D_MOVE 32768 /* FS will handle d_move() during rename() internally. */
  struct
dentry *(*mount) (struct file_system_type *, int, const char *, void *); void (*kill_sb) (struct super_block *); struct module *owner; struct file_system_type * next; struct hlist_head fs_supers; struct lock_class_key s_lock_key; struct lock_class_key s_umount_key; struct
lock_class_key s_vfs_rename_key; struct lock_class_key s_writers_key[SB_FREEZE_LEVELS]; struct lock_class_key i_lock_key; struct lock_class_key i_mutex_key; struct lock_class_key i_mutex_dir_key; };

主要結構體成員說明:

name 文件系統的名字

fs_flags 文件系統類型標誌的bitmap(有6種類型)。

mount 在mount文件系統時候,會調用該函數創建suber_block,root_inode等相關信息。

kill_sb 在umount文件系統時候,調用該函數刪除suber_block。

owner 指向擁有這個結構的模塊,如果一個文件系統被編譯進內核,那麽該字段為NULL。

next 指向向下一個文件系統類型。

fs_supers 同一種文件類型的超級塊形成一個鏈表,fs_supers是這個鏈表的頭。

(2)超級塊對象(super_block):

存儲一個已安裝的文件系統的控制信息(文件系統的狀態、文件系統類型、塊大小、區塊數、索引節點數、臟標誌、操作方法),它代表一個已安裝的文件系統;每次一個實際的文件系統被安裝時,內核會從磁盤的特定位置(磁盤的超級塊位置)讀取一些控制信息來填充內存中的超級塊對象。一個安裝實例和一個超級塊對象一一對應。超級塊通過其結中的一個域s_type記錄它所屬的文件系統類型。即使安裝了兩個相同的文件系統(file_system_type一樣)也會有兩個超級塊(磁盤與內存都有兩個)。

struct super_block {
  struct list_head  s_list;   /* Keep this first */
  dev_t     s_dev;    /* search index; _not_ kdev_t */
  unsigned char   s_blocksize_bits;
  unsigned long   s_blocksize;
  loff_t      s_maxbytes; /* Max file size */
  struct file_system_type *s_type;
  const struct super_operations *s_op;
  const struct dquot_operations *dq_op;
  const struct quotactl_ops *s_qcop;
  const struct export_operations *s_export_op;
  unsigned long   s_flags;
  unsigned long   s_magic;
  struct dentry   *s_root;
  struct rw_semaphore s_umount;
  int     s_count;
  atomic_t    s_active;
#ifdef CONFIG_SECURITY
  void                    *s_security;
#endif
  const struct xattr_handler **s_xattr;

  struct list_head  s_inodes; /* all inodes */
  struct hlist_bl_head  s_anon;   /* anonymous dentries for (nfs) exporting */
#ifdef CONFIG_SMP
  struct list_head __percpu *s_files;
#else
  struct list_head  s_files;
#endif
  struct list_head  s_mounts; /* list of mounts; _not_ for fs use */
  /* s_dentry_lru, s_nr_dentry_unused protected by dcache.c lru locks */
  struct list_head  s_dentry_lru; /* unused dentry lru */
  int     s_nr_dentry_unused; /* # of dentry on lru */

  /* s_inode_lru_lock protects s_inode_lru and s_nr_inodes_unused */
  spinlock_t    s_inode_lru_lock ____cacheline_aligned_in_smp;
  struct list_head  s_inode_lru;    /* unused inode lru */
  int     s_nr_inodes_unused; /* # of inodes on lru */

  struct block_device *s_bdev;
  struct backing_dev_info *s_bdi;
  struct mtd_info   *s_mtd;
  struct hlist_node s_instances;
  struct quota_info s_dquot;  /* Diskquota specific options */

  struct sb_writers s_writers;

  char s_id[32];        /* Informational name */
  u8 s_uuid[16];        /* UUID */

  void      *s_fs_info; /* Filesystem private info */
  unsigned int    s_max_links;
  fmode_t     s_mode;
  /* Granularity of c/m/atime in ns.
     Cannot be worse than a second */
  u32      s_time_gran;

  /*
   * The next field is for VFS *only*. No filesystems have any business
   * even looking at it. You had been warned.
   */
  struct mutex s_vfs_rename_mutex;  /* Kludge */

  /*
   * Filesystem subtype.  If non-empty the filesystem type field
   * in /proc/mounts will be "type.subtype"
   */
  char *s_subtype;

  /*
   * Saved mount options for lazy filesystems using
   * generic_show_options()
   */
  char __rcu *s_options;
  const struct dentry_operations *s_d_op; /* default d_op for dentries */

  /*
   * Saved pool identifier for cleancache (-1 means none)
   */
  int cleancache_poolid;

  struct shrinker s_shrink; /* per-sb shrinker handle */

  /* Number of inodes with nlink == 0 but still referenced */
  atomic_long_t s_remove_count;

  /* Being remounted read-only */
  int s_readonly_remount;
};

  

這個super_block 數據結構十分的巨大,畢竟是包含一個文件系統的重要信息。對我們來說對這個數據結構全部說明,實際上是沒有必要的,只要記住一些關鍵的成員即可。等待實際的開發過程,如果有涉及到的話,再去重點關註即可。

s_list 一個雙向循環鏈表,把系統中所有的文件系統連接起來,一個super_block 在linux的文件系統結構中代表一個文件系統,s_list 包含了linux系統裏面所有的文件系統。

dev 設備標識符。

s_blocksize 文件系統塊大小

s_blocksize_bits 大小的位數

s_maxbytes   最大文件大小

s_type 文件系統類型

s_op suber_block 的操作集合,例如new_inode 等。

s_flags  文件系統的超級塊狀態。

s_magic 每一個超級塊的唯一魔術標識。

s_root      指向文件系統的根目錄的dentry(將在下來的文章中說明)結構體。

s_inodes       所有的這個文件系統的inode結構體都在這個隊列上。

s_id[32]      文件系統的名字

s_fs_info       文件系統的私有信息指針,這個指針是非常重要的,它實際是指向下層實際文件系統的結構體。

Linux文件系統學習(二)之重要數據結構(1)