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:
学习时间 60分钟
操作时间 0分钟
按键次数 0次
实验次数 2次
报告字数 2700字
是否完成 完成