“操作系统实验”实验报告

proc文件系统的实现

实验名称:终端设备的控制

实验日期:2022年5月27日

班级:软嵌201 姓名:邓浩礼 学号:2030110734

一、实验目的

掌握虚拟文件系统的实现原理;

实践文件、目录、文件系统等概念。

二、实验环境

本操作系统实验的硬件环境是 IA-32(x86) 架构的 PC 机(在实验楼的环境中就是右侧的窗口),主要软件环境是 Bochs + gcc + 你最喜欢的编辑器 / IDE + 你最喜欢的操作系统 + Linux 0.11 源代码。

三、实验内容

在 Linux 0.11 上实现 procfs(proc 文件系统)内的 psinfo 结点。当读取此结点的内容时,可得到系统当前所有进程的状态信息。

四、实验过程及数据记录

环境准备

图片描述

增加新文件类型 在 include/sys/stat.h 文件中增加新文件类型和测试宏,增加的内容如下:

图片描述

修改 mknod 函数 使创建结点的 mknod() 函数支持新的文件类型,修改 fs/namei.c 文件中的 sys_mknod() 函数

图片描述

建立 /proc 目录和目录下的结点

建立目录和结点分别需要调用 mkdir() 和 mknod() 系统调用。因为初始化时已经在用户态,所以不能直接使用系统调用,必须在 main.c 文件头添加如下系统调用的用户态接口:

图片描述

接下来即可在 init() 中创建目录和节点,增加如下代码:

图片描述

修改 sys_read() 系统调用,使之能够读取 proc 类型文件

目前通过 cat: /proc/psinfo 指令是无法查看 psinfo 的内容的,因为此时 sys_read() 还不知道如何读取这种类型的文件,因此需要修改 sys_read() 使其在读此类文件的时候调用某个处理函数来实行某种功能,即完成对文件的“读”。 首先打开文件 fs/read_write.c ,在其中的 sys_read 函数中,增添如下语句,即如果读到了 PROC 文件,就直接调用 proc_read 函数(该函数还没有被定义,因此接下来我们需要写这个函数)

图片描述

实现上述的 proc_read() 函数 在 fs目录下创建proc.c 文件,即 fs/proc.c ,如下

图片描述

图片描述

需要修改 fs/Makefile 中的编译规则。

图片描述

在Bochs虚拟机中验证。

图片描述

五、实验结果分析

如果要求你在 psinfo 之外再实现另一个结点,具体内容自选,那么你会实现一个给出什么信息的结点?为什么?

回答:

我会实现meminfo结点,因为内存是整个系统中最重要的资源,系统的运行要靠内存的支持,能及时了解内存的使用情况是有意义的。

一次 read() 未必能读出所有的数据,需要继续 read(),直到把数据读空为止。而数次 read() 之间,进程的状态可能会发生变化。你认为后几次 read() 传给用户的数据,应该是变化后的,还是变化前的? + 如果是变化后的,那么用户得到的数据衔接部分是否会有混乱?如何防止混乱? + 如果是变化前的,那么该在什么样的情况下更新 psinfo 的内容?

回答:

按照目前的实现方法,如果在几次read之间进程状态发生变化,后几次传递给用户的是变化后的信息,那么可能会导致信息混乱。如果要防止混乱发生,可以考虑将取到的进程信息保存在硬盘的一个文件中,读取时只要该文件存在,就从文件中直接读取,而不是每次read都重新生成进程信息,而一次读动作完成后(返回0)就将硬盘上的文件删除。这样下次再时再次生成文件。这样可以保证传递的数据是一致的。

最新评论
暂无评论~