0 00:00:00,000 --> 00:00:06,880 1 00:00:06,920 --> 00:00:08,400 那前面我们给大家介绍了 2 00:00:08,440 --> 00:00:10,320 关于一个具体的simple file system 3 00:00:10,360 --> 00:00:12,280 一个大致的情况 4 00:00:12,320 --> 00:00:14,080 在这个simple file system之上呢 5 00:00:14,120 --> 00:00:16,560 我们还有一层Virtual file system 6 00:00:16,600 --> 00:00:20,800 那它呢起什么作用 大家可以看一看 7 00:00:20,840 --> 00:00:22,920 可以看出来VFS呢 8 00:00:22,960 --> 00:00:24,840 是在simple FS之上 9 00:00:24,880 --> 00:00:26,480 但是在我们应用之下 10 00:00:26,520 --> 00:00:28,160 这么一个中间位置 11 00:00:28,200 --> 00:00:29,840 那么它起到什么作用呢 12 00:00:29,880 --> 00:00:31,800 其实它起到一个承上启下的作用 13 00:00:31,840 --> 00:00:33,200 向下呢 它除了可以 14 00:00:33,240 --> 00:00:34,760 管理simple file system呢 15 00:00:34,800 --> 00:00:36,680 也可以管理不同的device 16 00:00:36,720 --> 00:00:38,480 甚至其它类型文件系统 17 00:00:38,520 --> 00:00:40,280 这是它的一个特点 18 00:00:40,320 --> 00:00:42,840 向上它提供了一层统一的接口 19 00:00:42,880 --> 00:00:45,520 给我们的应用程序来使用 20 00:00:45,560 --> 00:00:47,400 那我们应用程序不用关注 21 00:00:47,440 --> 00:00:49,880 底下到底是哪些具体的文件系统 22 00:00:49,920 --> 00:00:52,360 是设备文件系统还是simple file system 23 00:00:52,400 --> 00:00:54,080 还是其它一些file system 24 00:00:54,120 --> 00:00:55,200 不用care(关心) 25 00:00:55,240 --> 00:00:57,240 那它只需采取统一的一个接口 26 00:00:57,280 --> 00:00:59,920 比如说open read write close 27 00:00:59,960 --> 00:01:01,320 这么些基本函数呢 28 00:01:01,360 --> 00:01:06,120 就可以访问不同类型的文件系统 29 00:01:06,160 --> 00:01:08,040 那为了能够完成这样的功能呢 30 00:01:08,080 --> 00:01:10,080 我们其实需要在VFS这一层 31 00:01:10,120 --> 00:01:12,880 建立和我们进程的一个联系 32 00:01:12,920 --> 00:01:14,920 同时能够把抽象的 33 00:01:14,960 --> 00:01:17,680 file directory和inode 34 00:01:17,720 --> 00:01:20,200 和我们具体的文件系统进行对接 35 00:01:20,240 --> 00:01:24,920 这就是VFS它最主要的一个功能 36 00:01:24,960 --> 00:01:27,240 我们再具体看一下 37 00:01:27,280 --> 00:01:31,040 从大家最能理解的file这个结构入手 38 00:01:31,080 --> 00:01:32,400 那么file就代表一个文件 39 00:01:32,440 --> 00:01:34,440 那么它呢 是站在应用角度 40 00:01:34,480 --> 00:01:36,000 能够看到的一些信息 41 00:01:36,040 --> 00:01:37,480 比如说这个文件 42 00:01:37,520 --> 00:01:39,560 是只读还是可读写的 43 00:01:39,600 --> 00:01:41,160 它当前已经打开了 44 00:01:41,200 --> 00:01:42,720 还是关闭了等等 45 00:01:42,760 --> 00:01:43,800 这一系列信息呢 46 00:01:43,840 --> 00:01:46,480 其实我们的应用程序是需要知道的 47 00:01:46,520 --> 00:01:49,000 但是光有这些信息还是不够的 48 00:01:49,040 --> 00:01:51,080 我们还需要去了解 49 00:01:51,120 --> 00:01:53,400 怎么去进一步地对这个文件 50 00:01:53,440 --> 00:01:56,920 进行相应的操作 51 00:01:56,960 --> 00:01:59,240 可以看到 比如说 52 00:01:59,280 --> 00:02:00,360 从进程角度而言 53 00:02:00,400 --> 00:02:03,520 它需要记录它到底打开了哪些文件 54 00:02:03,560 --> 00:02:07,280 为此会有一个 关于文件的一个list 55 00:02:07,320 --> 00:02:09,840 在这个list里面呢 会有一些信息 56 00:02:09,880 --> 00:02:12,080 比如说举个例子 fd这个信息 57 00:02:12,120 --> 00:02:14,520 fd代表了当应用程序 58 00:02:14,560 --> 00:02:17,240 执行open之后 返回一个整型 59 00:02:17,280 --> 00:02:19,760 但这个整型其实就是一个index 60 00:02:19,800 --> 00:02:22,800 在哪体现呢 在这个fd_array 61 00:02:22,840 --> 00:02:23,920 那么这个index呢 62 00:02:23,960 --> 00:02:25,800 可以访问这个数组 63 00:02:25,840 --> 00:02:27,000 从而可以找到 64 00:02:27,040 --> 00:02:31,680 进一步的文件的信息 65 00:02:31,720 --> 00:02:33,080 另一方面呢 我们可以看到 66 00:02:33,120 --> 00:02:36,400 在file里面有一个成员变量是inode 67 00:02:36,440 --> 00:02:38,200 也意味着我们可以通过file 68 00:02:38,240 --> 00:02:41,280 找到它所对应的inode 69 00:02:41,320 --> 00:02:42,280 有了inode之后 70 00:02:42,320 --> 00:02:45,080 我们就可以进一步去完成 71 00:02:45,120 --> 00:02:48,800 对具体文件系统一个映射 72 00:02:48,840 --> 00:02:50,040 可以看着 在这里面 73 00:02:50,080 --> 00:02:52,200 inode还有不同的特点 74 00:02:52,240 --> 00:02:55,280 比如说它可以是一个sfs 75 00:02:55,320 --> 00:02:56,920 也可以是一个device 76 00:02:56,960 --> 00:03:00,560 在这里面根据它的type可以做区分 77 00:03:00,600 --> 00:03:04,400 这都在inode的成员变量里面 78 00:03:04,440 --> 00:03:06,840 在inode里面呢 79 00:03:06,880 --> 00:03:08,200 除了它的类型信息之外 80 00:03:08,240 --> 00:03:09,920 还有一些跟它使用情况 81 00:03:09,960 --> 00:03:11,120 相关的一些信息 82 00:03:11,160 --> 00:03:13,160 比如说Reference count 83 00:03:13,200 --> 00:03:14,240 就是引用计数 84 00:03:14,280 --> 00:03:16,320 还有open count 打开的计数 85 00:03:16,360 --> 00:03:17,680 所以引用计数是代表的是 86 00:03:17,720 --> 00:03:20,280 我们操作系统或者我们应用程序 87 00:03:20,320 --> 00:03:23,960 对当前这个inode做了一个访问 88 00:03:24,000 --> 00:03:25,600 我们需要记录一下 89 00:03:25,640 --> 00:03:28,920 因为只有当所有这些上层的应用 90 00:03:28,960 --> 00:03:30,360 不对inode进行访问之后 91 00:03:30,400 --> 00:03:32,320 我们才可以把这个inode进行回收 92 00:03:32,360 --> 00:03:33,560 这是一方面 93 00:03:33,600 --> 00:03:35,760 另一方面呢你打开一个文件 94 00:03:35,800 --> 00:03:38,120 那也意味着这个文件所对应的inode 95 00:03:38,160 --> 00:03:39,880 需要有一个加1的操作 96 00:03:39,920 --> 00:03:44,560 来记录当前到底有多少个打开的操作 97 00:03:44,600 --> 00:03:46,000 针对这个inode 98 00:03:46,040 --> 00:03:48,040 这是这两个信息 99 00:03:48,080 --> 00:03:48,760 这两个信息很重要 100 00:03:48,800 --> 00:03:50,120 因为它表示了 101 00:03:50,160 --> 00:03:54,280 关于inode资源的使用情况 102 00:03:54,320 --> 00:03:59,000 这是关于这两块一个介绍 103 00:03:59,040 --> 00:04:02,280 再接下来是跟inode相关的操作 104 00:04:02,320 --> 00:04:04,440 一部分是跟文件系统相关 105 00:04:04,480 --> 00:04:06,760 一个是跟inode本身相关 106 00:04:06,800 --> 00:04:09,080 我们首先看一下 107 00:04:09,120 --> 00:04:10,960 这个inode所属的文件系统 108 00:04:11,000 --> 00:04:12,360 具有什么样特征 109 00:04:12,400 --> 00:04:13,960 可以看出来一个inode 110 00:04:14,000 --> 00:04:16,480 其实它有一个成员变量叫做in_fs 111 00:04:16,520 --> 00:04:18,160 那么这个in_fs决定了 112 00:04:18,200 --> 00:04:20,760 这个inode到底属于哪个文件系统 113 00:04:20,800 --> 00:04:23,600 可以出来这是一个fs的一个结构 114 00:04:23,640 --> 00:04:26,280 那这个fs呢是属于VFS的 115 00:04:26,320 --> 00:04:30,120 我们刚才讲的sfs_fs是不一样的 116 00:04:30,160 --> 00:04:31,440 那个是一个具体的 117 00:04:31,480 --> 00:04:33,600 simple file system的一个描述 118 00:04:33,640 --> 00:04:35,840 而这是一个抽象的VFS的 119 00:04:35,880 --> 00:04:38,200 一个system的描述 120 00:04:38,240 --> 00:04:39,320 可以看出来 在这里面 121 00:04:39,360 --> 00:04:40,560 它很重要的一点是 122 00:04:40,600 --> 00:04:42,920 它包含了对不同类型 123 00:04:42,960 --> 00:04:44,760 文件系统的一个表示 124 00:04:44,800 --> 00:04:46,920 这里面又出现了sfs_fs 125 00:04:46,960 --> 00:04:49,160 以及还有一些具体的 126 00:04:49,200 --> 00:04:50,160 这里面没有展现出来的 127 00:04:50,200 --> 00:04:52,000 比如device_fs等等 128 00:04:52,040 --> 00:04:53,880 那么有了这些成员变量之后呢 129 00:04:53,920 --> 00:04:55,240 我们再结合一些函数指针 130 00:04:55,280 --> 00:04:57,840 就可以有效在VFS这个层面 131 00:04:57,880 --> 00:05:02,400 统一地对不同类型文件系统进行处理 132 00:05:02,440 --> 00:05:05,160 第二个是关于inode本身一些操作 133 00:05:05,200 --> 00:05:08,280 那么这里面列出了关于inode一系列的 134 00:05:08,320 --> 00:05:11,360 统一的一层函数调用一些接口 135 00:05:11,400 --> 00:05:14,800 比如说open close read write 136 00:05:14,840 --> 00:05:16,440 这是大家经常看到的 137 00:05:16,480 --> 00:05:19,520 以及得到目录这个目录项所需要的 138 00:05:19,560 --> 00:05:23,880 叫做get directory entry这么一个操作 139 00:05:23,920 --> 00:05:25,160 这一些操作呢 140 00:05:25,200 --> 00:05:27,040 就是一个统一的interface 141 00:05:27,080 --> 00:05:28,800 至于这底下具体实现 142 00:05:28,840 --> 00:05:31,000 是和我们具体文件系统相关的 143 00:05:31,040 --> 00:05:32,160 我们大家还可以回忆一下 144 00:05:32,200 --> 00:05:34,800 我们前面讲SFS的时候给大家提过 145 00:05:34,840 --> 00:05:38,240 SFS呢 会设定它那个inode 146 00:05:38,280 --> 00:05:40,480 所对应的具体的操作 147 00:05:40,520 --> 00:05:45,760 比如sfs_open sfs_ close等等 148 00:05:45,800 --> 00:05:48,200 有了这个接口 我们就完成了 149 00:05:48,240 --> 00:05:50,200 对具体文件系统的一个隔离 150 00:05:50,240 --> 00:05:53,680 同时向上提供了一层统一的接口 151 00:05:53,720 --> 00:05:55,400 方便了应用程序 152 00:05:55,440 --> 00:05:58,040 对文件的访问和操作 153 00:05:58,080 --> 00:05:58,120