Linux內核-文件系統-掛載流程分析

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 ==>進入系統調用

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裏
    • kill_block_super
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章