導航:首頁 > 版本升級 > linux二級文件系統的設計

linux二級文件系統的設計

發布時間:2021-10-24 09:59:13

㈠ 操作系統課程設計——為linux 設計一個簡單的二級文件...

為LINUX 設計一個簡單的二級文件系統。要求做到以下幾點: 1、可以實現下列懸賞分:10? 我靠。這么牛逼

㈡ 為linux系統設計一個簡單的二級文件系統。要求做到以下幾點:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MEM_D_SIZE 1024*1024 //總磁碟空間為1M
#define DISKSIZE 1024 //磁碟塊的大小1K
#define DISK_NUM 1024 //磁碟塊數目1K
#define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小
#define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目錄起始盤塊號
#define ROOT_DISK_SIZE sizeof(struct direct) //根目錄大小
#define DIR_MAXSIZE 1024 //路徑最大長度為1KB
#define MSD 5 //最大子目錄數5
#define MOFN 5 //最大文件深度為5
#define MAX_WRITE 1024*128 //最大寫入文字長度128KB

struct fatitem /* size 8*/
{
int item; /*存放文件下一個磁碟的指針*/
char em_disk; /*磁碟塊是否空閑標志位 0 空閑*/
};

struct direct
{
/*-----文件控制快信息-----*/
struct FCB
{
char name[9]; /*文件/目錄名 8位*/
char property; /*屬性 1位目錄 0位普通文件*/
int size; /*文件/目錄位元組數、盤塊數)*/
int firstdisk; /*文件/目錄 起始盤塊號*/
int next; /*子目錄起始盤塊號*/
int sign; /*1是根目錄 0不是根目錄*/

}directitem[MSD+2];

};

struct opentable
{
struct openttableitem
{
char name[9]; /*文件名*/
int firstdisk; /*起始盤塊號*/
int size; /*文件的大小*/
}openitem[MOFN];
int cur_size; /*當前打文件的數目*/
};

struct fatitem *fat; /*FAT表*/
struct direct *root; /*根目錄*/
struct direct *cur_dir; /*當前目錄*/
struct opentable u_opentable; /*文件打開表*/
int fd=-1; /*文件打開表的序號*/
char *bufferdir; /*記錄當前路徑的名稱*/
char *fdisk; /*虛擬磁碟起始地址*/

void initfile();
void format();
void enter();
void halt();
int create(char *name);
int open(char *name);
int close(char *name);
int write(int fd,char *buf,int len);
int read(int fd,char *buf);
int del(char *name);
int mkdir(char *name);
int rmdir(char *name);
void dir();
int cd(char *name);
void print();
void show();

void initfile()
{
fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申請 1M空間*/
format();

}

void format()
{
int i;
FILE *fp;

fat = (struct fatitem *)(fdisk+DISKSIZE); /*計算FAT表地址,引導區向後偏移 1k)*/
/*-----初始化FAT表------------*/
fat[0].item=-1; /*引導塊*/
fat[0].em_disk='1';

for(i=1;i<ROOT_DISK_NO-1;i++) /*存放 FAT表的磁碟塊號*/
{
fat[i].item=i+1;
fat[i].em_disk='1';
}

fat[ROOT_DISK_NO].item=-1; /*存放根目錄的磁碟塊號*/
fat[ROOT_DISK_NO].em_disk='1';

for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)
{
fat[i].item = -1;
fat[i].em_disk = '0';
}
/*-----------------------------------------------*/
root = (struct direct *)(fdisk+DISKSIZE+FATSIZE); /*根目錄的地址*/
/*初始化目錄*/
/*---------指向當前目錄的目錄項---------*/
root->directitem[0].sign = 1;
root->directitem[0].firstdisk = ROOT_DISK_NO;
strcpy(root->directitem[0].name,".");
root->directitem[0].next = root->directitem[0].firstdisk;
root->directitem[0].property = '1';
root->directitem[0].size = ROOT_DISK_SIZE;
/*-------指向上一級目錄的目錄項---------*/
root->directitem[1].sign = 1;
root->directitem[1].firstdisk = ROOT_DISK_NO;
strcpy(root->directitem[1].name,"..");
root->directitem[1].next = root->directitem[0].firstdisk;
root->directitem[1].property = '1';
root->directitem[1].size = ROOT_DISK_SIZE;
if((fp = fopen("disk.dat","wb"))==NULL)
{
printf("Error:\n Cannot open file \n");
return;
}
for(i=2;i<MSD+2;i++) /*-子目錄初始化為空-*/
{
root->directitem[i].sign = 0;
root->directitem[i].firstdisk = -1;
strcpy(root->directitem[i].name,"");
root->directitem[i].next = -1;
root->directitem[i].property = '0';
root->directitem[i].size = 0;
}

if((fp = fopen("disk.dat","wb"))==NULL)
{
printf("Error:\n Cannot open file \n");
return;
}
if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1) /*把虛擬磁碟空間保存到磁碟文件中*/
{
printf("Error:\n File write error! \n");
}

fclose(fp);

}
void enter()
{
FILE *fp;
int i;

fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申請 1M空間*/
if((fp=fopen("disk.dat","rb"))==NULL)
{
printf("Error:\nCannot open file\n");
return;
}
if(!fread(fdisk,MEM_D_SIZE,1,fp)) /*把磁碟文件disk.dat 讀入虛擬磁碟空間(內存)*/
{
printf("Error:\nCannot read file\n");
exit(0);
}
fat = (struct fatitem *)(fdisk+DISKSIZE); /*找到FAT表地址*/
root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目錄地址*/
fclose(fp);
/*--------------初始化用戶打開表------------------*/
for(i=0;i<MOFN;i++)
{
strcpy(u_opentable.openitem[i].name,"");
u_opentable.openitem[i].firstdisk = -1;
u_opentable.openitem[i].size = 0;
}
u_opentable.cur_size = 0;

cur_dir = root; /*當前目錄為根目錄*/
bufferdir = (char *)malloc(DIR_MAXSIZE*sizeof(char));
strcpy(bufferdir,"Root:");
}

void halt()
{
FILE *fp;
int i;

if((fp=fopen("disk.dat","wb"))==NULL)
{
printf("Error:\nCannot open file\n");
return;
}
if(!fwrite(fdisk,MEM_D_SIZE,1,fp)) /*把虛擬磁碟空間(內存)內容讀入磁碟文件disk.dat */
{
printf("Error:\nFile write error!\n");
}
fclose(fp);

free(fdisk);
free(bufferdir);
return;
}

int create(char *name)
{

int i,j;

if(strlen(name)>8) /*文件名大於 8位*/
return(-1);

for(j=2;j<MSD+2;j++) /*檢查創建文件是否與已存在的文件重名*/
{
if(!strcmp(cur_dir->directitem[j].name,name))
break;
}
if(j<MSD+2) /*文件已經存在*/
return(-4);

for(i=2;i<MSD+2;i++) /*找到第一個空閑子目錄*/
{
if(cur_dir->directitem[i].firstdisk==-1)
break;
}
if(i>=MSD+2) /*無空目錄項*/
return(-2);
if(u_opentable.cur_size>=MOFN) /*打開文件太多*/
return(-3);

for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++) /*找到空閑盤塊 j 後退出*/
{
if(fat[j].em_disk=='0')
break;
}
if(j>=DISK_NUM)
return(-5);
fat[j].em_disk = '1'; /*將空閑塊置為已經分配*/
/*-----------填寫目錄項-----------------*/
strcpy(cur_dir->directitem[i].name,name);
cur_dir->directitem[i].firstdisk = j;
cur_dir->directitem[i].size = 0;
cur_dir->directitem[i].next = j;
cur_dir->directitem[i].property = '0';
/*---------------------------------*/
fd = open(name);
return 0;

}

int open(char *name)
{
int i, j;

for(i=2;i<MSD+2;i++) /*文件是否存在*/
{
if(!strcmp(cur_dir->directitem[i].name,name))
break;
}
if(i>=MSD+2)
return(-1);
/*--------是文件還是目錄-----------------------*/
if(cur_dir->directitem[i].property=='1')
return(-4);

/*--------文件是否打開-----------------------*/
for(j=0;j<MOFN;j++)
{
if(!strcmp(u_opentable.openitem[j].name,name))
break;
}
if(j<MOFN) /*文件已經打開*/
return(-2);

if(u_opentable.cur_size>=MOFN) /*文件打開太多*/
return(-3);

/*--------查找一個空閑用戶打開表項-----------------------*/
for(j=0;j<MOFN;j++)
{
if(u_opentable.openitem[j].firstdisk==-1)
break;
}
/*--------------填寫表項的相關信息------------------------*/
u_opentable.openitem[j].firstdisk = cur_dir->directitem[i].firstdisk;
strcpy(u_opentable.openitem[j].name,name);
u_opentable.openitem[j].size = cur_dir->directitem[i].size;
u_opentable.cur_size++;
/*----------返回用戶打開表表項的序號--------------------------*/
return(j);
}

int close(char *name)
{
int i;

for(i=0;i<MOFN;i++)
{
if(!strcmp(u_opentable.openitem[i].name,name))
break;
}
if(i>=MOFN)
return(-1);
/*-----------清空該文件的用戶打開表項的內容---------------------*/
strcpy(u_opentable.openitem[i].name,"");
u_opentable.openitem[i].firstdisk = -1;
u_opentable.openitem[i].size = 0;
u_opentable.cur_size--;

return 0;
}

int write(int fd, char *buf, int len)
{
char *first;
int item, i, j, k;
int ilen1, ilen2, modlen, temp;
/*----------用 $ 字元作為空格 # 字元作為換行符-----------------------*/
char Space = 32;
char Endter= '\n';

for(i=0;i<len;i++)
{
if(buf[i] == '$')
buf[i] = Space;
else if(buf[i] == '#')
buf[i] = Endter;
}

/*----------讀取用戶打開表對應表項第一個盤塊號-----------------------*/

item = u_opentable.openitem[fd].firstdisk;

/*-------------找到當前目錄所對應表項的序號-------------------------*/
for(i=2;i<MSD+2;i++)
{
if(cur_dir->directitem[i].firstdisk==item)
break;
}
temp = i; /*-存放當前目錄項的下標-*/
/*------找到的item 是該文件的最後一塊磁碟塊-------------------*/
while(fat[item].item!=-1)
{
item =fat[item].item; /*-查找該文件的下一盤塊--*/
}

/*-----計算出該文件的最末地址-------*/
first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE;

/*-----如果最後磁碟塊剩餘的大小大於要寫入的文件的大小-------*/
if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>len)
{
strcpy(first,buf);
u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;
cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;
}
else
{
for(i=0;i<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++)
{/*寫一部分內容到最後一塊磁碟塊的剩餘空間(位元組)*/
first[i] = buf [i];
}
/*-----計算分配完最後一塊磁碟的剩餘空間(位元組) 還剩下多少位元組未存儲-------*/
ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);
ilen2 = ilen1/DISKSIZE;
modlen = ilen1%DISKSIZE;
if(modlen>0)
ilen2 = ilen2+1; /*--還需要多少塊磁碟塊-*/

for(j=0;j<ilen2;j++)
{
for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)/*尋找空閑磁碟塊*/
{
if(fat[i].em_disk=='0')
break;
}
if(i>=DISK_NUM) /*--如果磁碟塊已經分配完了-*/
return(-1);
first = fdisk+i*DISKSIZE; /*--找到的那塊空閑磁碟塊的起始地址-*/
if(j==ilen2-1) /*--如果是最後要分配的一塊-*/
{
for(k=0;k<len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE)-j*DISKSIZE;k++)
first[k] = buf[k];
}
else/*-如果不是要最後分配的一塊--*/
{
for(k=0;k<DISKSIZE;k++)
first[k] =buf[k];
}

fat[item].item = i; /*--找到一塊後將它的序號存放在上一塊的指針中-*/
fat[i].em_disk = '1'; /*--置找到的磁碟快的空閑標志位為已分配-*/
fat[i].item = -1; /*--它的指針為 -1 (即沒有下一塊)-*/
}
/*--修改長度-*/
u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;
cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;
}
return 0;
}

int read(int fd, char *buf)
{
int len = u_opentable.openitem[fd].size;
char *first;
int i, j, item;
int ilen1, modlen;

item = u_opentable.openitem[fd].firstdisk;

ilen1 = len/DISKSIZE;
modlen = len%DISKSIZE;
if(modlen!=0)
ilen1 = ilen1+1; /*--計算文件所佔磁碟的塊數-*/

first = fdisk+item*DISKSIZE; /*--計算文件的起始位置-*/

for(i=0;i<ilen1;i++)
{
if(i==ilen1-1) /*--如果在最後一個磁碟塊-*/
{
for(j=0;j<len-i*DISKSIZE;j++)
buf[i*DISKSIZE+j] = first[j];
}
else /*--不在最後一塊磁碟塊-*/
{
for(j=0;j<len-i*DISKSIZE;j++)
buf[i*DISKSIZE+j] = first[j];
item = fat[item].item; /*-查找下一盤塊-*/
first = fdisk+item*DISKSIZE;
}
}
return 0;
}

int del(char *name)
{
int i,cur_item,item,temp;

for(i=2;i<MSD+2;i++) /*--查找要刪除文件是否在當前目錄中-*/
{
if(!strcmp(cur_dir->directitem[i].name,name))
break;
}

㈢ 操作系統課程設計——為LINUX 設計一個簡單的二級文件系統

懸賞分:10?

㈣ 如何製作 linux 文件系統

一種比較懶的方法是找syslinux:然後打開命令行進入該目錄的win32目錄(如果你製作鏡像的系統是win系統,linux下則是用終端進入linux文件夾)然後輸入 syslinux -f -a N:,成功後會在相應磁碟內建立一個隱藏文件,你將文件到要製作的鏡像文件夾,把isolinux文件夾改為syslinux,把裡面的isolinux.cfg改為syslinux.cfg。之後將這些內容如數寫入光碟就可以了。

㈤ 操作系統linux 二級文件系統具體是怎麼實現的

說通抄俗一點就類似於數組加上鏈表的結構,i_addr[8]數組中每一個元素都指向了一個磁碟塊,如果那個磁碟塊中也存放了一個i_addr[8]數組,並且那個數組中的每個元素也指向了一個磁碟塊,那麼這就是二級的索引文件結構了~
建議看一下操作系統原理(龐麗萍)一書中的文件系統一章
這個東西是Unix V的一種典型的文件系統~呵呵~

㈥ 大神們急求啊:為linux系統設計一個簡單的二級文件系統,實現一個文件管理的命令行操作界面,包含以下內容

參考cnblogs.com/leestar/archive/2012/03/18/2810632.html

㈦ 為LINUX 設計一個簡單的二級文件系統

哦 這是一個標準的課程設計題目.. 我都忘記了

能搜到很多付費下載的這個源碼 ,自己去看看吧

㈧ 求操作系統 Linux二級文件系統課程設計設計 代碼,天津科大的最好!!

可以依靠網路Hi提醒我們
有機會可以解決你的問題
具體的要求也可以提醒我們

ES:\\
交易提醒:預付定金是陷阱

㈨ 為Linux系統設計一個簡單的二級文件系統

不會啊

閱讀全文

與linux二級文件系統的設計相關的資料

熱點內容
手機釘釘下載下來的文件在哪裡找 瀏覽:545
男主是女主的三叔 瀏覽:514
經濟師萬題庫大數據 瀏覽:996
獲取appsetting 瀏覽:920
蘋果7plus哪個顏色保值 瀏覽:869
蜜桃風月 瀏覽:533
1個電影多少流量 瀏覽:971
日本瑜伽電影 瀏覽:463
有一部電影講一個男的做鴨 瀏覽:247
看視頻的網址推薦 懂的 瀏覽:411
南昌大數據培訓 瀏覽:603
每天自動1的代碼 瀏覽:375
因為存在系統錯誤代碼193 瀏覽:56
ip網路適配器是什麼 瀏覽:61
印尼愛情電影 瀏覽:794
求一個網站帶小說的那種 瀏覽:56
pdf文件如何不能復制 瀏覽:612
都市連媽媽都收的小說 瀏覽:300
java第一步pdf 瀏覽:984
javahourofday 瀏覽:158

友情鏈接