Linux文件系統學習(二)之重要數據結構(1)
轉載自: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. */ structdentry *(*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; structlock_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)