miko L17 2021-07-07 19:03:37 proc文件系统的实现
115 0

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

proc文件系统的实现

实验名称:proc文件系统的实现

实验日期:2021.7.7
班级:软嵌192
姓名:冯子正
学号:1930110817

一、实验目的

  • 掌握虚拟文件系统的实现原理;
  • 实践文件、目录、文件系统等概念。

二、实验环境

hit-oslab 实验环境


三、实验内容 在 Linux 0.11 上实现 procfs(proc 文件系统)内的 psinfo 结点。当读取此结点的内容时,可得到系统当前所有进程的状态信息。 procfs 及其结点要在内核启动时自动创建。

相关功能实现在 fs/proc.c 文件内。

四、实验过程及数据记录

1.修改include/sys/stat.h文件 增加新文件类型,在此文件内新增proc文件的宏定义以及测试宏。 图片描述 2.修改namei.c文件 文件/proc/psinfo以及/proc/hdinfo索引节点需要通过mknod()系统调用建立,这里需要让它支持新的文件类型。可直接修改fs/namei.c文件中的sys_mknod()函数的一行代码,在其中增加关于proc文件系统的判断: 图片描述

3.修改init/main.c文件 main()函数在init后直接挂载了根文件系统,挂载之后就可以创建proc文件了,首先创建/proc文件目录,然后再建立该目录下的各个proc文件节点。在建立这些节点和目录时需要调用系统调用mkdir和mknod,因为初始化时在用户态了,所以不能直接调用,必须在初始化代码所在的文件中实现这两个系统调用的用户态接口。修改init/main.c,新增两个系统调用用户接口并接着修改init函数实现对其的调用: 图片描述 图片描述 4.修改fs/read_write.c文件 为了让proc文件可读,修改fs/read_write.c添加extern,表示proc_read函数是从外部调用的。 图片描述 然后在sys_read函数中仿照其他if语句,加上 S_IFPROC() 的分支,添加proc文件的proc_read()调用: 图片描述 需要传给处理函数的参数包括:

  • inode->i_zone[0],这就是 mknod() 时指定的 dev ——设备编号
  • buf,指向用户空间,就是 read() 的第二个参数,用来接收数据
  • count,就是 read() 的第三个参数,说明 buf 指向的缓冲区大小
  • &file->f_pos,f_pos 是上一次读文件结束时“文件位置指针”的指向。这里必须传指针,因为处理函数需要根据传给 buf 的数据量修改 f_pos 的值。

5.新增/fs/proc.c文件 proc文件的处理函数的功能是根据设备编号,把不同的内容写入到用户空间的buf。写入的数据要从 f_pos 指向的位置开始,每次最多写count个字节,并根据实际写入的字节数调整 f_pos 的值,最后返回实际写入的字节数。当设备编号表明要读的是psinfo的内容时,就要按照 psinfo 的形式组织数据。在fs目录下新增proc.c文件 图片描述 6.修改fs/Makefile文件 图片描述 图片描述 7.运行验证 重新编译运行linux-0.11 图片描述 图片描述 查看psinfo(当前系统进程状态信息)和hdinfo(硬盘信息)的信息,发现符合预期。

五、实验结果分析

能按照题目要求完成所需任务


六、实验心得

proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux内核空间和用户间之间进行通信。在 proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段.

最新评论
暂无评论~