本周进行操作系统课程设计,在很多的题目中选了个unix文件系统模拟,主要就是操作结构与文件。
为了方便,文件系统结构如下:
Super block -- Block bitmap -- Inode bitmap -- Inode table -- Block zone
其中:
Super block: 存储基本信息
Block bitmap:块分配情况
Inode bitmap:索引节点分配情况
Inode table: Indoe 节点存放区
Block zone:存放数据区
效果如下:
总的说来,做的还是挺简单的,只是实现了基本的功能.而块的分配没有怎么完成,linux系统中一般是通过多级索引的方式为inode分配块.
刚开始我的想法是:inode的块(512B)只写510B,留下2B用于记录下一块的块号,我觉得应该可行,但觉得繁,就没有写下去.所以就没有多余的
块分配操作.知识INode对应一个Block....,太懒了.还有一个缺点,文件指针移动太频繁了,而且都是绝对定位移动(好算,呵呵)
代码如下:
/*核心思想:一切皆是文件
如果是目录:Block中存储的是目录下文件和目录的fcb
如果是文件:Block中存储的是文件的内容
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <signal.h>
#define BLOCKSIZE 512
#define BLOCKNUM 512
#define INODENUM 30
#define FILENAME "file.dat"
typedef struct{
unsigned short blockSize;
unsigned short blockNum;
unsigned short inodeNum;
unsigned short blockFree;
unsigned short inodeFree;
}SuperBlock;
typedef struct{
unsigned short inum;
char fileName[10];
unsigned short isDir; // 0-file 1-dir
unsigned short iparent;
unsigned short length; //if file->filesize if dir->filenum
unsigned short blockNum;
}Inode,*PtrInode;
//Fcb用于存储文件与 目录信息,主要用途:将一个目录下的所有文件(包括目录)写入到该目录对应的Block中
typedef struct {
unsigned short inum;
char fileName[10];
unsigned short isDir;
}Fcb,*PtrFcb;
typedef struct{
char userName[10];
char passWord[10];
}User;
char blockBitmap[BLOCKNUM];
char inodeBitmap[INODENUM];
SuperBlock superBlock;
User curUser=(User){"root","root"};
unsigned short currentDir; //current inodenum
FILE *fp;
const unsigned short superBlockSize=sizeof(superBlock);
const unsigned short blockBitmapSize=sizeof(blockBitmap);
const unsigned short inodeBitmapSize=sizeof(inodeBitmap);
const unsigned short inodeSize=sizeof(Inode);
const unsigned short fcbSize=sizeof(Fcb);
char *argv[5];
int argc;
void createFileSystem()
/*创建*/
{
long len;
PtrInode fileInode;
if ((fp=fopen(FILENAME,"wb+"))==NULL)
{
printf("open file %s error...\n",FILENAME);
exit(1);
}
//init bitmap
for(len=0;len<BLOCKNUM;len++)
blockBitmap[len]=0;
for(len=0;len<INODENUM;len++)
inodeBitmap[len]=0;
//memset
for (len=0;len<(superBlockSize+blockBitmapSize+inodeBitmapSize+inodeSize*INODENUM+BLOCKSIZE*BLOCKNUM);len++)
{
fputc(0,fp);
}
rewind(fp);
//init superBlock
superBlock.blockNum=BLOCKNUM;
superBlock.blockSize=BLOCKSIZE;
superBlock.inodeNum=INODENUM;
superBlock.blockFree=BLOCKNUM-1;
superBlock.inodeFree=INODENUM-1;
fwrite(&superBlock,superBlockSize,1,fp);
//create root
fileInode=(PtrInode)malloc(inodeSize);
fileInode->inum=0;
strcpy(fileInode->fileName,"/");
fileInode->isDir=1;
fileInode->iparent=0;
fileInode->length=0;
fileInode->blockNum