forked from elliotxx/os_filesystem
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathMFS.h
202 lines (173 loc) · 7.46 KB
/
MFS.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#pragma once
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <time.h>
#if defined(WIN32) || defined(_WIN32) || defined(_WIN64)
#include <conio.h>
#include <windows.h>
#else
#include <unistd.h>
#endif
//宏定义
#define FILESYSNAME "MFS.sys" // 虚拟磁盘文件名
#define MFS_NAME "MFS(Meng-File-System)" // 文件系统名
#define MFS_VERSION "1.0" // 版本
#define MFS_BUFFER 100000 // 100K,虚拟磁盘buffer
#define FILE_BUFFER 10000 // 10K, 文件buffer
#define BLOCK_SIZE 512 //块号大小为512B
#define INODE_SIZE 128 //inode节点大小为128B。注:sizeof(Inode)不能超过该值
#define MAX_NAME_SIZE 28 //最大名字长度,长度要小于这个大小
#define INODE_NUM 640 //inode节点数,最多64个文件
#define BLOCK_NUM 10240 //块号数,10240 * 512B = 5120KB
#define BLOCKS_PER_GROUP 64 //空闲块堆栈大小,一个空闲堆栈最多能存多少个磁盘块地址
#define MODE_DIR 01000 //目录标识
#define MODE_FILE 00000 //文件标识
#define OWNER_R 4<<6 //本用户读权限
#define OWNER_W 2<<6 //本用户写权限
#define OWNER_X 1<<6 //本用户执行权限
#define GROUP_R 4<<3 //组用户读权限
#define GROUP_W 2<<3 //组用户写权限
#define GROUP_X 1<<3 //组用户执行权限
#define OTHERS_R 4 //其它用户读权限
#define OTHERS_W 2 //其它用户写权限
#define OTHERS_X 1 //其它用户执行权限
#define FILE_DEF_PERMISSION 0664 //文件默认权限
#define DIR_DEF_PERMISSION 0755 //目录默认权限
// 数据结构声明
//超级块
struct SuperBlock {
unsigned short s_INODE_NUM; //inode节点数,最多 65535
unsigned int s_BLOCK_NUM; //磁盘块块数,最多 4294967294
unsigned short s_free_INODE_NUM; //空闲inode节点数
unsigned int s_free_BLOCK_NUM; //空闲磁盘块数
int s_free_addr; //空闲块堆栈指针
int s_free[BLOCKS_PER_GROUP]; //空闲块堆栈
unsigned short s_BLOCK_SIZE; //磁盘块大小
unsigned short s_INODE_SIZE; //inode大小
unsigned short s_SUPERBLOCK_SIZE; //超级块大小
unsigned short s_blocks_per_group; //每 blockgroup 的block数量
//磁盘分布
int s_Superblock_StartAddr; //超级块起始地址
int s_InodeBitmap_StartAddr; //inode位图起始地址
int s_BlockBitmap_StartAddr; //块位图起始地址
int s_Inode_StartAddr; //inode起始地址
int s_Block_StartAddr; //块起始地址
};
//inode节点
struct Inode {
unsigned short i_ino; //inode标识(编号)
unsigned short i_mode; //存取权限。r--读取,w--写,x--执行
unsigned short i_cnt; //链接数。有多少文件名指向这个inode
//unsigned short i_uid; //文件所属用户id
//unsigned short i_gid; //文件所属用户组id
char i_uname[20]; //文件所属用户
char i_gname[20]; //文件所属用户组
unsigned int i_size; //文件大小,单位为字节(B)
time_t i_ctime; //inode上一次变动的时间
time_t i_mtime; //文件内容上一次变动的时间
time_t i_atime; //文件上一次打开的时间
int i_dirBlock[10]; //10个直接块。10*512B = 5120B = 5KB
int i_indirBlock_1; //一级间接块。512B/4 * 512B = 128 * 512B = 64KB
//unsigned int i_indirBlock_2; //二级间接块。(512B/4)*(512B/4) * 512B = 128*128*512B = 8192KB = 8MB
//unsigned int i_indirBlock_3; //三级间接块。(512B/4)*(512B/4)*(512B/4) * 512B = 128*128*128*512B = 1048576KB = 1024MB = 1G
//文件系统太小,暂且省略二级、三级间接块
};
//目录项
struct DirItem { //32字节,一个磁盘块能存 512/32=16 个目录项
char itemName[MAX_NAME_SIZE]; //目录或者文件名
int inodeAddr; //目录项对应的inode节点地址
};
//全局变量定义
extern const int Superblock_StartAddr; //超级块 偏移地址,占一个磁盘块
extern const int InodeBitmap_StartAddr; //inode位图 偏移地址,占两个磁盘块,最多监控 1024 个inode的状态
extern const int BlockBitmap_StartAddr; //block位图 偏移地址,占二十个磁盘块,最多监控 10240 个磁盘块(5120KB)的状态
extern const int Inode_StartAddr; //inode节点区 偏移地址,占 INODE_NUM/(BLOCK_SIZE/INODE_SIZE) 个磁盘块
extern const int Block_StartAddr; //block数据区 偏移地址 ,占 INODE_NUM 个磁盘块
extern const int File_Max_Size; //单个文件最大大小
extern const int Sum_Size; //虚拟磁盘文件大小
// 用户
extern bool isLogin; //是否有用户登陆
extern int nextUID; //下一个要分配的用户标识号
extern int nextGID; //下一个要分配的用户组标识号
extern int Root_Dir_Addr; //根目录inode地址
extern int Cur_Dir_Addr; //当前目录
extern char Cur_Dir_Name[310]; //当前目录名
extern char Cur_Host_Name[110]; //当前主机名
extern char Cur_User_Name[110]; //当前登陆用户名
extern char Cur_Group_Name[110]; //当前登陆用户组名
extern char Cur_User_Dir_Name[310]; //当前登陆用户目录名
extern FILE* fw; //虚拟磁盘文件 写文件指针
extern FILE* fr; //虚拟磁盘文件 读文件指针
extern SuperBlock *superblock; //超级块指针
extern bool inode_bitmap[INODE_NUM]; //inode位图
extern bool block_bitmap[BLOCK_NUM]; //磁盘块位图
extern char buffer[MFS_BUFFER]; //10M,缓存整个虚拟磁盘文件
// 函数声明
// 文件系统、内存分配、初始化
void InitSystem(); //初始化系统
void InitUser(); //初始化用户
bool Format(); //格式化一个虚拟磁盘文件
bool Install(); //安装文件系统,将虚拟磁盘文件中的关键信息如超级块读入到内存
void Ready(); //登录系统前的准备工作,注册+安装
int BockAlloc(); //磁盘块分配函数
bool BlockFree(int); //磁盘块释放函数
int InodeAlloc(); //分配i节点区函数
bool InodeFree(int); //释放i结点区函数
// 命令
bool Login(char[]); //登陆界面
void Logout(); //用户注销
bool Useradd(char username[]); //用户注册
bool Userdel(char username[]); //用户删除
void Chmod(int parinoAddr, char name[], int pmode); //修改文件或目录权限
void Touch(int parinoAddr, char name[], char buf[]); //touch命令创建文件,读入字符
bool Mkdir(int parinoAddr, char name[]); //目录创建函数。参数:上一层目录文件inode地址 ,要创建的目录名
bool Rmdir(int parinoAddr, char name[]); //目录删除函数
bool Rm(int parinoAddr, char name[]); //删除文件函数
void Ls(int parinoaddr); //显示当前目录下的所有文件和文件夹
void Cd(int parinoaddr, char name[]); //进入当前目录下的name目录
void Vi(int parinoaddr, char name[], char buf[]); //模拟一个简单vi,输入文本
void Clear(); //清屏
void Pwd(); //输出当前路径
void Cat(int parinoAddr, char name[]); //输出文件内容到终端
void PrintSuperBlock(); //打印超级块信息
void PrintInodeBitmap(); //打印inode使用情况
void PrintBlockBitmap(int num = superblock->s_BLOCK_NUM); //打印block使用情况
// 命令实现的额外函数
void InputUsername(char username[]); //输入用户名
void inputPassword(char passwd[]); //输入密码
void Gotoxy(HANDLE hOut, int x, int y); //移动光标到指定位置
void WriteFile(Inode fileInode, int fileInodeAddr, char buf[]); //将buf内容写回文件的磁盘块
bool Check(char username[], char passwd[]); //核对用户名,密码
void GotoRoot(); //回到根目录
void Rmall(int parinoAddr); //删除该节点下所有文件或目录
bool Create(int parinoAddr, char name[], char buf[]); //创建文件函数
// 命令行
void Cmd(char str[]); //处理输入的命令
// 命令帮助、系统信息
void Help(); //显示所有命令清单
void Help_NotLogin(); //未登录的帮助
void Version(); //版本
void CommandError(char command[]); //命令错误提示
void Command_help();
void Help_help();
void Version_help();
void Useradd_help();
void Userdel_help();
void Login_help();
void Logout_help();
void Pwd_help();
void Mkdir_help();
void Rmdir_help();
void Cd_help();
void Ls_help();
void Chmod_help();
void Clear_help();
void Exit_help();
void Cat_help();
void Touch_help();
void Rm_help();
void Vi_help();
void Super_help();
void Inode_help();
void Block_help();