diff --git a/thu_os/lab8_report.md b/thu_os/lab8_report.md index 366d1ff..df59626 100644 --- a/thu_os/lab8_report.md +++ b/thu_os/lab8_report.md @@ -23,6 +23,32 @@ Lab8 Report + 列出你认为本实验中重要的知识点,以及与对应的OS原理中的知识点,并简要说明你对二者的含义,关系,差异等方面的理解(也可能出现实验中的知识点没有对应的原理知识点) + 列出你认为OS原理中很重要,但在实验中没有对应上的知识点 +## 文件系统的层次架构 + +`lab8`的关键在于理解操作系统的文件系统层次架构,在`ucore`中,文件系统被划分成了`通用文件系统访问接口`,`文件系统抽象层`(VFS, Virtual File System),`简单文件系统`(SFS, Simple File System)以及`文件系统I/O设备接口层`四个层次。 + ++ `通用文件系统访问接口`主要是面向进程,为进程提供方便简单的文件操作系统调用,如我们熟悉的`open`, `read`,`write`等,它通过访问用户系统调用库来获得内核文件系统的相关服务。该层次包括的文件有`user/ulib.c(h)`,`user/syscall.c(h)`,`kern/sysfile.c(h)`。 + ++ `文件系统抽象层`完成两个方面的工作,一方面为上一层的通用访问接口提供服务,另一方面需要定义和下一层交互的接口。`VFS`层又可以划分为若干个子层,包括处于上层的`file`层,以及处于下层的`inode`层和`fs`层。 + + - `file`是面向进程的对磁盘数据块的一种抽象,`file层`主要是提供文件相关的系统调用的实际处理函数,如`file_open`,`file_read`等,另一方面还需要对进程的`打开文件表`进行管理。`file`层对应的文件有`fs/file.c(h)`。 + + - `fs`层是对文件系统的抽象,它提供一般的(抽象的)文件系统本身应该完成的一些功能,比如打开文件或者创建文件与目录这种。需要注意的是,文件的读与写是`inode`层提供的功能。`fs`层对应的文件有`vfs/vfs.c(h)`以及`vfsdec.c`,`vfsfile.c`,`vfslookup.c`,`vfspath.c`。 + + - `inode`是对文件的一种低层次抽象,和`file`不同,`inode`主要关心的问题是面向底层的操作,如屏蔽不同文件系统之间的细节,而为`file`层提供统一的调用接口。为此,`inode`层以`抽象类`的形式,定义了具体文件系统需要实现的一般操作接口`struct inode_ops`。`inode`层对应的文件有`inode.c(h)` + ++ `SFS`层是`ucore`实现的一个具体的文件系统。一方面它需要为`文件系统抽象层`提供服务,即实现`inode`定义的若干抽象操作接口;另一方面则调用底层的设备提供的功能。在`SFS`层中,对文件和目录进行了区分,分别实现了两套不同的抽象接口,即`sfs_node_dirops`和`sfs_node_fileops`。`SFS`层对应的文件包括`fs/sfs`文件夹里面的全部文件。 + ++ `I/O设备接口层`实际上又可以划分为`抽象设备接口`和`具体设备`两个层次,前者屏蔽了不同设备之间的细节,为上层的文件系统提供统一的接口,后者则关注具体设备,如`disk`,`stdin`,`stdout`,读写等功能的具体实现。该层次对应的文件有`dev.c(h)`以及`dev_disk0.c`等具体设备文件。 + +在实际的运行过程当中,如用户程序请求读某一个文件,则首先调用用户库中读文件相关的函数,在`ucore`中是`user/file.c::read`,通过层层调用关系,该函数最终通过系统调用进入内核,调用了`sysfile_read`函数。 + +`sysfile_read`函数调用`vfs`层中`file.c(h)`提供的接口`file_read`来完成实质性的工作。而`file_read`则是调用`inode`层次中的`vop_read`函数进一步将工作向下传递。 + +`vop_read`调用某个具体文件系统实现的读文件的操作,这里是`sfs_read`函数,随后`sfs_read`调用与`设备接口层`之间的接口`sfs_rblock`与`sfs_rbuf`函数,将工作传递给实现该文件系统的设备层。 + +在`抽象设备接口层`调用`dop_io`来完成对抽象设备的读操作,该函数调用底层的具体设备,如`disk`,实现的磁盘读写函数,最终完成了对磁盘某几个区块的读操作。 + ## `file_open` `file_open`的调用路线