2021操作系统GeekOS课程设计(桂电)--实现GOSFS文件系统和管道操作

GeekOS (GOSFS文件系统)

桂电2021年操作系统课设源码,主要实现了project5:GOSFS文件系统和project6:管道操作,项目源码和课设文档链接:https://github.com/diadestiny/GeekOS_course_desgin

project origin : GUET_Operation_Course_Design

last update time : 2021.5.2

modify author: GUET_diadestiny

  • 完善分页机制中的缺页中断处理(project4)
  • 实现GOSFS文件系统的基本操作(project5)
  • 实现基于管道操作的进程通信(project6)

同时本项目支持课设报告中的project2、project5、project6、部分project3、部分project4的功能,具体演示图查看对应课设报告部分。

因为网上已经有不少往届学长学姐关于project0、project1、project2、project3、project4的博客和源码,因此本项目主要针对实现project5和project6

1. 运行环境

笔者运行环境:真机ubuntu16.04、gcc-5.4.0、nasm-2.08.2

  • 经过测试,若读者环境为ubuntu9虚拟机,make出错有可能需要对makefile的部分地方进行修改,以及模拟器配置文件.bochsrc进行部分修改。
    2022年5月更新:经过测试,本课设代码如果需要在vmware虚拟机无报错运行,需要满足安装以下条件:

笔者采用的ubuntu真机或者虚拟机16.04安装镜像:
链接:https://pan.baidu.com/s/1RS3Fp5whhO351Pjy1YuZFA
提取码:2156

//ubuntu-16.04.6-desktop-amd64.iso 虚拟机镜像为ubuntu16 (重点)
//安装 gcc 5.4.0 (重点,ubuntu16自带的gcc 5.4.0)
sudo apt-get install build-essential
sudo apt-get install bochs
sudo apt-get install bochs-x
//nasm(2.08.2及以上)
sudo apt-get install nasm
//以上环境安装完,本代码可以直接运行(build文件夹下已经编译好了)

编译报错踩坑:

//先更新软件源(该步骤卡住自行百度换源,网络问题)
sudo apt-get update
//不更新软件源可能找不到以下安装包
//make depend 编译报错:fatal error: sys/cdefs.h,没有那个文件或目录
//因为使用了-32指令,我的ubuntu16.04系统为64位的,无法直接编译执行32位机器指令
sudo apt install libc6-dev-i386
  • 配置GOSFS文件系统需要重点注意:
  ata0-master: type=disk, mode=flat, translation=auto, path="diskc.img"...
  ata0-slave: type=disk, path="diskd.img" ...

其中diskc.img是原生的PFAT文件系统挂载区域,注意配置加上第二行,diskd.img是GOSFS文件挂载区域。

2.运行步骤

  • 编译步骤: 1.cd build 2.make depend 3.make (如果不对源码做修改,可以省略)
  • 启动步骤: 1.cd build 2.输入bochs 3.接着输入c

3. 用户可运行功能进程位于src/user/目录下

只读PFAT文件系统位于/c路径下,区域为/ide0,可读写GOSFS文件系统位于/d路径下,区域为ide1

  • ls /c
  • cat [file_path_name]
  • mkdir /d/[directory_name]
  • rm [directory_path_name|file_path_name]
  • ls /c | more //管道通信
  • fsend --消息队列mqueue发送消息到缓冲区
  • frecv --消息队列mqueue从缓冲区接受消息
  • 其他可支持的命令cp cat等(具体见src/user/目录)

4.GOSFS文件系统实现简介

在/src/geeekos/gosfs.c中实现以下函数:
GOSFS_Fstat()函数:为给定的文件得到元数据。
GOSFS_Read()函数:从给定文件的当前位置读数据。
GOSFS_Write()函数:从给定文件的当前位置写数据。
GOSFS_Seek()函数:在给定文件中定位。
GOSFS_Close( )函数:关闭给定文件。
GOSFS_Fstat_Directory()函数:为一个打开的目录得到元数据。
GOSFS_ Close_Directory()函数:关闭给定目录。
GOSFS_Read_Entry()函数:从打开的目录表读一个目录项。
GOSFS_Open()函数:为给定的路径名打开一个文件。
GOSFS_Create_Directory()函数:为给定的路径创建一个目录。
GOSFS_Open_Directory()函数:为给定的路径打开一个目录。
GOSFS_Delete()函数:为给定的路径名删除一个文件。
GOSFS_stat()函数:为给定的路径得到元数据(大小、权限等信息)。
GOSFS_Sync()函数:对磁盘上的文件系统数据实现同步操作。
GOSFS_Format()函数:格式化GOSFS 文件系统操作。
GOSFS_Mount()函数:挂载文件系统操作。

4.1.设计原理及分析过程

项目5需要实现GOSFS文件系统,由于GeekOS原生支持了PFAT文件系统,本项目在通过磁盘块中的第0块(超级块)的起始标记magic(魔数)内容来验证该系统为GOSFS文件系统,并且PFAT文件系统挂载在存储设备ide0硬盘上,路径通常规定为/c, 而GOSFS文件系统挂载在二级存储设备ide1硬盘上,路径通常规定为/d。

GOSFS文件系统通过GOSFS_Format()函数格式化磁盘。首先调用函数Get_Num_Blocks()以获取磁盘容量,将其转换为磁盘块数,然后计算用于维护可用磁盘块的位图矢量的大小,清空相应位置,然后创建根目录,并使Root Dir指针指向目录,然后将相关数据填充到超级块中。

接着是设计文件系统的磁盘空间分布,其主要涉及GOSFS_Dir_Entry结构体,其中保存了目录和文件的相关信息,其中的blockLisas成员数组记录了文件数据块指针,布局如图7.1所示,其采用直接块和间接块(二级间接)的方式进行存储,每级可以存储1024个直接块,因此文件系统最多可以保存1024*1024个数据块。

在这里插入图片描述
GOSFS文件系统的实现使用类UNIX文件系统的inode形式。其有更大的灵活性和更通用的抽象,以减轻进一步的增强。每个目录分配一个inode,就像文件一样,只是inode中指示的大小表示目录条目的数量,而不是物理大小。目录的内容存储在单独的块中,仅由inode的直接块指针引用。这些块包含一个或多个目录条目以表示目录的内容。通过仅使用直接块指针,目录项的数量限制为240。这对于教学实验系统GeeKOS其实来说已经足够了。
从PFAT系统切换成GOSFS文件系统,其主要操作包含GOSFS_Format、GOSFS_Mount两个函数。GOSFS_Format操作用于文件系统的格式化,进一步加载安装到GeekOS。主要作用是将原始磁盘格式化为GOSFS格式,同时利用魔数标记位检查是否已经格式化GOSGS格式。GOSFS_Mount操作负责加载操作,该操作首先初始化内存中的GOSFS_Superblock,之后初始化Mount_Point,最后创建一个空目录,通常规定为/d。

测试格式化和挂载GOSFS文件系统的操作为

format ide1 gosfs
mount ide1 /d gosfs

在格式化并挂载完成GOSFS文件系统后,需要调用Mount_Point()函数,里面需要利用一个Mount_Point对象(包含一个指向文件系统映像所在块设备的指针)。用户可能需要创建一个辅助的数据结构,存储在挂载点里。这个挂载点是进行以下Open、Delete、Create_Directory等等文件操作的关键对象。比如调用打开文件函数,我们需要将指向辅助数据结构的指针存入该对象的FSData域中。
Mount_Point对象具体支持文件操作如下:

  1. GOSFS_Open():在挂载文件系统里打开文件。
  2. GOSFS_Create_Directory():在挂载文件系统里面创建目录。
  3. GOSFS_Open_Directory():在挂载文件系统里面打开目录。
  4. GOSFS_Stat():为已经命名的文件恢复文件元数据,比如文件权限。
  5. GOSFS_Sync():刷新所有存储在内存的,还没有写入磁盘的元数据。
  6. GOSFS_Delete():在挂载文件系统里删除指定路径的文件或文件夹。

4.2 Project5项目运行分析

Bochs模拟器启动GeekOS系统后,通过ls指令进行测试,列出/c路径文件系统下的所有文件,如图所示,显示PFAT只读文件下挂载的所有文件。
在这里插入图片描述
接着,通过format和mount指令格式化和加载GOSFS文件系统,成功格式化和挂载GOSFS文件系统。
在这里插入图片描述
在这里插入图片描述
系统还可以通过mkdir指令创建文件夹,touch指令创建文件,rm指令删除文件夹或文件。
图7.6 touch指令测试

更多GOSFS文件系统和管道操作分析内容、效果图见github链接的参考课设报告

参考来源

本项目改自于国外bos教学操作系统

  • 10
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值