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

proc文件系统的实现

1、实验目的与要求: 目的: 掌握虚拟文件系统的实现原理; 实践文件、目录、文件系统等概念。 要求: 自动创建 /proc、/proc/psinfo、/proc/hdinfo、/proc/inodeinfo psinfo 内容可读,内容符合题目要求 hdinfo 内容可读,符合题目要求 2、 实验仪器或材料: oslab实验环境、Linux环境及语言。 3、实验原理: Linux 是通过文件系统接口实现 procfs,并在启动时自动将其 mount 到 /proc 目录上。 此目录下的所有内容都是随着系统的运行自动建立、删除和更新的,而且它们完全存在于内存中,不占用任何外存空间。 Linux 0.11 还没有实现虚拟文件系统,也就是,还没有提供增加新文件系统支持的接口。所以本实验只能在现有文件系统的基础上,通过打补 丁的方式模拟一个 procfs。 4、实验过程及数据记录: 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函数实现对其的调用 图片描述 图片描述 现在开始尝试重新编译运行系统: 图片描述 这些信息说明内核在对 psinfo 进行读操作时不能正确处理,向 cat 返回了 EINVAL 错误。因为还没有实现处理函数,所以这是很正常的。这 些信息至少说明,psinfo被正确open()了。所以不需要对sys_open()动任何手脚,唯一要打补丁的,是sys_read()。 4.修改fs/read_write.c文件 为了让proc文件可读,修改fs/read_write.c添加extern,表示proc_read函数是从外部调用的: 图片描述 然后在sys_read函数中仿照其他if语句,加上 S_IFPROC() 的分支,添加proc文件的proc_read()调用: 图片描述 5.新增/fs/proc.c文件 proc文件的处理函数的功能是根据设备编号,把不同的内容写入到用户空间的buf。写入的数据要从 f_pos 指向的位置 开始,每次最多写count个字节,并根据实际写入的字节数调整 f_pos 的值,最后返回实际写入的字节数。当设备编号表明要读的是psinfo的 内容时,就要按照 psinfo 的形式组织数据。在fs目录下新增proc.c文件,文件信息如下: 图片描述 5.新增/fs/proc.c文件 proc文件的处理函数的功能是根据设备编号,把不同的内容写入到用户空间的buf。写入的数据要从 f_pos 指向的位置 开始,每次最多写count个字节,并根据实际写入的字节数调整 f_pos 的值,最后返回实际写入的字节数。当设备编号表明要读的是psinfo的 内容时,就要按照 psinfo 的形式组织数据。在fs目录下新增proc.c文件,文件信息如下: 图片描述 图片描述 6.修改fs/Makefile文件 图片描述 图片描述 7.运行验证 重新编译运行linux-0.11: 图片描述

最新评论
暂无评论~