免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 40764 | 回复: 45
打印 上一主题 下一主题

文件系统注册及mount过程分析 [复制链接]

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-13 20:38 |只看该作者 |倒序浏览
本帖最后由 T-Bagwell 于 2010-08-14 11:30 编辑

小弟是个菜鸟,如果写得有错误的地方,请不吝赐教

kernel version: 2.6.35
从ext4文件的init开始分析一下,暂时先不去看cache的使用
  1.   register_as_ext2();
  2.     register_as_ext3();
  3.     err = register_filesystem(&ext4_fs_type);
复制代码
可以看出来注册了ext2,ext3,ext4
看一下注册的过程
  1. 56 /**
  2. 57  *  register_filesystem - register a new filesystem
  3. 58  *  @fs: the file system structure
  4. 59  *
  5. 60  *  Adds the file system passed to the list of file systems the kernel
  6. 61  *  is aware of for mount and other syscalls. Returns 0 on success,
  7. 62  *  or a negative errno code on an error.
  8. 63  *
  9. 64  *  The &struct file_system_type that is passed is linked into the kernel
  10. 65  *  structures and must not be freed until the file system has been
  11. 66  *  unregistered.
  12. 67  */
  13. 68
  14. 69 int register_filesystem(struct file_system_type * fs)
  15. 70 {
  16. 71     int res = 0;
  17. 72     struct file_system_type ** p;
  18. 73
  19. 74     BUG_ON(strchr(fs->name, '.'));
  20. 75     if (fs->next)
  21. 76         return -EBUSY;
  22. 77     INIT_LIST_HEAD(&fs->fs_supers);
  23. 78     write_lock(&file_systems_lock);
  24. 79     p = find_filesystem(fs->name, strlen(fs->name));
  25. 80     if (*p)
  26. 81         res = -EBUSY;
  27. 82     else
  28. 83         *p = fs;
  29. 84     write_unlock(&file_systems_lock);
  30. 85     return res;
  31. 86 }
  32. 87
  33. 88 EXPORT_SYMBOL(register_filesystem);
复制代码
在这里面调用了find_filesystem,先找一下看看是不是有同样的文件系统类型被使用了,这个就像银行卡号一样,不能重复,否则会出现自己存的钱被另一个人取走的可能,如果存在了文件系统就返回错误,如果没有存在就添加到支持的文件系统的列表里面,开始支持注册的文件系统,比如ext4
注册的ext4的文件系统的类型结构,这个在do_kernel_mount的时候会通过这个的name来查找fstype
  1. static struct file_system_type ext4_fs_type = {
  2.     .owner      = THIS_MODULE,
  3.     .name       = "ext4",
  4.     .get_sb     = ext4_get_sb,
  5.     .kill_sb    = kill_block_super,
  6.     .fs_flags   = FS_REQUIRES_DEV,
  7. };
复制代码
这里的ext4_get_sb是在do_kern_mount的时候调用到的,走一下流程
  1. 2122 SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
  2. 2123         char __user *, type, unsigned long, flags, void __user *, data)
  3. 2124 {
  4. 2125     int ret;
  5. 2126     char *kernel_type;
  6. 2127     char *kernel_dir;
  7. 2128     char *kernel_dev;
  8. 2129     unsigned long data_page;
  9. 2130
  10. 2131     ret = copy_mount_string(type, &kernel_type);
  11. 2132     if (ret < 0)
  12. 2133         goto out_type;
  13. 2134
  14. 2135     kernel_dir = getname(dir_name);
  15. 2136     if (IS_ERR(kernel_dir)) {
  16. 2137         ret = PTR_ERR(kernel_dir);
  17. 2138         goto out_dir;
  18. 2139     }
  19. 2140
  20. 2141     ret = copy_mount_string(dev_name, &kernel_dev);
  21. 2142     if (ret < 0)
  22. 2143         goto out_dev;
  23. 2144
  24. 2145     ret = copy_mount_options(data, &data_page);
  25. 2146     if (ret < 0)
  26. 2147         goto out_data;
  27. 2148
  28. 2149     ret = do_mount(kernel_dev, kernel_dir, kernel_type, flags,
  29. 2150         (void *) data_page);
  30. 2151
  31. 2152     free_page(data_page);
  32. 2153 out_data:
  33. 2154     kfree(kernel_dev);
  34. 2155 out_dev:
  35. 2156     putname(kernel_dir);
  36. 2157 out_dir:
  37. 2158     kfree(kernel_type);
  38. 2159 out_type:
  39. 2160     return ret;
  40. 2161 }
复制代码
系统调用的mount,会走到这里,然后进入do_mount接口里面进行mount操作
  1. 1942 long do_mount(char *dev_name, char *dir_name, char *type_page,
  2. 1943           unsigned long flags, void *data_page)
  3. 1944 {
  4. 1945     struct path path;
  5. 1946     int retval = 0;
  6. 1947     int mnt_flags = 0;
  7. 1948
  8. 1949     /* Discard magic */
  9. 1950     if ((flags & MS_MGC_MSK) == MS_MGC_VAL)
  10. 1951         flags &= ~MS_MGC_MSK;
  11. 1952
  12. 1953     /* Basic sanity checks */
  13. 1954
  14. 1955     if (!dir_name || !*dir_name || !memchr(dir_name, 0, PAGE_SIZE))
  15. 1956         return -EINVAL;
  16. 1957
  17. 1958     if (data_page)
  18. 1959         ((char *)data_page)[PAGE_SIZE - 1] = 0;
  19. 1960
  20. 1961     /* ... and get the mountpoint */
  21. 1962     retval = kern_path(dir_name, LOOKUP_FOLLOW, &path);
  22. 1963     if (retval)
  23. 1964         return retval;
  24. 1965
  25. 1966     retval = security_sb_mount(dev_name, &path,
  26. 1967                    type_page, flags, data_page);
  27. 1968     if (retval)
  28. 1969         goto dput_out;
  29. 1970
  30. 1971     /* Default to relatime unless overriden */
  31. 1972     if (!(flags & MS_NOATIME))
  32. 1973         mnt_flags |= MNT_RELATIME;
  33. 1974
  34. 1975     /* Separate the per-mountpoint flags */
  35. 1976     if (flags & MS_NOSUID)
  36. 1977         mnt_flags |= MNT_NOSUID;
  37. 1978     if (flags & MS_NODEV)
  38. 1979         mnt_flags |= MNT_NODEV;
  39. 1980     if (flags & MS_NOEXEC)
  40. 1981         mnt_flags |= MNT_NOEXEC;
  41. 1982     if (flags & MS_NOATIME)
  42. 1983         mnt_flags |= MNT_NOATIME;
  43. 1984     if (flags & MS_NODIRATIME)
  44. 1985         mnt_flags |= MNT_NODIRATIME;
  45. 1986     if (flags & MS_STRICTATIME)
  46. 1987         mnt_flags &= ~(MNT_RELATIME | MNT_NOATIME);
  47. 1988     if (flags & MS_RDONLY)
  48. 1989         mnt_flags |= MNT_READONLY;
  49. 1990
  50. 1991     flags &= ~(MS_NOSUID | MS_NOEXEC | MS_NODEV | MS_ACTIVE | MS_BORN |
  51. 1992            MS_NOATIME | MS_NODIRATIME | MS_RELATIME| MS_KERNMOUNT |
  52. 1993            MS_STRICTATIME);
  53. 1994
  54. 1995     if (flags & MS_REMOUNT)
  55. 1996         retval = do_remount(&path, flags & ~MS_REMOUNT, mnt_flags,
  56. 1997                     data_page);
  57. 1998     else if (flags & MS_BIND)
  58. 1999         retval = do_loopback(&path, dev_name, flags & MS_REC);
  59. 2000     else if (flags & (MS_SHARED | MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE))
  60. 2001         retval = do_change_type(&path, flags);
  61. 2002     else if (flags & MS_MOVE)
  62. 2003         retval = do_move_mount(&path, dev_name);
  63. 2004     else
  64. 2005         retval = do_new_mount(&path, type_page, flags, mnt_flags,
  65. 2006                       dev_name, data_page);
  66. 2007 dput_out:
  67. 2008     path_put(&path);
  68. 2009     return retval;
  69. 2010 }
复制代码
通过kern_path来获得挂载点&path
然后通过传递的flag来判断挂载操作, 这些flag可以在man 2 mount中看到说明,这个与mount命令有区别,mount命令要在应用程序里面做很多
  1. [root@T-bagwell ~]# strace mount -t ext4  /dev/sdc1 /mnt
  2. execve("/bin/mount", ["mount", "-t", "ext4", "/dev/sdc1", "/mnt"], [/* 26 vars */]) = 0
  3. brk(0)                                  = 0xb894c000
  4. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb777a000
  5. access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
  6. open("/etc/ld.so.cache", O_RDONLY)      = 3
  7. fstat64(3, {st_mode=S_IFREG|0644, st_size=59157, ...}) = 0
  8. mmap2(NULL, 59157, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb776b000
  9. close(3)                                = 0
  10. open("/lib/libblkid.so.1", O_RDONLY)    = 3
  11. read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20d\33\0004\0\0\0"..., 512) = 512
  12. fstat64(3, {st_mode=S_IFREG|0755, st_size=85520, ...}) = 0
  13. mmap2(NULL, 86652, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7755000
  14. mmap2(0xb7769000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x13) = 0xb7769000
  15. close(3)                                = 0
  16. open("/lib/libuuid.so.1", O_RDONLY)     = 3
  17. read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`N\337\0004\0\0\0"..., 512) = 512
  18. fstat64(3, {st_mode=S_IFREG|0755, st_size=16112, ...}) = 0
  19. mmap2(NULL, 17072, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7750000
  20. mmap2(0xb7754000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3) = 0xb7754000
  21. close(3)                                = 0
  22. open("/lib/libselinux.so.1", O_RDONLY)  = 3
  23. read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`\201\262\0004\0\0\0"..., 512) = 512
  24. fstat64(3, {st_mode=S_IFREG|0755, st_size=118316, ...}) = 0
  25. mmap2(NULL, 121848, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7732000
  26. mmap2(0xb774e000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b) = 0xb774e000
  27. close(3)                                = 0
  28. open("/lib/libsepol.so.1", O_RDONLY)    = 3
  29. read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\340\337\271\0004\0\0\0"..., 512) = 512
  30. fstat64(3, {st_mode=S_IFREG|0755, st_size=242288, ...}) = 0
  31. mmap2(NULL, 244992, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb76f6000
  32. mmap2(0xb7731000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3a) = 0xb7731000
  33. close(3)                                = 0
  34. open("/lib/libc.so.6", O_RDONLY)        = 3
  35. read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20M\225\0004\0\0\0"..., 512) = 512
  36. fstat64(3, {st_mode=S_IFREG|0755, st_size=2402248, ...}) = 0
  37. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f5000
  38. mmap2(NULL, 1526120, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7580000
  39. mprotect(0xb76ee000, 4096, PROT_NONE)   = 0
  40. mmap2(0xb76ef000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16e) = 0xb76ef000
  41. mmap2(0xb76f2000, 10600, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb76f2000
  42. close(3)                                = 0
  43. open("/lib/libdl.so.2", O_RDONLY)       = 3
  44. read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`Z\253\0004\0\0\0"..., 512) = 512
  45. fstat64(3, {st_mode=S_IFREG|0755, st_size=28364, ...}) = 0
  46. mmap2(NULL, 16500, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb757b000
  47. mmap2(0xb757e000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2) = 0xb757e000
  48. close(3)                                = 0
  49. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb757a000
  50. set_thread_area({entry_number:-1 -> 6, base_addr:0xb757a750, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
  51. mprotect(0xb757e000, 4096, PROT_READ)   = 0
  52. mprotect(0xb76ef000, 8192, PROT_READ)   = 0
  53. mprotect(0xb774e000, 4096, PROT_READ)   = 0
  54. mprotect(0xb779a000, 4096, PROT_READ)   = 0
  55. munmap(0xb776b000, 59157)               = 0
  56. statfs64("/selinux", 84, {f_type="EXT2_SUPER_MAGIC", f_bsize=4096, f_blocks=3466984, f_bfree=1622516, f_bavail=1446401, f_files=881280, f_ffree=686391, f_fsid={1492870975, 1857190837}, f_namelen=255, f_frsize=4096}) = 0
  57. brk(0)                                  = 0xb894c000
  58. brk(0xb896d000)                         = 0xb896d000
  59. open("/proc/filesystems", O_RDONLY|O_LARGEFILE) = 3
  60. fstat64(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
  61. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7779000
  62. read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 283
  63. read(3, "", 1024)                       = 0
  64. close(3)                                = 0
  65. munmap(0xb7779000, 4096)                = 0
  66. open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
  67. fstat64(3, {st_mode=S_IFREG|0644, st_size=98765760, ...}) = 0
  68. mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb737a000
  69. close(3)                                = 0
  70. umask(022)                              = 022
  71. open("/dev/null", O_RDWR|O_LARGEFILE)   = 3
  72. close(3)                                = 0
  73. getuid32()                              = 0
  74. geteuid32()                             = 0
  75. readlink("/dev", 0xbf909b5b, 4096)      = -1 EINVAL (Invalid argument)
  76. readlink("/dev/sdc1", 0xbf909b5b, 4096) = -1 EINVAL (Invalid argument)
  77. stat64("/sbin/mount.ext4", 0xbf90a8f8)  = -1 ENOENT (No such file or directory)
  78. rt_sigprocmask(SIG_BLOCK, ~[TRAP SEGV RTMIN RT_1], NULL, 8) = 0
  79. stat64("/sbin/mount.ext4", 0xbf90a8b8)  = -1 ENOENT (No such file or directory)
  80. [color=Red]*********************************关键是这里****************************************
  81. mount("/dev/sdc1", "/mnt", "ext4", MS_MGC_VAL, NULL) = 0[/color]
  82. readlink("/dev", 0xbf90995b, 4096)      = -1 EINVAL (Invalid argument)
  83. readlink("/dev/sdc1", 0xbf90995b, 4096) = -1 EINVAL (Invalid argument)
  84. readlink("/mnt", 0xbf90995b, 4096)      = -1 EINVAL (Invalid argument)
  85. lstat64("/etc/mtab", {st_mode=S_IFREG|0644, st_size=279, ...}) = 0
  86. open("/etc/mtab", O_RDWR|O_CREAT|O_LARGEFILE, 0644) = 3
  87. close(3)                                = 0
  88. rt_sigaction(SIGHUP, {0xb77a3a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  89. rt_sigaction(SIGINT, {0xb77a3a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  90. rt_sigaction(SIGQUIT, {0xb77a3a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  91. rt_sigaction(SIGILL, {0xb77a3a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  92. rt_sigaction(SIGTRAP, {0xb77a3a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  93. rt_sigaction(SIGABRT, {0xb77a3a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  94. rt_sigaction(SIGBUS, {0xb77a3a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  95. rt_sigaction(SIGFPE, {0xb77a3a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  96. rt_sigaction(SIGKILL, {0xb77a3a90, ~[RTMIN RT_1], 0}, NULL, 8) = -1 EINVAL (Invalid argument)
  97. rt_sigaction(SIGUSR1, {0xb77a3a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  98. rt_sigaction(SIGSEGV, {0xb77a3a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  99. rt_sigaction(SIGUSR2, {0xb77a3a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  100. rt_sigaction(SIGPIPE, {0xb77a3a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  101. rt_sigaction(SIGALRM, {0xb77a2eb0, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  102. rt_sigaction(SIGTERM, {0xb77a3a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  103. rt_sigaction(SIGSTKFLT, {0xb77a3a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  104. getpid()                                = 1406
  105. open("/etc/mtab~1406", O_WRONLY|O_CREAT|O_LARGEFILE, 0600) = 3
  106. close(3)                                = 0
  107. gettimeofday({1281688440, 625200}, NULL) = 0
  108. link("/etc/mtab~1406", "/etc/mtab~")    = 0
  109. open("/etc/mtab~", O_WRONLY|O_LARGEFILE) = 3
  110. fcntl64(3, F_SETLK64, {type=F_WRLCK, whence=SEEK_SET, start=0, len=0}, 0xbf90a92c) = 0
  111. unlink("/etc/mtab~1406")                = 0
  112. umask(077)                              = 022
  113. open("/etc/mtab", O_RDWR|O_CREAT|O_APPEND|O_LARGEFILE, 0666) = 4
  114. umask(022)                              = 077
  115. fstat64(4, {st_mode=S_IFREG|0644, st_size=279, ...}) = 0
  116. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7779000
  117. fstat64(4, {st_mode=S_IFREG|0644, st_size=279, ...}) = 0
  118. _llseek(4, 0, [0], SEEK_SET)            = 0
  119. read(4, "/dev/sda1 / ext4 rw 0 0\nproc /pr"..., 279) = 279
  120. write(4, "/dev/sdc1 /mnt ext4 rw 0 0\n", 27) = 27
  121. close(4)                                = 0
  122. munmap(0xb7779000, 4096)                = 0
  123. close(3)                                = 0
  124. unlink("/etc/mtab~")                    = 0
  125. rt_sigprocmask(SIG_UNBLOCK, ~[TRAP SEGV RTMIN RT_1], NULL, 8) = 0
  126. exit_group(0)                           = ?
复制代码


  1. [root@T-bagwell ~]# strace mount -t ext4 -o remount /dev/sdc1 /mnt
  2. execve("/bin/mount", ["mount", "-t", "ext4", "-o", "remount", "/dev/sdc1", "/mnt"], [/* 26 vars */]) = 0
  3. brk(0)                                  = 0xb7dee000
  4. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7730000
  5. access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
  6. open("/etc/ld.so.cache", O_RDONLY)      = 3
  7. fstat64(3, {st_mode=S_IFREG|0644, st_size=59157, ...}) = 0
  8. mmap2(NULL, 59157, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7721000
  9. close(3)                                = 0
  10. open("/lib/libblkid.so.1", O_RDONLY)    = 3
  11. read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20d\33\0004\0\0\0"..., 512) = 512
  12. fstat64(3, {st_mode=S_IFREG|0755, st_size=85520, ...}) = 0
  13. mmap2(NULL, 86652, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb770b000
  14. mmap2(0xb771f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x13) = 0xb771f000
  15. close(3)                                = 0
  16. open("/lib/libuuid.so.1", O_RDONLY)     = 3
  17. read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`N\337\0004\0\0\0"..., 512) = 512
  18. fstat64(3, {st_mode=S_IFREG|0755, st_size=16112, ...}) = 0
  19. mmap2(NULL, 17072, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7706000
  20. mmap2(0xb770a000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3) = 0xb770a000
  21. close(3)                                = 0
  22. open("/lib/libselinux.so.1", O_RDONLY)  = 3
  23. read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`\201\262\0004\0\0\0"..., 512) = 512
  24. fstat64(3, {st_mode=S_IFREG|0755, st_size=118316, ...}) = 0
  25. mmap2(NULL, 121848, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb76e8000
  26. mmap2(0xb7704000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b) = 0xb7704000
  27. close(3)                                = 0
  28. open("/lib/libsepol.so.1", O_RDONLY)    = 3
  29. read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\340\337\271\0004\0\0\0"..., 512) = 512
  30. fstat64(3, {st_mode=S_IFREG|0755, st_size=242288, ...}) = 0
  31. mmap2(NULL, 244992, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb76ac000
  32. mmap2(0xb76e7000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3a) = 0xb76e7000
  33. close(3)                                = 0
  34. open("/lib/libc.so.6", O_RDONLY)        = 3
  35. read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20M\225\0004\0\0\0"..., 512) = 512
  36. fstat64(3, {st_mode=S_IFREG|0755, st_size=2402248, ...}) = 0
  37. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76ab000
  38. mmap2(NULL, 1526120, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7536000
  39. mprotect(0xb76a4000, 4096, PROT_NONE)   = 0
  40. mmap2(0xb76a5000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16e) = 0xb76a5000
  41. mmap2(0xb76a8000, 10600, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb76a8000
  42. close(3)                                = 0
  43. open("/lib/libdl.so.2", O_RDONLY)       = 3
  44. read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`Z\253\0004\0\0\0"..., 512) = 512
  45. fstat64(3, {st_mode=S_IFREG|0755, st_size=28364, ...}) = 0
  46. mmap2(NULL, 16500, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7531000
  47. mmap2(0xb7534000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2) = 0xb7534000
  48. close(3)                                = 0
  49. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7530000
  50. set_thread_area({entry_number:-1 -> 6, base_addr:0xb7530750, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
  51. mprotect(0xb7534000, 4096, PROT_READ)   = 0
  52. mprotect(0xb76a5000, 8192, PROT_READ)   = 0
  53. mprotect(0xb7704000, 4096, PROT_READ)   = 0
  54. mprotect(0xb7750000, 4096, PROT_READ)   = 0
  55. munmap(0xb7721000, 59157)               = 0
  56. statfs64("/selinux", 84, {f_type="EXT2_SUPER_MAGIC", f_bsize=4096, f_blocks=3466984, f_bfree=1622515, f_bavail=1446400, f_files=881280, f_ffree=686391, f_fsid={1492870975, 1857190837}, f_namelen=255, f_frsize=4096}) = 0
  57. brk(0)                                  = 0xb7dee000
  58. brk(0xb7e0f000)                         = 0xb7e0f000
  59. open("/proc/filesystems", O_RDONLY|O_LARGEFILE) = 3
  60. fstat64(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
  61. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb772f000
  62. read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 283
  63. read(3, "", 1024)                       = 0
  64. close(3)                                = 0
  65. munmap(0xb772f000, 4096)                = 0
  66. open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
  67. fstat64(3, {st_mode=S_IFREG|0644, st_size=98765760, ...}) = 0
  68. mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7330000
  69. close(3)                                = 0
  70. umask(022)                              = 022
  71. open("/dev/null", O_RDWR|O_LARGEFILE)   = 3
  72. close(3)                                = 0
  73. getuid32()                              = 0
  74. geteuid32()                             = 0
  75. readlink("/dev", 0xbf9fc3ab, 4096)      = -1 EINVAL (Invalid argument)
  76. readlink("/dev/sdc1", 0xbf9fc3ab, 4096) = -1 EINVAL (Invalid argument)
  77. stat64("/sbin/mount.ext4", 0xbf9fd148)  = -1 ENOENT (No such file or directory)
  78. rt_sigprocmask(SIG_BLOCK, ~[TRAP SEGV RTMIN RT_1], NULL, 8) = 0
  79. stat64("/sbin/mount.ext4", 0xbf9fd108)  = -1 ENOENT (No such file or directory)


  80. [color=Red]*********************************关键是这里**********因为是-o remount,所以这里多了一个MS_REMOUNT******************************
  81. mount("/dev/sdc1", "/mnt", 0xb7def0d8, MS_MGC_VAL|MS_REMOUNT, NULL) = 0[/color]
  82. readlink("/dev", 0xbf9fc1ab, 4096)      = -1 EINVAL (Invalid argument)
  83. readlink("/dev/sdc1", 0xbf9fc1ab, 4096) = -1 EINVAL (Invalid argument)
  84. readlink("/mnt", 0xbf9fc1ab, 4096)      = -1 EINVAL (Invalid argument)
  85. lstat64("/etc/mtab", {st_mode=S_IFREG|0644, st_size=306, ...}) = 0
  86. open("/etc/mtab", O_RDWR|O_CREAT|O_LARGEFILE, 0644) = 3
  87. close(3)                                = 0
  88. open("/etc/mtab", O_RDWR|O_CREAT|O_LARGEFILE, 0644) = 3
  89. close(3)                                = 0
  90. rt_sigaction(SIGHUP, {0xb7759a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  91. rt_sigaction(SIGINT, {0xb7759a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  92. rt_sigaction(SIGQUIT, {0xb7759a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  93. rt_sigaction(SIGILL, {0xb7759a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  94. rt_sigaction(SIGTRAP, {0xb7759a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  95. rt_sigaction(SIGABRT, {0xb7759a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  96. rt_sigaction(SIGBUS, {0xb7759a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  97. rt_sigaction(SIGFPE, {0xb7759a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  98. rt_sigaction(SIGKILL, {0xb7759a90, ~[RTMIN RT_1], 0}, NULL, 8) = -1 EINVAL (Invalid argument)
  99. rt_sigaction(SIGUSR1, {0xb7759a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  100. rt_sigaction(SIGSEGV, {0xb7759a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  101. rt_sigaction(SIGUSR2, {0xb7759a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  102. rt_sigaction(SIGPIPE, {0xb7759a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  103. rt_sigaction(SIGALRM, {0xb7758eb0, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  104. rt_sigaction(SIGTERM, {0xb7759a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  105. rt_sigaction(SIGSTKFLT, {0xb7759a90, ~[RTMIN RT_1], 0}, NULL, 8) = 0
  106. getpid()                                = 1415
  107. open("/etc/mtab~1415", O_WRONLY|O_CREAT|O_LARGEFILE, 0600) = 3
  108. close(3)                                = 0
  109. gettimeofday({1281688501, 78710}, NULL) = 0
  110. link("/etc/mtab~1415", "/etc/mtab~")    = 0
  111. open("/etc/mtab~", O_WRONLY|O_LARGEFILE) = 3
  112. fcntl64(3, F_SETLK64, {type=F_WRLCK, whence=SEEK_SET, start=0, len=0}, 0xbf9fd08c) = 0
  113. unlink("/etc/mtab~1415")                = 0
  114. umask(077)                              = 022
  115. open("/etc/mtab", O_RDONLY|O_LARGEFILE) = 4
  116. umask(022)                              = 077
  117. fstat64(4, {st_mode=S_IFREG|0644, st_size=306, ...}) = 0
  118. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb772f000
  119. read(4, "/dev/sda1 / ext4 rw 0 0\nproc /pr"..., 4096) = 306
  120. read(4, "", 4096)                       = 0
  121. close(4)                                = 0
  122. munmap(0xb772f000, 4096)                = 0
  123. umask(077)                              = 022
  124. open("/etc/mtab.tmp", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 4
  125. umask(022)                              = 077
  126. fstat64(4, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
  127. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb772f000
  128. fstat64(4, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
  129. _llseek(4, 0, [0], SEEK_SET)            = 0
  130. write(4, "/dev/sda1 / ext4 rw 0 0\n", 24) = 24
  131. fstat64(4, {st_mode=S_IFREG|0600, st_size=24, ...}) = 0
  132. _llseek(4, 24, [24], SEEK_SET)          = 0
  133. write(4, "proc /proc proc rw 0 0\n", 23) = 23
  134. fstat64(4, {st_mode=S_IFREG|0600, st_size=47, ...}) = 0
  135. _llseek(4, 47, [47], SEEK_SET)          = 0
  136. write(4, "sysfs /sys sysfs rw 0 0\n", 24) = 24
  137. fstat64(4, {st_mode=S_IFREG|0600, st_size=71, ...}) = 0
  138. _llseek(4, 71, [71], SEEK_SET)          = 0
  139. write(4, "devpts /dev/pts devpts rw,gid=5,"..., 45) = 45
  140. fstat64(4, {st_mode=S_IFREG|0600, st_size=116, ...}) = 0
  141. _llseek(4, 116, [116], SEEK_SET)        = 0
  142. write(4, "tmpfs /dev/shm tmpfs rw 0 0\n", 28) = 28
  143. fstat64(4, {st_mode=S_IFREG|0600, st_size=144, ...}) = 0
  144. _llseek(4, 144, [144], SEEK_SET)        = 0
  145. write(4, "none /proc/sys/fs/binfmt_misc bi"..., 49) = 49
  146. fstat64(4, {st_mode=S_IFREG|0600, st_size=193, ...}) = 0
  147. _llseek(4, 193, [193], SEEK_SET)        = 0
  148. write(4, "sunrpc /var/lib/nfs/rpc_pipefs r"..., 49) = 49
  149. fstat64(4, {st_mode=S_IFREG|0600, st_size=242, ...}) = 0
  150. _llseek(4, 242, [242], SEEK_SET)        = 0
  151. write(4, "/dev/sdb1 /media/android ext4 rw"..., 37) = 37
  152. fstat64(4, {st_mode=S_IFREG|0600, st_size=279, ...}) = 0
  153. _llseek(4, 279, [279], SEEK_SET)        = 0
  154. fchmod(4, 0644)                         = 0
  155. stat64("/etc/mtab", {st_mode=S_IFREG|0644, st_size=306, ...}) = 0
  156. fchown32(4, 0, 0)                       = 0
  157. write(4, "/dev/sdc1 /mnt ext4 rw 0 0\n", 27) = 27
  158. close(4)                                = 0
  159. munmap(0xb772f000, 4096)                = 0
  160. rename("/etc/mtab.tmp", "/etc/mtab")    = 0
  161. close(3)                                = 0
  162. unlink("/etc/mtab~")                    = 0
  163. rt_sigprocmask(SIG_UNBLOCK, ~[TRAP SEGV RTMIN RT_1], NULL, 8) = 0
  164. exit_group(0)      
复制代码
只说挂载就可以了,remount先忽略,do_new_mount
  1. 1669 /*
  2. 1670  * create a new mount for userspace and request it to be added into the
  3. 1671  * namespace's tree
  4. 1672  */
  5. 1673 static int do_new_mount(struct path *path, char *type, int flags,
  6. 1674             int mnt_flags, char *name, void *data)
  7. 1675 {
  8. 1676     struct vfsmount *mnt;
  9. 1677
  10. 1678     if (!type)
  11. 1679         return -EINVAL;
  12. 1680
  13. 1681     /* we need capabilities... */
  14. 1682     if (!capable(CAP_SYS_ADMIN))
  15. 1683         return -EPERM;
  16. 1684
  17. 1685     lock_kernel();
  18. 1686     mnt = do_kern_mount(type, flags, name, data);
  19. 1687     unlock_kernel();
  20. 1688     if (IS_ERR(mnt))
  21. 1689         return PTR_ERR(mnt);
  22. 1690
  23. 1691     return do_add_mount(mnt, path, mnt_flags, NULL);
  24. 1692 }
复制代码
里面有两个和mount有关的操作一个是do_kern_mount,一个是 do_add_mount,一个是做mount挂载,一个是将mount挂载的fs添加到mount的列表里

先看do_kernel_mount
  1. 1079 struct vfsmount *
  2. 1080 do_kern_mount(const char *fstype, int flags, const char *name, void *data)
  3. 1081 {
  4. 1082     struct file_system_type *type = get_fs_type(fstype);
  5. 1083     struct vfsmount *mnt;
  6. 1084     if (!type)
  7. 1085         return ERR_PTR(-ENODEV);
  8. 1086     mnt = vfs_kern_mount(type, flags, name, data);
  9. 1087     if (!IS_ERR(mnt) && (type->fs_flags & FS_HAS_SUBTYPE) &&
  10. 1088         !mnt->mnt_sb->s_subtype)
  11. 1089         mnt = fs_set_subtype(mnt, fstype);
  12. 1090     put_filesystem(type);
  13. 1091     return mnt;
  14. 1092 }
  15. 1093 EXPORT_SYMBOL_GPL(do_kern_mount);
复制代码
这里就用到了最开始说的注册的文件系统,通过get_fs_type来查找是否支持fstype类型的文件系统,例如ext4支持的话就把前面注册的结构返回到这里,以后使用的type都是ext4_fs_type,例如vfs_kern_mount里面传递进去的type,就是ext4_fs_type了,
进入到vfs_kern_mount里面看一下,里面肯定会调到get_sb,
  1. 899 struct vfsmount *
  2. 900 vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void *data)
  3. 901 {
  4. 902     struct vfsmount *mnt;
  5. 903     char *secdata = NULL;
  6. 904     int error;
  7. 905
  8. 906     if (!type)
  9. 907         return ERR_PTR(-ENODEV);
  10. 908
  11. 909     error = -ENOMEM;
  12. 910     mnt = alloc_vfsmnt(name);
  13. 911     if (!mnt)
  14. 912         goto out;
  15. 913
  16. 914     if (flags & MS_KERNMOUNT)
  17. 915         mnt->mnt_flags = MNT_INTERNAL;
  18. 916
  19. 917     if (data && !(type->fs_flags & FS_BINARY_MOUNTDATA)) {
  20. 918         secdata = alloc_secdata();
  21. 919         if (!secdata)
  22. 920             goto out_mnt;
  23. 921
  24. 922         error = security_sb_copy_data(data, secdata);
  25. 923         if (error)
  26. 924             goto out_free_secdata;
  27. 925     }
  28. 926*************************在这呢,这里的get_sb就是fs/ext4/super.c里面的ext4_get_sb***********************************
  29. 927     error = type->get_sb(type, flags, name, data, mnt);
  30. 928     if (error < 0)
  31. 929         goto out_free_secdata;
  32. 930     BUG_ON(!mnt->mnt_sb);
  33. 931     WARN_ON(!mnt->mnt_sb->s_bdi);
  34. 932     mnt->mnt_sb->s_flags |= MS_BORN;
  35. 933
  36. 934     error = security_sb_kern_mount(mnt->mnt_sb, flags, secdata);
  37. 935     if (error)
  38. 936         goto out_sb;
  39. 937
  40. 938     /*
  41. 939      * filesystems should never set s_maxbytes larger than MAX_LFS_FILESIZE
  42. 940      * but s_maxbytes was an unsigned long long for many releases. Throw
  43. 941      * this warning for a little while to try and catch filesystems that
  44. 942      * violate this rule. This warning should be either removed or
  45. 943      * converted to a BUG() in 2.6.34.
  46. 944      */
  47. 945     WARN((mnt->mnt_sb->s_maxbytes < 0), "%s set sb->s_maxbytes to "
  48. 946         "negative value (%lld)\n", type->name, mnt->mnt_sb->s_maxbytes);
  49. 947
  50. 948     mnt->mnt_mountpoint = mnt->mnt_root;
  51. 949     mnt->mnt_parent = mnt;
  52. 950     up_write(&mnt->mnt_sb->s_umount);
  53. 951     free_secdata(secdata);
  54. 952     return mnt;
  55. 953 out_sb:
  56. 954     dput(mnt->mnt_root);
  57. 955     deactivate_locked_super(mnt->mnt_sb);
  58. 956 out_free_secdata:
  59. 957     free_secdata(secdata);
  60. 958 out_mnt:
  61. 959     free_vfsmnt(mnt);
  62. 960 out:
  63. 961     return ERR_PTR(error);
  64. 962 }
  65. 963
  66. 964 EXPORT_SYMBOL_GPL(vfs_kern_mount);
复制代码
接下来就要进入到ext4系统里面看一下get_sb做了什么
  1. 4232 static int ext4_get_sb(struct file_system_type *fs_type, int flags,
  2. 4233                const char *dev_name, void *data, struct vfsmount *mnt)
  3. 4234 {
  4. 4235     return get_sb_bdev(fs_type, flags, dev_name, data, ext4_fill_super,mnt);
  5. 4236 }
复制代码
这里面一共调用了两个接口get_sb_bdev和ext4_fill_super,一个文件系统的细节部分都在ext4_fill_super里面去做
get_sb_bdev里面会用到ext4_fill_super,因为要注册一下里面的细节,比如创建节点,文件,目录,链接,读文件,读目录,写文件,写目录,删除文件,很多很多。
后面涉及到了对块设备操作的很多工作,文件系统最关键的就是管理文件,并且是块设备上的,这个块设备就是在get_sb_bdev里面得到的
  1. 747 int get_sb_bdev(struct file_system_type *fs_type,
  2. 748     int flags, const char *dev_name, void *data,
  3. 749     int (*fill_super)(struct super_block *, void *, int),
  4. 750     struct vfsmount *mnt)
  5. 751 {
  6. 752     struct block_device *bdev;
  7. 753     struct super_block *s;
  8. 754     fmode_t mode = FMODE_READ;
  9. 755     int error = 0;
  10. 756
  11. 757     if (!(flags & MS_RDONLY))
  12. 758         mode |= FMODE_WRITE;
  13. 759
  14. 760     bdev = open_bdev_exclusive(dev_name, mode, fs_type);
  15. 761     if (IS_ERR(bdev))
  16. 762         return PTR_ERR(bdev);
  17. ……
  18. 799
  19. 800         s->s_flags = flags;
  20. 801         s->s_mode = mode;
  21. 802         strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
  22. 803         sb_set_blocksize(s, block_size(bdev));
  23. 804         error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
  24. 805         if (error) {
  25. 806             deactivate_locked_super(s);
  26. 807             goto error;
  27. 808         }
  28. 809
  29. 810         s->s_flags |= MS_ACTIVE;
  30. 811         bdev->bd_super = s;
  31. 812     }
  32. 813
  33. 814     simple_set_mnt(mnt, s);
  34. 815     return 0;
  35. ……
复制代码
通过这个open_bdev_exclusive拿到设备文件后进入到了error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
就这样,对磁盘文件操作就了解了
通过这个fill_super来进行读读块设备
  1. 2545 static int ext4_fill_super(struct super_block *sb, void *data, int silent)
  2. 2546                 __releases(kernel_lock)
  3. 2547                 __acquires(kernel_lock)
  4. 2548 {
  5. 2549     char *orig_data = kstrdup(data, GFP_KERNEL);
  6. 2550     struct buffer_head *bh;
  7. 2551     struct ext4_super_block *es = NULL;
  8. 2552     struct ext4_sb_info *sbi;
  9. 2553     ext4_fsblk_t block;
  10. 2554     ext4_fsblk_t sb_block = get_sb_block(&data);
  11. 2555     ext4_fsblk_t logical_sb_block;
  12. 2556     unsigned long offset = 0;
  13. ……
  14. 2580     }
  15. 2581     sb->s_fs_info = sbi;
  16. 2582     sbi->s_mount_opt = 0;
  17. 2583     sbi->s_resuid = EXT4_DEF_RESUID;
  18. 2584     sbi->s_resgid = EXT4_DEF_RESGID;
  19. 2585     sbi->s_inode_readahead_blks = EXT4_DEF_INODE_READAHEAD_BLKS;
  20. 2586     sbi->s_sb_block = sb_block;
  21. 2587     if (sb->s_bdev->bd_part)
  22. 2588         sbi->s_sectors_written_start =
  23. 2589             part_stat_read(sb->s_bdev->bd_part, sectors[1]);
  24. 2590
  25. 2591     unlock_kernel();
  26. 2592
  27. 2593     /* Cleanup superblock name */
  28. 2594     for (cp = sb->s_id; (cp = strchr(cp, '/'));)
  29. 2595         *cp = '!';
  30. 2596
  31. 2597     ret = -EINVAL;
  32. 2598     blocksize = sb_min_blocksize(sb, EXT4_MIN_BLOCK_SIZE);
  33. 2599     if (!blocksize) {
  34. 2600         ext4_msg(sb, KERN_ERR, "unable to set blocksize");
  35. 2601         goto out_fail;
  36. 2602     }
  37. 2603
  38. 2604     /*
  39. 2605      * The ext4 superblock will not be buffer aligned for other than 1kB
  40. 2606      * block sizes.  We need to calculate the offset from buffer start.
  41. 2607      */
  42. 2608     if (blocksize != EXT4_MIN_BLOCK_SIZE) {
  43. 2609         logical_sb_block = sb_block * EXT4_MIN_BLOCK_SIZE;
  44. 2610         offset = do_div(logical_sb_block, blocksize);
  45. 2611     } else {
  46. 2612         logical_sb_block = sb_block;
  47. 2613     }
  48. 2614
  49. 2615     if (!(bh = sb_bread(sb, logical_sb_block))) {
  50. 2616         ext4_msg(sb, KERN_ERR, "unable to read superblock");
  51. 2617         goto out_fail;
  52. 2618     }
  53. ……
  54. 2649     if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_DATA)
  55. 2650         set_opt(sbi->s_mount_opt, JOURNAL_DATA);
  56. 2651     else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_ORDERED)
  57. 2652         set_opt(sbi->s_mount_opt, ORDERED_DATA);
  58. 2653     else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_WBACK)
  59. 2654         set_opt(sbi->s_mount_opt, WRITEBACK_DATA);
  60. 2655
  61. 2656     if (le16_to_cpu(sbi->s_es->s_errors) == EXT4_ERRORS_PANIC)
  62. 2657         set_opt(sbi->s_mount_opt, ERRORS_PANIC);
  63. 2658     else if (le16_to_cpu(sbi->s_es->s_errors) == EXT4_ERRORS_CONTINUE)
  64. 2659         set_opt(sbi->s_mount_opt, ERRORS_CONT);
  65. 2660     else
  66. 2661         set_opt(sbi->s_mount_opt, ERRORS_RO);
  67. 2662     if (def_mount_opts & EXT4_DEFM_BLOCK_VALIDITY)
  68. 2663         set_opt(sbi->s_mount_opt, BLOCK_VALIDITY);
  69. 2664     if (def_mount_opts & EXT4_DEFM_DISCARD)
  70. 2665         set_opt(sbi->s_mount_opt, DISCARD);
  71. ……
  72. 2931      * set up enough so that it can read an inode
  73. 2932      */
  74. 2933     if (!test_opt(sb, NOLOAD) &&
  75. 2934         EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL))
  76. 2935         sb->s_op = &ext4_sops;
  77. 2936     else
  78. 2937         sb->s_op = &ext4_nojournal_sops;
  79. 2938     sb->s_export_op = &ext4_export_ops;
  80. 2939     sb->s_xattr = ext4_xattr_handlers;
  81. 2940 #ifdef CONFIG_QUOTA
  82. 2941     sb->s_qcop = &ext4_qctl_operations;
  83. 2942     sb->dq_op = &ext4_quota_operations;
  84. 2943 #endif
  85. ……
  86. 3052     root = ext4_iget(sb, EXT4_ROOT_INO);
  87. 3053     if (IS_ERR(root)) {
  88. 3054         ext4_msg(sb, KERN_ERR, "get root inode failed");
  89. 3055         ret = PTR_ERR(root);
  90. 3056         goto failed_mount4;
  91. 3057     }
  92. 3058     if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) {
  93. 3059         iput(root);
  94. 3060         ext4_msg(sb, KERN_ERR, "corrupt root inode, run e2fsck");
  95. 3061         goto failed_mount4;
  96. 3062     }
  97. 3063     sb->s_root = d_alloc_root(root);
  98. 3064     if (!sb->s_root) {
  99. 3065         ext4_msg(sb, KERN_ERR, "get root dentry failed");
  100. 3066         iput(root);
  101. 3067         ret = -ENOMEM;
  102. 3068         goto failed_mount4;
  103. 3069     }
  104. 3070
  105. 3071     ext4_setup_super(sb, es, sb->s_flags & MS_RDONLY);
  106. 3072
复制代码
这些介绍了从读超级快,获得磁盘的块的属性,然后进行了sops注册,然后进入ext4_iget进行了文件操作,目录操作,链接操作等函数的注册,比如读文件

然后回到do_new_mount,将挂载点添加到列表里就可以了,这个列表在/proc中可以展现出来
  1. [root@T-bagwell ~]# cat /proc/mounts
  2. rootfs / rootfs rw 0 0
  3. /dev/root / ext4 rw,relatime,barrier=1,data=ordered 0 0
  4. /dev /dev tmpfs rw,relatime,mode=755 0 0
  5. /proc /proc proc rw,relatime 0 0
  6. /sys /sys sysfs rw,relatime 0 0
  7. /proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0
  8. devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0
  9. none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0
  10. sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0
  11. /dev/sdb1 /media/android ext4 rw,relatime,barrier=1,data=ordered 0 0
  12. [root@T-bagwell ~]#
复制代码
到这里文件系统的注册和磁盘的挂载完成

评分

参与人数 1可用积分 +15 收起 理由
dreamice + 15 牛x,给你加分了

查看全部评分

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2010-08-13 20:50 |只看该作者
T-bag兄的大作新鲜出炉了。:wink:

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
3 [报告]
发表于 2010-08-13 22:48 |只看该作者

其实我就是把过程写一下,希望大伙能指点一下

论坛徽章:
0
4 [报告]
发表于 2010-08-14 11:13 |只看该作者
有空学习下,谢谢

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2010-08-14 11:16 |只看该作者
T-Bag兄顺便说一下内核版本

论坛徽章:
0
6 [报告]
发表于 2010-08-14 11:33 |只看该作者
大师啊!

论坛徽章:
0
7 [报告]
发表于 2010-08-14 23:31 |只看该作者
回复 5# Godbach


    不是说了2.6.35么

论坛徽章:
0
8 [报告]
发表于 2010-08-15 02:46 |只看该作者
lz你好帅,我好葱白你。

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
9 [报告]
发表于 2010-08-15 08:07 |只看该作者
回复  Godbach


    不是说了2.6.35么
cambyzju 发表于 2010-08-14 23:31



       

那个是后补充上去的

论坛徽章:
0
10 [报告]
发表于 2010-08-15 23:05 |只看该作者
{:2_164:}厉害。虽然我看得晕乎乎的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP