本Project主要是需要实现Inode
、File
、Directory
层的一些接口函数,以实现一个文件系统对文件、目录的读取功能。
本文件中主要实现了inode_iget
和inode_indexlookup
两个函数。
其中,inode_iget
通过给定的inode
编号从文件系统中获取对应的inode
内容。主要通过计算出一个block
中能够存放的inode
结构数量,来计算给定的inode
编号应当处于连续磁盘的具体哪个block
上,以及在该block
上的偏移量。而后,只需要将这个block
通过disk相关的函数读取进来,返回对应偏移位置上的inode
即可。
至于inode_indexlookup
则是负责通过给定的文件在inode
上的block
编号,获取具体文件在磁盘上的block
编号。实现该函数的主要思路为:对文件类型进行判断,对于小文件,直接解读inode
结构中的i_addr
字段,获取对应block
编号上的值即可;而对于大文件,则需要判断其是否在单次间接block
中,还是要去二次间接block
上获取。无论何种方式,均是通过计算偏移量来获得block
编号所在的磁盘block
,而后在该block
上获取需要的i_addr
中的具体值。
本文件中的file_getblock
函数目标为获取给定文件block
的内容。具体实现上,通过给定的inode
编号调用inode_iget
获取对应inode
,而后调用inode_indexlookup
获取文件所在的block
编号,之后就能直接从disk上读取到对应block
的内容。由于函数还需要返回读取到文件的实际大小,因此,我们可以通过inode
中存储的文件大小信息,来判断该文件需要多少个block
来存储;再根据我们此次查询的block
编号来判断是否为该文件的最后一个block
。除文件的最后一个block
外,其余block
的大小应当占满整个block
,即大小为DISKIMG_SECTOR_SIZE
。
本文件中的directory_findname
函数是用于查询给定目录中给定名称的文件内容并获取。在实现上,只需要读取给定的inode
,通过该inode
的大小来判断该inode
中的存储占据了多少个磁盘block
。对这些数量的block
进行循环读取,再对读取到的block
内容按照direntv6
结构进行解析,查询其d_name
是否与给定的name
相同,即可找到该目录下名称为name
的文件。
本文件中的pathname_lookup
函数通过给定的绝对路径获取对应的inode
编号。实现该函数的主要思路为:首先对给定的路径是否为根目录进行判断,如果是,则直接返回ROOT_INUMBER
;否则对路径进行递归解析,不断切割出头上的父目录、获取对应inode
、在对应inode
上解析子路径,直至子路径不再包含分隔符,即到达目录最深处时,返回所在entry
的inode
编号。
由于没有提供sanitycheck
工具,因此我通过命令行中执行给定的测试命令,并将输出与给定的gold结果进行比对来测试程序的正确性。
最终,在三个Disk Image上执行i、p两项功能均与给定的标准输出相同,通过了测试。