## 操作系统课设——模拟 Linux 文件系统
### 一、**设计目的**
本设计的目的是实现操作系统和相关系统软件的设计,其中涉及进程编程、I/O 操作、存储管理、文件系统等操作系统概念。
### 二、设计要求
(1)进行认真分析,列出实验具体步骤,写出符合题目要求的程序清单,准备出调试程序使用的数据。
(2)以完整的作业包的形式提交原始代码、设计文档和可运行程序。提交的光盘应当包括:设计题目,程序清单,运行结果分析,所选取的算法及其优缺点,以及通过上机取得了哪些经验。程序清单要求格式规范,注意加注释(包含关键字、方法、变量等),在每个模块前加注释,注释不得少于 20%。课程设计要求同时上交打印文档,设计报告包括设计题目,算法分析,关键代码及其数据结构说明,运行结果分析以及上机实践的经验总结。
### 三、**具体设计与详细分析**
#### **设计一:**
##### (一)**设计题目**
1) 在现有机器硬盘上开辟 100M 的硬盘空间,作为设定的硬盘空间。
2) 编写一管理程序 simdisk 对此空间进行管理,以模拟 Linux 文件系统,要求:
盘块大小 1k
空闲盘块的管理:Linux 位图法
结构:超级块, i 结点区, 根目录区
3) simdisk 管理程序的功能包括:info、cd、dir、md、rd、newfile、cat、copy、del、check。
##### (二)**设计思路及步骤**
1) 新建一个 100M 大小的文件作为文件系统磁盘,后续 simdisk 的功能操作相当于读写该文件。
2) 对文件按照盘块大小 1k 分块,一共 102400 个块,对文件的操作以一个块为单位。
3) 定义超级块结构,记录文件系统的信息,保存到块#0。
4) 空闲盘块的管理使用位图法,一个块 1024 个字节共 8192 位,一个位记录一个块,为 0 表示空闲,一共需要 13 个块保存位图,使用块#1-#13。
5) 定义 inode 结构和目录项结构,inode 节点为目录(特殊文件)和文件的索引,里面包含文件的信息,以及 128 个直接索引和 64 个一级索引,可保存 264192 个目录项或 16MB 大小的文件,对于 100M 的文件系统已经满足要求了。目录项包括文件名和文件的 inode 所在块号,一个块号可保存 16 个目录项,目录信息的保存同文件内容一致,在读取时根据本节点是目录解析成目录项。
6) 对磁盘文件进行划分,分为 inode 区和文件区,可在使用过程中进一步调整。
![](https://www.writebug.com/myres/static/uploads/2021/11/16/7498c52530f55b13adc810f79a958887.writebug)
图一 磁盘分区
7) 定义超级块及根目录,初始化信息,写进磁盘。
8) 逐个编写 simdisk 程序功能。
##### (三)**主要数据结构**
1) 超级块:包括文件系统创建时间、大小、块数、空闲块、根目录 inode 所在块号等。
![](https://www.writebug.com/myres/static/uploads/2021/11/16/00d665ad0b1cac441a77c334a45e5948.writebug)
图二 超级块结构
2) inode 节点:包括文件类型、文件大小、文件数目(针对目录)、创建时间、最近访问时间、文件内容的直接索引与一级索引等。
![](https://www.writebug.com/myres/static/uploads/2021/11/16/829321a691f320edf0716a65ade81ffa.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/11/16/d194b5a3feeb084110fb32587e427681.writebug)
图三 inode 节点结构
##### (四)**算法及关键代码分析(定义在 init.h/cpp)**
1) 创建 100M 大文件模拟磁盘,主要调用 windons.h 的低层函数,通过移动文件指针来实现,如下是具体代码。
图四 创建文件
2) 为了便于后续操作,将读写磁盘块封装成函数,在初始化时使用全局变量打开文件系统,根据块号移动读写指针到指定位置然后进行读写。
![](https://www.writebug.com/myres/static/uploads/2021/11/16/33a2a6ab437f5e13c87c86de6f3766d8.writebug)
图五 读写文件块
3) 获取空闲块,主要由新建目录和新建文件调用,调用之前由超级块信息确认空闲,主要定义 bitset<8192> 去读取一个块的位图信息,然后逐个判断找到位为 0 为止,然后设为 1 写回,根据位图处在块号和 0 的位置计算出其对应块号返回。这里有一个改进的地方就是在超级块中记录上一次返回空闲块的位置,这次直接在上次的位置开始查找,减少重复查找,提高效率。如下是获取文件区空闲块的代码展示,获取 inode 节点思路相同。
![](https://www.writebug.com/myres/static/uploads/2021/11/16/b21dfdae56d060ad0091071aafdfe2a9.writebug)
图六 获取空闲块
4) 新建文件目录及新建文件,主要是申请一个 inode 块号,初始化信息,如果是目录则需要申请一个目录块保存.. .两个隐藏目录,分别指向上一级目录和当前目录,最后返回目录或者文件的 inode 块号。如下是新建文件,新建目录参考源代码。
![](https://www.writebug.com/myres/static/uploads/2021/11/16/b66fb4b31e6a18cd68c574b2f4d1870f.writebug)
图七 新建文件
5) 回收空闲块,计算空闲块号对应的保存块,读出来然后将对应位置位 0,并判断当前块号属于 inode 区还是 file 区,空闲块数加一,确保一致。
更多操作![](https://www.writebug.com/myres/static/uploads/2021/11/16/4381c74c6478a22ca0453ac4ddf0153a.writebug)
图八 回收空闲块
6) 开机初始化和关机保存,为了方便后续 simdisk 功能操作实现,这里定义了一些全文件变量,如 fstream,用来打开磁盘等,开机函数,主要加载打开文件和加载超级块,关机函数则将超级块写回磁盘,关闭磁盘。有 simdisk 程序在开始和结束时调用。
![](https://www.writebug.com/myres/static/uploads/2021/11/16/e882474419e59ab3346c460ea22e68da.writebug)
图九 开机关机
##### (五)**simdisk 功能实现--算法及关键代码分析(定义在 simdisk.h/cpp)**
###### (1) **整体设计思路:**
首先根据输入的第一个参数判断是否是正确命令,不是输出错误返回,如果是则调用命令对应的函数。
每个命令定义一个同命令名的函数,单独去判断该命令所接受的参数是否符合。并将各个命令中有联系的部分抽象出来单独封装成一个函数,如根据路径名查找返回对应文件或者目录的 inode 块号等,让代码更加简洁可观。
目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开,所以在调用命令时需要将当前所在目录与输入的路径结合成正确的绝对路径。
因为整个文件系统设计中 simdisk 主要作为后台程序由 shell 调用,故每一个命令的运行都是一个进程,故当前目录信息需要共享内存给 shell,在设计二讨论。
###### (2) **通用函数实现算法及代码分析:**
1) merge 函数,当前目录与输入路径通过判断生成最终的绝对路径。主要是判断第一个字节是否是‘/’,以确定输入的路径是否是绝对路径。
![](https://www.writebug.com/myres/static/uploads/2021/11/16/20675dd2905039d13a3ecd123881b873.writebug)
图十 merge 函数
2) process_route 函数,将传入的路径以/分隔开,存入 vector 容器中返回,如果遇到‘.’则不放进 vector,如果‘..’且当前 vector 不为空,就 pop_back 一个,实现对./和../的操作。
![](https://www.writebug.com/myres/static/uploads/2021/11/16/e31076ea498d515f061944a637a99439.writebug)
图十一 process_route 函数
3) find_dir_inblock 函数与 find_dirterm 函数
find_dir_inblock 函数,在 inode 为 b_num 的目录下查找目录或文件 str,返回其 inode 块号,不存在返回-1;
find_dirterm 函数,在目录块(一个目录块最多保存 16 �
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
100012529-基于C语言模拟Linux文件系统.zip (63个子文件)
linuxfile
picture
wps122.jpg 60KB
wps148.jpg 88KB
wps140.jpg 75KB
wps137.jpg 12KB
wps127.jpg 48KB
wps102.jpg 71KB
wps114.jpg 109KB
wps123.jpg 124KB
wps147.jpg 79KB
wps138.jpg 48KB
wps100.jpg 73KB
wps128.jpg 71KB
wps115.jpg 66KB
wps103.jpg 120KB
wps133.jpg 22KB
wps111.jpg 170KB
wps117.jpg 42KB
wps106.jpg 109KB
wps145.jpg 56KB
wps129.jpg 76KB
wps118.jpg 32KB
wps99.jpg 162KB
wps120.jpg 32KB
wps134.jpg 78KB
wps112.jpg 147KB
wps113.jpg 126KB
wps101.jpg 99KB
wps135.jpg 91KB
wps141.jpg 81KB
wps105.jpg 77KB
wps110.jpg 86KB
wps139.jpg 87KB
wps125.jpg 39KB
wps146.jpg 67KB
wps136.jpg 55KB
wps116.jpg 47KB
wps108.jpg 59KB
wps121.jpg 29KB
wps143.jpg 90KB
wps144.jpg 53KB
wps130.jpg 100KB
wps142.jpg 27KB
wps98.jpg 16KB
wps107.jpg 42KB
wps104.jpg 72KB
wps132.jpg 84KB
wps131.jpg 220KB
wps124.jpg 31KB
wps126.jpg 84KB
wps109.jpg 141KB
wps119.jpg 49KB
LICENSE 1KB
源代码
simdisk.cpp 28KB
init.cpp 6KB
shell.cpp 5KB
init.h 2KB
simdisk.h 2KB
README.md 24KB
可执行程序
text.txt 1KB
simdisk.exe 209KB
shell.exe 171KB
text.dat 100MB
qq.txt 17B
共 63 条
- 1
资源评论
神仙别闹
- 粉丝: 2674
- 资源: 7640
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 三维装箱问题(Three-Dimensional Bin Packing Problem,3D-BPP)是一个经典的组合优化问题
- 以下是一些关于Linux线程同步的基本概念和方法.txt
- 以下是一个简化的示例,它使用pygame库来模拟烟花动画的框架.txt
- Linux线程同步机制深度解析与实用指南.zip
- PTA题库C语言解题策略与实战.rar
- SVPWM控制技术的simulink建模与仿真【包括simulink模型,参考文献,操作步骤】
- AI高清修复图片画质易语言易语言源码易语言填表
- 映射窗口.ec易语言易语言模块CPU占用0%游戏监控窗口监控
- 易语言 361窗口模块高效、便捷、自封装、自用
- 易语言 窗口排列 模块 ,简单、高效、体积小
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功