1.根文件系統的掛載
- mount_root[init/do_mounts.c]
- create_dev(“/dev/root”, ROOT_DEV) ==> how to do this
- sys_unlink(“/dev/root”)
- sys_mknod(“/dev/root”,…)
- mount_block_root(“/dev/root”, flags)
- get_fs_names -> copy root_fs_names
- do_mount_root ==> 調用系統調用sys_mount,sys_chdir(“/root”),爲當 前進程current->fs.pwd.dentry設置掛載返回的root dentry
- sys_mount ==>進入系統調用
- create_dev(“/dev/root”, ROOT_DEV) ==> how to do this
2.進入系統調用的掛載,也是用戶態掛載文件系統的入口
- sys_mount[fs/namespace.c]
- copy_mount_string
- copy_mount_options
- do_mount
- user_path(dirname, &path) -> path_lookupat ==> 獲取掛載路徑的struct path,查找路徑是很複雜的過程:)
- do_remount
- do_loopback
- do_change_type
- do_move_mount
- do_new_mount ==> 構建虛擬掛載點vsfmount,檢查設置namespace
- get_fs_type ==> 在file_systems查找傳入的文件系統類型
- vfs_kernel_mount ==> 調用具體文件系統的mount,並將返回的root dentry與分配的vfsmount掛接
- alloc_vfsmnt ==> 從slob中分配虛擬掛載點struct vfsmount
- root = mount_fs
- type->mount ==> 調用具體文件系統的mount,返回root dentry
- 設置vfsmount結構內容
3.進入具體文件系統類型的mount,此處以ext2爲例分析
模塊初始化時
- init_inodecache分配slab作爲inode的cache
- register_filesystem加入模塊全局變量file_systems
struct file_system_type ext2_fs_type
- ext2_mount
- mount_bdev ==> 傳入ext2_fill_super,返回root dentry
- blkdev_get_by_path ==> 通過設備節點路徑名構造block_device結構
- sget ==> 獲取或分配super block結構體,並將bdev綁定到sb上
- fill_super ==> 填充super block
- sb_bread ==> 讀取super block的count塊到buffer head,先查找lru緩存
- __find_get_clock_slow ==> 根據bdev中的inode及inode中的i_mapping信息將page cache讀到buffer head裏
- sb_bread ==> 讀取super block的count塊到buffer head,先查找lru緩存
- mount_bdev ==> 傳入ext2_fill_super,返回root dentry
- kill_block_super
- ext2_mount