实验名称:proc文件系统的实现 实验日期:2020年6月25日 班级:物联网183 姓名:刘董升 学号:1813061090 一.实验预习报告 1.实验相关知识的简述: 正式的 Linux 内核实现了 procfs,它是一个虚拟文件系统,通常被 mount(挂载) 到 /proc 目录上,通过虚拟文件和虚拟目录的方式提供访问系统参数的机会,所以有人称它为 “了解系统信息的一个窗口”。 这些虚拟的文件和目录并没有真实地存在在磁盘上,而是内核中各种数据的一种直观表示。虽然是虚拟的,但它们都可以通过标准的系统调用(open()、read() 等)访问 2.实验原理的预习情况: 如果要求你在 psinfo 之外再实现另一个结点,具体内容自选,那么你会实现一个给出什么信息的结点?为什么?
答:会实现meminfo、cpuinfo这些节点,分别对应的信息是系统内存信息和cpu的信息。 一次 read() 未必能读出所有的数据,需要继续 read(),直到把数据读空为止。而数次 read() 之间,进程的状态可能会发生变化。你认为后几次 read() 传给用户的数据,应该是变化后的,还是变化前的? + 如果是变化后的,那么用户得到的数据衔接部分是否会有混乱?如何防止混乱? + 如果是变化前的,那么该在什么样的情况下更新 psinfo 的内容?
答:后几次read()传递给用户的数据应该是变化前的,因为读完一部分数据之后,之前读取的进程状态信息可能已经发生了改变了,那么读给proc_buf缓冲区的内容还是读之前的,所以可能会导致读到的数据出现混乱(数据不正确?),要使得数据读的正确、不混乱,就要在读的时候让想要变化的进程先等待,等读完了数据放到了文件中以后,再唤醒要更新的进程。
3.实验注意事项:
二.实验报告
1.实验目的与要求:
掌握虚拟文件系统的实现原理; 实践文件、目录、文件系统等概念。
2.实验仪器或材料:
oslab实验环境、Linux环境及语言。
3.实验原理:
在 Linux 0.11 上实现 procfs(proc 文件系统)内的 psinfo 结点。当读取此结点的内容时,可得到系统当前所有进程的状态信息。
4.实验过程及数据分析:
1.配置环境
2.在include/sys/stat.h文件中定义了几种文件类型和相应的测试宏:
3.3.让mknod()支持新的文件类型,修改/fs/namei.c
4.进程proc文件初始化,修改/init/main.c
5.编译内核
6.修改sys_read().首先在/fs/read_write.c中添加声明
7.创建/fs/proc.c文件实现上述的proc_read()函数,用于读取proc文件内容
8.编译内核
9.输出cat命令,查看psinfo和hdinfo信息
学习时间 72分钟
操作时间 15分钟
按键次数 9895次
实验次数 2次
报告字数 2601字
是否完成 完成