# 仿 Linux Ext2 的用户级文件系统
## 目录
[TOC]
## 1. 课设要求
实现一个用户级文件系统。
- 以一个大文件作为虚拟磁盘,将其作为块设备进行读写;
- 通过 format 操作,将虚拟磁盘格式化成 Ext2 的文件卷格式;
- 实现系统调用
creat
open
read
write
lseek(seek)
close
mkdir
及其它
- 能够将文件写入虚拟磁盘,并可完好无损地取出
## 2. 完成情况
- [X] 将一个大文件作为虚拟磁盘,当作块设备使用
- [X] format 该虚拟磁盘使之成为 Ext2 磁盘卷的结构
- [X] 使用磁盘缓存、superBlock 缓存和 inode 缓存加快访问速度
- [X] 将外部文件写入虚拟磁盘,并完好取出
- [X] 使用仿 Linux 的命令行对虚拟磁盘做文件操作
**实现的系统调用功能:**
- [X] creat
- [X] open
- [X] read
- [X] write
- [X] lseek(seek)
- [X] close
- [X] eof
**实现的用户命令功能:**
支持的用户指令有:
- [X] 【mount】
功能:挂载磁盘
用法:mount
说明:任何一次程序执行,必须先执行 mount!!!
- [X] 【unmount】
功能:卸载磁盘
用法:unmount
说明:退出程序时可以手动执行,也可以由 exit 指令自动 unmount
- [X] 【format】
功能:格式化磁盘
用法:format
说明:一块虚拟磁盘 disk.img 使用前必须执行一次.(中途格式化可以将磁盘还原)
- [X] 【mkdir】
功能:创建目录
用法:mkdir dirname
说明:目前仅支持在当前目录创建子目录,若有重名创建失败
- [X] 【touch】
功能:创建新文件
用法:touch filename
说明:目前仅支持在当前目录创建新文件,若有重名创建失败
- [X] 【rm】
功能:删除文件
用法:rm filename
说明:目前仅支持删除当前目录下的文件,注意要删除目录请使用 rmdir
- [X] 【rmdir】
功能:删除目录,递归删除该目录下的所有子目录、文件
用法:rmdir dirname
说明:删除文件请使用 rmdir
- [X] 【help】
功能:显示帮助信息
用法:help
- [X] 【version】
功能:显示作品信息
用法:version
- [X] 【man】
功能:显示命令使用说明(man 暂未支持)
用法:man
- [X] 【exit】
功能:退出程序
用法:exit
说明:会自动卸载磁盘
- [X] 【ls】
功能:显示目录下的所有文件
用法:ls path
说明:path 必须是目录的路径,支持相对地址和绝对地址
- [X] 【cd】
功能:改变当前工作目录
用法:cd path
说明:path 必须是目录的路径,支持相对地址和绝对地址
- [X] 【clear】
功能:清空命令行显示区
用法:clear
- [X] 【store】
功能:高级功能,将外部文件存入虚拟磁盘
用法:store 外部文件路径 内部文件名
说明:仅支持存放到当前目录下,外部文件大小不可超过虚拟磁盘大小
- [X] 【withdraw】
功能:将虚拟磁盘中的文件提取到外部
用法:store 内部文件名 外部文件路径
说明:仅支持提取当前目录下的文件
## 3. 系统设计
### 3.1. 整体设计
![](https://www.writebug.com/myres/static/uploads/2021/11/20/751fb5a837d0dd6ef01c01e5f4dd5ea6.writebug)
用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开、读取、写和关闭)提供用户接口。系统调用接口的作用就像是交换器,它将系统调用从用户空间发送到内核空间中的适当端点。
VFS 是底层文件系统的主要接口。这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可能差异很大。有两个针对文件系统对象的缓存(inode 和 dentry)。它们缓存最近使用过的文件系统对象。
每个文件系统实现(比如 ext2、JFS 等等)导出一组通用接口,供 VFS 使用。缓冲区缓存会缓存文件系统和相关块设备之间的请求。例如,对底层设备驱动程序的读写请求会通过缓冲区缓存来传递。这就允许在其中缓存请求,减少访问物理设备的次数,加快访问速度。以最近使用(LRU)列表的形式管理缓冲区缓存。注意,可以使用 sync 命令将缓冲区缓存中的请求发送到存储媒体(迫使所有未写的数据发送到设备驱动程序,进而发送到存储设备)。
这就是 VFS 和文件系统组件的高层情况。
Linux 以一组通用对象的角度看待所有文件系统。这些对象是超级块(superblock)、inode、dentry 和文件。超级块在每个文件系统的根上,超级块描述和维护文件系统的状态。文件系统中管理的每个对象(文件或目录)在 Linux 中表示为一个 inode。inode 包含管理文件系统中的对象所需的所有元数据(包括可以在对象上执行的操作)。另一组结构称为 dentry,它们用来实现名称和 inode 之间的映射,有一个目录缓存用来保存最近使用的 dentry。dentry 还维护目录和文件之间的关系,从而支持在文件系统中移动。最后,VFS 文件表示一个打开的文件(保存打开的文件的状态,比如写偏移量等等)。
### 3.2. 实现文件系统的大致步骤
文件系统主要负责管理磁盘上的空间,磁盘上至少要包含三部分数据: superblock,inodes 和数据块。
(1) 首先得有一个创建文件系统的工具(如 ext2 文件系统的 mke2fs),用来将磁盘分区格式化成想要的格式,主要是初始化 superblock 和 root inode。
(2) 写一个内核模块,在里面注册自己的文件系统,并且初始化 mount 函数
(3) 当用户在应用层调用 mount 命令时,VFS 就会根据指定的文件系统类型找到我们写的内核模块,并且调用里面的 mount 函数
(4) 在 mount 函数里面读取磁盘上的 superblock 和 root inode
(5) 初始化 root inode 的 inode_operations 和 file_operations,然后返回给 VFS
(6) 这样 VFS 就能根据 root inode 里提供的函数一级一级的往下找到 path 对应文件的 inode
(7) 读取 inode 所指向的数据块(一个或者多个),根据文件的类型,解析数据块的内容。如果文件类型是普通文件,那么数据块里面就是文件的内容;如果文件类型是目录,那么数据块里面存储的就是目录下面所有子目录和文件的名称及它们对应的 inode 号;如果文件类型是软链接,那么数据块里面存储的就是链接到的文件路径。
总的来说,实现文件系统就是怎么在磁盘上组织文件,然后实现 VFS 所要求的 superblock,inode 以及 inode_operations 和 file_operations。
## 4. 工程实现
### 4.1. 工程结构
![](https://www.writebug.com/myres/static/uploads/2021/11/20/78a0cdfb9fb9d70fdf4089496b8efc10.writebug)
### 4.2. 关键数据结构
#### 4.2.1. Shell
```CPP
class Shell
{
//处理用户输入,解析指令,调用相关的内核函数
private:
char tty_buffer[TTY_BUFFER_SIZE];
char split_cmd[MAX_PARAM_NUM][MAX_SINGLE_PARAM_LEN]{};
int param_num = 0;
char const *TAG;
VFS *bounded_VFS;
public:
Shell();
~Shell();
int readUserInput();
void parseCmd();
INSTRUCT getInstType();
char *getInstStr();
char *getParam(int i);
int getParamAmount();
void setVFS(VFS *vfs);
//shell调用的功能
//显式调用
void mount(); //挂载磁盘
void unmount(); //卸载磁盘
void format();
void mkdir();
void cat();
void touch();
void rm();
void rmdir();
void help();
void version();
void man();
void mexit();
void ls();
void cd();
void store();
void withdraw();
void clear();
};
```
#### 4.2.2. VFS
```CPP
class VFS
{
private:
bool Mounted = false;
Ext2 *p_ext2; //绑定的E
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源包含文件:课程word+项目源码 仿Linux Ext2的用户级文件系统(以一个大文件做虚拟磁盘),同时融合了Unix v6文件系统的一些特点。通过format操作,将虚拟磁盘格式化成Ext2的文件卷格式;实现系统调用;能够将文件写入虚拟磁盘,并可完好无损地取出。 实现一个用户级文件系统。 以一个大文件作为虚拟磁盘,将其作为块设备进行读写; 通过 format 操作,将虚拟磁盘格式化成 Ext2 的文件卷格式; 实现系统调用 creat open read write lseek(seek) close mkdir 及其它 能够将文件写入虚拟磁盘,并可完好无损地取出。 详细介绍参考:https://biyezuopin.blog.csdn.net/article/details/125644551
资源推荐
资源详情
资源评论
收起资源包目录
C++仿Linux Ext2的用户级文件系统(以一个大文件做虚拟磁盘).zip (93个子文件)
.VSCodeCounter
results.csv 3KB
results.md 8KB
results.txt 8KB
VFS
InodeCache.cpp 3KB
File.cpp 2KB
DirectoryEntry.cpp 279B
DirectoryCache.cpp 305B
Inode.cpp 8KB
VFS.cpp 18KB
OpenFileTable.cpp 2KB
SuperBlockCache.cpp 2KB
BufferCache
Buf.cpp 88B
BufferLruList.cpp 0B
BufferCache.cpp 6KB
工程笔记.md 7KB
Shell
Shell.cpp 11KB
Ext2
Path.cpp 1KB
Ext2.cpp 12KB
SuperBlock.cpp 1KB
DiskInode.cpp 1KB
InodePool.cpp 1KB
user_fs 667KB
assets
1560675005453.png 34KB
1560675097218.png 21KB
1560675203057.png 29KB
1560677538680.png 51KB
1560675197574.png 15KB
1560675322524.png 15KB
1560677995988.png 22KB
1560675181378.png 21KB
1560676711149.png 22KB
1560675135881.png 19KB
1560677942232.png 23KB
1560677025057.png 34KB
1560675221940.png 30KB
1560675354720.png 15KB
1560673201368.png 113KB
1560676800449.png 38KB
1560675187745.png 16KB
1560677025057-1560855938036.png 34KB
1560675031974.png 106KB
1560675106743.png 21KB
1560675061987.png 21KB
1560675084552.png 14KB
1560678384822.png 24KB
1560674995895.png 113KB
1560674852727.png 189KB
include
VFS.h 2KB
Ext2.h 1KB
TimeHelper.h 153B
Kernel.h 732B
InodeCache.h 961B
User.h 1KB
Inode.h 3KB
Shell.h 1KB
Logcat.h 322B
Buf.h 2KB
SuperBlock.h 1KB
DiskInode.h 860B
Path.h 586B
OpenFileTable.h 1KB
DiskDriver.h 991B
InodePool.h 807B
Bitmap.h 657B
SuperBlockCache.h 1KB
BufferLruList.h 136B
define.h 3KB
DirectoryCache.h 525B
File.h 2KB
BufferCache.h 1KB
DiskBlock.h 214B
VirtualProcess.h 1KB
DirectoryEntry.h 495B
LICENSE 34KB
help 2KB
课程报告.docx 1.09MB
makefile 3KB
DiskDriver
DiskDriver.cpp 3KB
DiskBlock.cpp 33B
main.cpp 388B
.gitignore 451B
VirtualProcess
User.cpp 29B
Kernel.cpp 831B
VirtualProcess.cpp 848B
README.md 27KB
version 221B
.vscode
launch.json 1KB
settings.json 53B
tasks.json 126B
c_cpp_properties.json 410B
Utils
TimeHelper.cpp 154B
Bitmap.cpp 5KB
Logcat.cpp 440B
共 93 条
- 1
资源评论
- 云鸟旧。2024-04-26资源很赞,希望多一些这类资源。
- lixiuming3142023-04-20这个资源总结的也太全面了吧,内容详实,对我帮助很大。
- c_s_d_n_d_s_c2023-02-24发现一个宝藏资源,赶紧冲冲冲!支持大佬~
shejizuopin
- 粉丝: 9594
- 资源: 1288
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
- 林周瑜-论文.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功