From fb612a4dca2e17c049c6dc0e0d4f2401b2d7130e Mon Sep 17 00:00:00 2001 From: Shine wOng <1551885@tongji.edu.cn> Date: Wed, 4 Dec 2019 14:00:47 +0800 Subject: [PATCH] add lab8_report.md, remain to be completed. --- thu_os/lab8_report.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 thu_os/lab8_report.md diff --git a/thu_os/lab8_report.md b/thu_os/lab8_report.md new file mode 100644 index 0000000..366d1ff --- /dev/null +++ b/thu_os/lab8_report.md @@ -0,0 +1,38 @@ +Lab8 Report +=========== + +## 实验目的 + +通过完成本次实验,希望能达到以下目标 + ++ 了解基本的文件系统系统调用的实现方法; ++ 了解一个基于索引节点组织方式的`Simple FS`文件系统的设计与实现; ++ 了解文件系统抽象层`VFS`的设计与实现。 + +## 实验内容 + +实验七完成了在内核中的同步互斥实验。本次实验涉及的是文件系统,通过分析了解`ucore`文件系统的总体架构设计,完善读写文件操作,重新实现基于文件系统的执行程序机制(即改写`do_execve`),从而可以完成执行存储在磁盘上的文件和实现文件读写等功能。 + +## 练习 + +对实验报告的要求: + ++ 基于markdown格式来完成,以文本方式为主 ++ 填写各个基本练习中要求完成的报告内容 ++ 完成实验后,请分析`ucore lab`中提供的参考答案,并请在实验报告中说明你的实现与参考答案的区别 ++ 列出你认为本实验中重要的知识点,以及与对应的OS原理中的知识点,并简要说明你对二者的含义,关系,差异等方面的理解(也可能出现实验中的知识点没有对应的原理知识点) ++ 列出你认为OS原理中很重要,但在实验中没有对应上的知识点 + +## `file_open` + +`file_open`的调用路线 + ++ `syscall/sys_open`调用`sysfile_open`,转到了`vfs`层的`file_open`; ++ 为了打开一个文件,首先需要找到该文件所在的目录(根目录或者相对路径目录)对应的`inode`,然后再通过读取该`inode`的内容(即`sfs_disk_entry`),逐个判断路径名是否匹配。 ++ 需要注意的是`打开文件`并不类似于`读文件`或者`写文件`这种操作,前者是文件系统应该提供的操作,而后者是某个文件应该提供的接口。因此在`vfs`层中还抽象出了三个子层(也许还有更多),分别是`file`层,`inode`层和`fs`层,`file_open`调用`fs`层的`vfs_open`来完成实际的工作。 ++ `vfs_open`调用`vfs_lookup`来进行对路径的查找。 ++ `vfs_lookup`首先需要找到根目录或者当前目录的`inode`,因此调用了`get_device`找到起始的查找目录。此后的操作就归结于目录`inode`的查找工作了,因此调用`inode`子层的`vop_lookup`从获得的目录开始查找指定路径。 ++ `vop_lookup`调用具体文件系统`sfs`的`sfs_lookup`,后者再调用`sfs_lookup_once`,这表明了`ucore`中实现的文件系统只有一级目录。 ++ `sfs_lookup_once`调用`sfs_dirent_search_nolock`逐个读出目录`inode`中记载的内容,即各个文件的`sfs_disk_entry`信息,并对文件名进行比对。为了简单起见,这里的存储策略是每个目录项单独存储在一个`block`当中(这也太浪费了 ++ 如果路径正确,`sfs_lookup_once`将找到目标文件的`sfs_disk_entry`,其中记录了它的控制块`sfs_disk_inode`在硬盘上的位置,将该控制块从硬盘读出,并且逐步封装成`sfs_inode`和`inode`,就基本完成了读文件的操作。需要注意的是这里需要调用`sfs`层与`device`层之间的接口,相关函数定义在了`sfs_io.c`当中。 ++ 最后在`file_open`函数中,返回打开文件的文件描述符`fd, file descriptor`即可,这里的`fd`实际上是打开文件在进程的`打开文件表`中的索引。