作者:sawachan_107 | 来源:互联网 | 2023-06-03 12:16
本实验的代码地址:https://github.com/yjc567/HDU_OS_Assignment_2017_SimpleFileSystem,如有需要,欢迎自行取用,但是不建议你拿着这个代码去验收,自己的知识永远是自己的,好好学习才是王道!
emmmm想写一个操作系统的课程设计说明,因为自己写的时候也遇到了好多问题,外加感觉对实验指导书的说明有些疑问,觉得写出来可以给别人看看。但是感觉写出来的东西……没什么好看的。
因为这个系统还是有点复杂,但是自己又没有太多的时间和能力把这个复杂的系统说清楚。
存储功能的接口实现
课程设计的文件系统是个类似fat的文件系统结构。fat的结构可以大致参考一下课程设计书或者上课ppt的内容,如下图。磁盘被分为若干块相同大小的磁盘块,一个文件的fcb会记录一个文件的大小和这个文件对应的fat起始物理块号,fat表会标记出一个物理块号的下一个物理块号,如果是EOF,则表明这个物理块是一个文件的最后一个物理块。这些物理块号的二进制文件串联起来后,就是一个文件的内容。
每次文件系统程序运行的时候,程序会申请一个大小为1024000字节的内存空间,作为虚拟的磁盘空间。申请完成后,程序就会试图打开一个名为myfsys
的文件,这个文件是上一次程序运行结束时,内存中的虚拟磁盘空间的备份。如果myfsys
文件不存在,或者myfsys
的前八个字节不是二进制数01010101的话,程序就会进行系统的初始化,反之会通过fread()
函数把myfsys
读进内存空间。
那么怎么把fcb结构体或字符串写进虚拟磁盘空间或者从虚拟磁盘空间读出fcb结构体或字符串呢?利用memcpy()
函数就好了,这个函数可以自行地把各种变量的内存写到其它内存上。因此,如果我们要读出一个目录文件下有哪些文件,只要根据这个目录文件的fcb从虚拟磁盘上读出相应的信息,然后把信息加载到一个个fcb结构体中,就得到了其目录下的fcb文件。
文件系统基础功能的分析和实现
创建文件功能
不管是创建文件夹还是创建文件,其实都是在其父目录对应的文件目录下新增一个新的fcb,只不过fcb的内容稍有不同,所以自己用my_touch()
函数来创建对应的文件(其实Linux下就有touch
命令,就是用来创建文件的),然后再根据这个文件的类型进行其它的相应操作。
打开文件功能
与上同理,不管是打开文件夹还是打开文件,其实就是打开一个文件fcb并读取相关信息。于是my_cd()
函数和my_open()
函数其实都是一样的功能,写一个,调用一个就好了。
指导书中的一些问题和疑惑
文件夹fcb中的.
和..
文件项有什么用
没用,真的没用,至少我认为用了这两个文件项会出bug,因为当你用./
这个目录打开当前目录的时候,当前目录会把./
当成自己的父目录,当当前目录发生了修改,需要把修改后的信息写入父目录时,其实际父目录不会发生修改。
然后自己是写了一个rewrite_dir()
函数来把输入的目录改写成一个完整的目录,每次从根目录打开文件夹,避免使用.
和..
文件项。