在 Linux 0.11 上实现 procfs(proc 文件系统)内的 psinfo 结点。当读取此结点的内容时,可得到系统当前所有进程的状态信息。例如,用 cat 命令显示 /proc/psinfo 的内容,可得到:
cat /proc/hdinfo total_blocks: 62000; free_blocks: 39037; used_blocks: 22963; ... copy procfs 及其结点要在内核启动时自动创建。 相关功能实现在 fs/proc.c 文件内。
先进行环境准备
修改include/sys/stat.h文件
对fs/namei.c文件中sys_mknod()函数进行修改,在其中增加关于proc文件系统的判断。
修改init/main.c文件
建立proc文件节点需要调用系统调用mkdir和mknod,因为在初始化时在用户态,不能直接调用,需要在初始化代码文件中实现这两个系统调用的接口。
修改fs/read_write.c文件
修改fs/read_write.c,添加extern,表示proc_read函数是从外部调用的,使proc文件可读
在sys_read函数中仿照其他if语句,加上S_IFPROC()的分支,添加对proc文件的proc_read()调用
新增fs/proc.c文件
修改fs/Makefile文件
进行make all编译并运行
1、如果要求你在 psinfo 之外再实现另一个结点,具体内容自选,那么你会实现一个给出什么信息的结点?为什么?
答:内存使用信息情况。内存是整个系统中最重要的资源,系统运行靠内存支持,能及时了解内存的使用情况是非常重要并且有意义的。
2、一次 read() 未必能读出所有的数据,需要继续 read(),直到把数据读空为止。而数次 read() 之间,进程的状态可能会发生变化。你认为后几次 read() 传给用户的数据,应该是变化后的,还是变化前的? + 如果是变化后的,那么用户得到的数据衔接部分是否会有混乱?如何防止混乱? + 如果是变化前的,那么该在什么样的情况下更新 psinfo 的内容?
答:后几次read()传递给用户的数据应该是变化之前的,因为读完一部分数据之后,之前读取的进程状态信息可能已经改变了,那么读给proc_buf缓冲区的内容还是读之前的,所以可能导致读到的数据出现混乱。要防止混乱,可以将取到的进程信息保存在硬盘的一个文件中,从该文件中直接读取,不需要每次read都重新生成进程信息,读完一次后就将硬盘上文件删除。
这次实验是proc文件系统的实现,并不复杂,但是花了较长时间完成。实验过程中查阅了老师所发的参考文件以及各个技术网站。整个过程还算顺利。而通过这次实验我了解了虚拟文件系统的实现原理;掌握了实践文件、目录、文件系统等概念。收获很多,但是还需要加以理解,真正掌握。
copy
学习时间 125分钟
操作时间 45分钟
按键次数 1178次
实验次数 4次
报告字数 2688字
是否完成 完成