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教学操作系统

  • 9
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
西安工业大学的操作系统实验项目名为GeekOS,该项目是为了帮助学生更好地理解和运用操作系统的基本概念和原理而开发的。 GeekOS是一个小型的操作系统内核,它具有简洁而清晰的架构,使得学生可以更好地学习和掌握操作系统的要点。通过参与GeekOS实验,学生将学习如何设计和实现操作系统的各个关键模块。 在GeekOS实验中,学生将独立完成一系列的任务,包括对内核的启动和初始化、进程管理、内存管理、文件系统等等。通过这些实验,学生将深入了解到操作系统是如何工作的,包括进程调度、内存分配、文件访问等等。 GeekOS实验还包括了一些高级的主题,例如信号量、死锁检测、虚拟内存、文件系统等。通过这些实验,学生将进一步加深对操作系统的理解,并学会应用各种算法和技术解决实际的操作系统问题。 参与GeekOS实验的学生需要理解操作系统的基本原理,并且具备一定的编程能力,因为他们需要使用C语言来实现和测试操作系统的各个模块。通过实验,学生将学会如何运用理论知识来解决实际问题,并培养出良好的团队合作和解决问题的能力。 总而言之,西安工业大学的操作系统实验GeekOS是为了帮助学生更好地学习和理解操作系统的基本概念和原理而开发的,通过参与实验,学生将深入了解操作系统的工作原理,并学会应用相关技术解决实际的操作系统问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值