繼上一篇文章:http://www.cnblogs.com/linhaostudy/p/7397024.html 3. 文件系統的註冊 這裡的文件系統是指可能會被掛載到目錄樹中的各個實際文件系統,所謂實際文件系統,即是指VFS 中的實際操作最終要通過它們來完成而已,並不意味著它們一定要存在於某種特定 ...
繼上一篇文章:http://www.cnblogs.com/linhaostudy/p/7397024.html
3. 文件系統的註冊
這裡的文件系統是指可能會被掛載到目錄樹中的各個實際文件系統,所謂實際文件系統,即是指VFS 中的實際操作最終要通過它們來完成而已,並不意味著它們一定要存在於某種特定的存儲設備上。比如在筆者的 Linux 機器下就註冊有 "rootfs"、"proc"、"ext2"、"sockfs" 等十幾種文件系統。
3.1 文件系統的數據結構
在 Linux 源代碼中,每種實際的文件系統用以下的數據結構表示:
1 struct file_system_type { 2 const char *name; 3 int fs_flags; 4 struct dentry *(*mount) (struct file_system_type *, int, 5 const char *, void *); 6 void (*kill_sb) (struct super_block *); 7 struct module *owner; 8 struct file_system_type * next; 9 struct hlist_head fs_supers; 10 11 struct lock_class_key s_lock_key; 12 struct lock_class_key s_umount_key; 13 struct lock_class_key s_vfs_rename_key; 14 15 struct lock_class_key i_lock_key; 16 struct lock_class_key i_mutex_key; 17 struct lock_class_key i_mutex_dir_key; 18 };
註冊過程實際上將表示各實際文件系統的 struct file_system_type 數據結構的實例化,然後形成一個鏈表,內核中用一個名為 file_systems 的全局變數來指向該鏈表的表頭。
--------------------------------------------------------------------------------
name:文件系統的名字,這個名字唯一的標識一種文件系統;
next:為文件系統的鏈表指針;
fs_supers:對於每一個mount的文件系統,系統都會為它創建一個super_block數據結構,該結構保存文件系統本省以及掛載點相關的信息。由於可以同時掛載多個同一文件系統類型的文件系統(比如/ 和/home都掛載了ext3文件系統),因此同一個文件系統類型會對應多個super block,@fs_supers就把這個文件系統類型對應的super block鏈接起來。
owner是指向module的指針,僅當文件系統類型是以模塊方式註冊時,owner才有效。
get_sb:這個函數非常重要,它VFS能夠和底層文件系統交互的起始點,該函數是不能放在super_block結構中的,因為super_block是在get_sb執行之後才能建立的。get_sb從底層文件系統獲取super_block的信息,是和底層文件系統相關的。
--------------------------------------------------------------------------------
3.2 註冊 rootfs 文件系統
在眾多的實際文件系統中,之所以單獨介紹 rootfs 文件系統的註冊過程,實在是因為該文件系統 VFS 的關係太過密切,如果說 ext2/ext3 是 Linux 的本土文件系統,那麼 rootfs 文件系統則是 VFS 存在的基礎。一般文件系統的註冊都是通過 module_init 巨集以及 do_initcalls() 函數來完成(讀者可通過閱讀module_init 巨集的聲明及 arch\i386\vmlinux.lds 文件來理解這一過程),但是 rootfs 的註冊卻是通過 init_rootfs() 這一初始化函數來完成,這意味著 rootfs 的註冊過程是 Linux 內核初始化階段不可分割的一部分。
1 static int __init init_ramfs_fs(void) 2 { 3 return register_filesystem(&ramfs_fs_type); 4 } 5 module_init(init_ramfs_fs) 6 7 int __init init_rootfs(void) 8 { 9 int err; 10 11 err = bdi_init(&ramfs_backing_dev_info); 12 if (err) 13 return err; 14 15 err = register_filesystem(&rootfs_fs_type); 16 if (err) 17 bdi_destroy(&ramfs_backing_dev_info); 18 19 return err; 20 }
init_rootfs() 通過調用 register_filesystem(&rootfs_fs_type) 函數來完成 rootfs 文件系統註冊的,其中rootfs_fs_type 定義如下:
1 struct file_system_type rootfs_fs_type = { \ 2 name: "rootfs", \ 3 read_super: ramfs_read_super, \ 4 fs_flags: FS_NOMOUNT|FS_LITTER, \ 5 owner: THIS_MODULE, \ 6 }
註冊之後的 file_systems 鏈表結構如下圖2所示: