一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
原文链接 xv6-riscv文档
1.4 文件系统
xv6的文件系统提供了包含着连续的字节数组和包含着指向其他字节数组和目录的目录。目录形成了从一个特殊的叫root开始的一棵树。像/a/b/c这样的路径(path)指向的是在根目录/下a目录里b目录下的c文件或目录。不以/开始的路径被认为是调用进程当前目录的相对进程,当前目录可以通过chdir系统调用进行修改。下面的这些代码打开的是同一个文件(假设这些目录都存在):
//a
chdir("/a");
chdir("b");
open("c", O_RDONLY);
//b
open("/a/b/c", O_RDONLY);
//这里的chdir是不是很像我们平常用的cd指令?那这是怎么实现的呢?
第一段代码改变了进程的当前目录到/a/b,而第二段代码则直接指向文件没有改变当前目录。
下面是一些创建新的文件和目录的系统调用:mkdir创建一个新的目录,open创建一个带着O_CREATE的数据文件,mknod创建一个新的设备文件,可以看下面的例子:
mkdir("/dir");
fd = open("/dir/file", O_CREATE|O_WRONLY);
close(fd);
mknod("/console", 1, 1);
mknod创建了一个指向设备的特殊文件。和设备文件相关的是主要和次要两个设备序号(作为mknod的两个参数),这两个参数可以独特的区分内核设备。当一个进程后续打开一个设备文件时,内核传递read和write系统调用到内核设备工具上而不是将他们传递到文件系统上。
一个文件的名字和文件本身有很大的区别;文件的底层是inode,其可以拥有很多名字,也即links。每一个链接都保存了一个保存了文件名和指向inode的指向的入口。一个inode保存着文件的元数据,比如type(file、directory或device),文件的长度,文件在磁盘上的地址,以及指向文件的链接的数量。(译者注:这里可以参考操作系统教材中的inode文件系统方式。)
文件系统的下半部分明天更新,感谢阅读。