文件系统中,文件、目录和路径
概要:介绍 xv6 文件系统的核心思想:一切皆文件(目录也是特殊文件)、目录树结构、相对路径与绝对路径的区别,以及 cd 只能由 shell 内置实现的原因。
1. 核心哲学:一切皆文件
在 xv6 中,文件(File) 的概念非常纯粹:它就是一串字节数组。系统并不关心文件里存的是文本、二进制代码还是你OC的照片,解析数据的任务交给了应用程序。
最精妙的设计在于,目录(Directory) 也被实现为一种特殊的文件。
- 普通文件: 存储用户数据。
- 目录文件: 存储的是“键值对”列表(文件名 + 指向该文件的索引号 Inode number)。
2. 目录树结构
xv6 的文件系统是一个典型的树状层级结构。
- 根目录(Root): 这棵树的起点,用斜杠
/表示。 - 分支与叶子: 目录可以是其他目录的子级,也可以包含文件。
- 示例分析: 路径
/a/b/c的逻辑链条如下:- 从 Root 开始寻找名为
a的目录。 - 在目录
a中寻找名为b的目录。 - 在目录
b中寻找名为c的文件(或子目录)。
- 从 Root 开始寻找名为
3. 相对路径 vs. 绝对路径
这是理解 chdir(改变目录)和 open 系统调用的关键。
| 概念 | 路径起始 | 特点 |
|---|---|---|
| 绝对路径 (Absolute Path) | 以 / 开头 |
不论你现在在哪,路径指向的文件始终是固定的。 |
| 相对路径 (Relative Path) | 不以 / 开头 |
文件相对于当前工作目录 (CWD) 的位置。 |
💡 注意: 每个运行中的进程都有一个名为
cwd的属性,它记录了该进程当前在文件系统这棵树上的“立足点”。
4. cd 只能在 shell 中实现
xv6 关于文件系统的操作都被实现为用户程序,诸如 mkdir,ln,rm 等等。这种设计允许任何人都可以通过用户命令拓展 shell 。现在看起来这种设计是很显然的,但是 Unix 时代的其他系统的设计都将这样的命令内置在了 shell 中,而 shell 又是内置在内核中的。
有一个例外,那就是 cd,它是在 shell 中实现。cd 必须改变 shell 自身的当前工作目录。如果 cd 作为一个普通命令执行,那么 shell 就会 fork 一个子进程,而子进程会运行 cd,cd 只会改变子进程的当前工作目录。父进程的工作目录保持原样。
留下评论