操作系统-文件系统源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#include
#define BLOCKSIZE 1024
#define SIZE 1024000
#define END 65535
#define FREE 0
#define ROOTBLOCKNUM 2
#define MAXOPENFILE 10
typedef struct FCB//unsigned
{
char filename[8];
char exname[3];
unsigned char attribute;
char reserve[10];//me:保留区(图3-2 MS-DOS的文件控制块)
unsigned short time;
unsigned short data;
unsigned short first;
unsigned long length;
}fcb;
typedef struct FAT
{
unsigned short id;
}fat;
typedef struct USEROPEN
{
fcb openfile[MAXOPENFILE];
char dir[MAXOPENFILE][80];//me:用来记录每个打开文件所在的目录名,以方便用户打开不同目录下具有相同文件名的不同文件。
//me:即,相应打开文件所在的目录名,这样方便快速检查出指定文件是否已经打开
int count;
}useropen;
typedef struct BLOCK0 /*引导块内容*/
{
char information[200];//赋值50时本身已经越界
unsigned char *startblock;//me:虚拟磁盘上数据区开始位置
}block0;
unsigned char *myvhard;
useropen *openfilelist;
char currentdir[80];//me: 记录当前目录的目录名(包括目录的路径)unsigned char* startp;//me:记录虚拟磁盘上数据区开始位置
void initsys();
void format();
void startsys();
void exitsys();
void create();
int open(char *filename);
void close(int fd);
void mywrite(int fd,char *buff);
void myread(int fd,char *buff);
void deletefile(char *filename);
void ls();
void listopenfile();
void cd(char *dirname);
//系统初始化:创建虚盘和格式化虚盘
void initsys()
{
myvhard=(unsigned char *)malloc(SIZE);
memset(myvhard,0,SIZE);
format();
}
void format()
{
FILE *fp;
time_t *now;
struct tm *nowtime;
unsigned char *p;
fat *fat1,*fat2;
fcb *root;
int i,a;
block0 *b0;
now=(time_t *)malloc(sizeof(time_t));
p=myvhard;
b0=(block0 *)p;
strcpy(b0->information,"My filesystem,version0.01,blocksize is 1K,whole size is 1000K,emulate FAT16,Max open file number is 10");
//printf("\n %s",b0->information);
p+=BLOCKSIZE;//me:将虚拟磁盘的第一块分配给了引导块
//me:给两个FAT各分配两个盘块
fat1=(fat *)(p);
fat2=(fat *)(p+BLOCKSIZE*2);
//me:对于每个FAT中,前面5个块设置为已分配,后面995个块设置为空闲;
//me:即,将两个fat表的前5个表项的id赋值END,第6项为的id赋值6(指向虚拟磁盘的第6块(即根目录文件所在块))
fat1->id=END;
fat2->id=END;
fat1++;
fat2++;
fat1->id=END;
fat2->id=END;
fat1++;
fat2++;
fat1->id=END;
fat2->id=END;
fat1++;
fat2++;
fat1->id=END;
fat2->id=END;
fat1++;
fat2++;
fat1->id=END;
fat2->id=END;
fat1++;
fat2++;
fat1->id=6;
fat2->id=6;
fat1++;
fat2++;
fat1->id=END;
fat2->id=END;
fat1++;
fat2++;
//me:从第7个表项开始,初始化全部是空闲的
for(i=7;i { (*fat1).id=FREE; (*fat2).id=FREE; fat1++; fat2++;