1.4 文件系统 —— XV6操作系统学习
原文链接:https://pdos.csail.mit.edu/6.828/2021/xv6/book-riscv-rev2.pdf
原文标题:XV6:一种简单、类Unix的教学操作系统
xv6文件系统提供数据文件,包含未解释的字节数组,以及包含命名的数据文件和其他文件目录参数的文件目录。文件目录形成一个树状结构,从叫做 root 的特殊目录开始。一个像 /a/b/c 这样的路径指向 根目录 / 下名为 a 的目录下名为 b 的目录下名为 c的文件或目录。不是以 / 开始的路径,会认为是关联调用进程的 当前路径,可以用 chdir 系统调用来变更。下面这两个代码段打开的是同一个文件 (假设所有涉及到的目录存在):
chdir("/a");
chdir("b");
open("c", O_RDONLY) ;
open("/a/b/c", O_RDONLY) ;
第一段代码把进程的当前目录变更为 /a/b; 第二段既没有指向也没有变更进程的当前目录。
创建新文件和创建目录都有各自的系统调用: mkdir 创建新目录,带有 O_CREATE 标志的 open 创建新的数据文件,mknod 创建新的设备文件。下面的例子描述了这3个系统调用:
mkdir("/dir");
fd = open("/dir/file", O_CREATE | O_WRONLY);
close(fd);
mknod("/console", 1, 1);
Mknod创建一个指向设备的特殊文件。与设备文件相关联的是最大和最小设备编号(mknod 的两个参数), 是内核设备的特别标识。以后进程打开设备文件时,内核让 read 和 write 系统调用转向到内核设备执行,而不是把它们传递到文件系统。
文件名与文件本身有所区别;同样的基础文件,在调用 inode 后, 可以用多个名字来调用 link。每一个链接包含一个目录的入口;入口包含一个文件名和一个 inode 参数。inode 拥有一个文件的元数据 (metadata) ,包括类型(文件或目录或设备),长度,文件内容在磁盘上的位置,文件链接的编号。
fstat 系统调用从文件描述符指向的索引节点(inode) 恢复信息。它把这些信息存入 stuct stat,在 stat.h (kernel/stat.h)中定义如下:
#define T_DIR 1 // Directory
#define T_FILE 2 // File
#define T_DEVICE 3 //Device
struct stat {
int dev; // File system's disk device
unit ino; // Inode number
short type; // Type of file
short nlink; // Number of links to file
uint64 size; // Size of file in bytes
link系统调用创建指向与现存文件相同的索引节点的另外一个文件系统名。下面的代码段创建一个既叫a又叫b的文件。
open("a", O_CREATE|O_WRONLY);
lind("a", "b");
从 a 中读取或向 a 写入等同于从 b 中读取或向 b 写入。通过唯一的索引节点号(inode number)来识别每一个索引节点。在上述代码序列之后,通过检查 fstat 的结果,可以判定 a 和 b 指向同一个潜在的内容:两个都返回同样的索引节点号(ino),而且 nlink 的计数会设置为 2 。
unlink系统调用从文件系统中移除一个名字。只有当文件的链接计数为0 且没有文件描述符指向它的时候,文件的索引节点和磁盘空间保存的内容才可以被释放。因此把
unlink("a");
加入到最后的代码序列,让索引节点和文件内容向 b 一样可以访问。另外,
fd = open("/temp/xyz", O_CREATE|O_RDWR);
unlink("/tmp/xyz");
是一个符合语言习惯的方法,该方法创建了一个临时的没有名字的索引节点,当进程关闭 fd 或退出时就把这个索引节点清除。
Unix为用户层的程序提供了通过 shell 调用的文件功能,比如 mkdir, ln 和 rm。如此设计让任何人都可以通过加入新的用户层程序来扩展命令行界面。此设计的优点在今天看起来很明显,但是在Unix的时代其它操作系统通常把这样的命令构建在 shell 中 (shell 构建在内核里)。
cd是一个例外,它构建在 shell (user/sh.c:160)中。cd必须变更 shell 自身的当前工作目录。如果把 cd 当成普通命令来执行,则 shell 会复刻(fork) 一个子进程, 子进程会运行 cd , cd 会变更子进程的工作目录。父进程的 (比如 shell 的)工作目录将不会变更。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)