操作系統(tǒng)課程設計報告--虛擬文件系統(tǒng)的實現(xiàn)_第1頁
已閱讀1頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  計算機操作系統(tǒng)課程設計</p><p>  題 目 虛擬文件系統(tǒng)的實現(xiàn)</p><p>  計算機科學學院 計算機科學與技術 專業(yè)</p><p>  10 級 計算科學與技術本科 班</p><p><b>  目錄</b></p><p>  第一章 課程設計簡介

2、1</p><p>  1.1 課程設計的目的1</p><p>  1.2 課程設計內(nèi)容1</p><p>  第二章 數(shù)據(jù)結構的設計2</p><p><b>  2.1 預定義2</b></p><p><b>  2.2 結構體2</b></p>

3、;<p>  2.3 全局變量和函數(shù)4</p><p>  2.4結構體說明5</p><p>  第三章 功能模塊(或算法)描述5</p><p>  3.1 format 格式化5</p><p>  3.2 install 安裝6</p><p>  3.3 login 登陸6<

4、;/p><p>  3.4 ialloc 申請inode空間6</p><p>  3.5 balloc 申請block空間6</p><p>  3.6 create 創(chuàng)建文本文件7</p><p>  3.7 cdir 創(chuàng)建文件夾7</p><p>  3.8 edit –讀取和追加文本文件7</p&g

5、t;<p>  3.9 access(文件名) 權限判斷7</p><p>  3.10 cd –進入子目錄 或上級目錄8</p><p>  3.11 attr(文件名)查看文件或者文件夾的屬性8</p><p>  3.12 del 刪除文件或目錄8</p><p>  第四章 程序運行結果8</p>

6、<p>  4.1格式化 和登錄界面8</p><p>  4.2 ls命令---顯示當前目錄下的文件和目錄9</p><p>  4.3 logout命令---注銷用戶9</p><p>  第五章 心得體會9</p><p><b>  參考文獻10</b></p><

7、;p><b>  附:源代碼11</b></p><p>  第一章 課程設計簡介</p><p>  1.1 課程設計的目的</p><p>  課程設計目的使學生熟悉文件管理系統(tǒng)的設計方法;加深對所學各種文件操作的了解及其操作方法的特點。通過模擬文件系統(tǒng)的實現(xiàn),深入理解操作系統(tǒng)中文件系統(tǒng)的理論知識, 加深對教材中的重要算法的理解。

8、同時通過編程實現(xiàn)這些算法,更好地掌握操作系統(tǒng)的原理及實現(xiàn)方法,提高綜合運用各專業(yè)課知識的能力。</p><p>  1.2 課程設計內(nèi)容</p><p>  課程設計內(nèi)容設計一個簡單的多用戶文件系統(tǒng)。即:</p><p> ?、僭谙到y(tǒng)中用一個文件來模擬一個磁盤;</p><p> ?、诖讼到y(tǒng)至少有:login、create、del、ls、cd

9、、md、rd、write、rename、attr、relogin、close等和部分文件屬性的功能。</p><p> ?、蹖崿F(xiàn)這個文件系統(tǒng)。</p><p> ?、苣軐嶋H演示這個文件系統(tǒng)?;旧鲜沁M入一個界面(此界面就是該文件系統(tǒng)的界面)后,可以實現(xiàn)設計的操作要求。</p><p>  1)設計一個10個用戶的文件系統(tǒng),每次用戶可保存10個文件,一次運行用戶可以打

10、開5個文件。</p><p>  2)程序采用二級文件目錄(即設置主目錄MFD)和用戶文件目錄(UFD)。另外,為打開文件設置了運行文件目錄(AFD)。</p><p>  3)為了便于實現(xiàn),對文件的讀寫作了簡化,在執(zhí)行讀寫命令時,只需改讀寫指針,并不進行實際的讀寫操作。</p><p>  4)因系統(tǒng)樣,文件目錄的檢索使用了簡單的線性搜索。</p>

11、<p>  5)文件保護簡單使用了三位保護碼:允許讀寫執(zhí)行、對應位為1,對應位為0,則表示不允許讀寫、執(zhí)行。</p><p>  6)程序中使用的主要設計結構如下:主文件目錄和用戶文件目錄(MFD、UFD),打開文件目錄(AFD)即運行文件目錄,如圖5.1所示。 </p><p>  第二章 數(shù)據(jù)結構的設計</p><p><b>  2.1

12、預定義</b></p><p>  #define BLOCKSIZ 512//磁盤塊的大樣</p><p>  #define DATABLKNUM 512//數(shù)據(jù)塊的數(shù)目</p><p>  #define BLKGRUPNUM50//數(shù)據(jù)塊組包含多少數(shù)據(jù)塊</p><p>  #define P_N_B

13、LOCKS15//inode節(jié)點中 指向數(shù)據(jù)塊的指針個數(shù)</p><p>  #defineGROUPNUMDATABLKNUM/BLKGRUPNUM+1 //數(shù)據(jù)塊組 組數(shù)</p><p>  #define DINODESIZ 512//磁盤i結點區(qū)的大樣(空間32×512)</p><p>  #define DINODENUM

14、 32//磁盤i結點區(qū)的塊數(shù)</p><p>  #define SYSOPENFILE 40</p><p>  #define DIRNUM 32//一個目錄下的最多目錄和文件的總和數(shù)</p><p>  #define DIRSIZ 14//文件、目錄名的長度(字節(jié))</p><p>  #defi

15、ne UPWDSIZ 15//密碼的長度</p><p>  #define UNAMSIZ 15//用戶名的長度</p><p>  #define PWDSIZsizeof(struct pwd) //密碼結構的長度 </p><p>  #define PWDNUM BLOCKSIZ/PWDSIZ//密碼數(shù)

16、據(jù)空間的大樣(pwd為單位)</p><p>  #define NOFILE 20//一個用戶最多可以打開的文件數(shù)目</p><p>  #define DINODESTART 4*BLOCKSIZ</p><p>  //i結點區(qū)的開始地址-inodes table ,1引導 2超塊 3block bitmap 4inode bitmap <

17、/p><p>  #define DATASTART (2+DINODENUM)*BLOCKSIZ//數(shù)據(jù)區(qū)的開始地址</p><p>  #defineDATASTARTNO36//數(shù)據(jù)區(qū)開始指針</p><p>  #define DIMODE_EMPTY00000/*可以用的空間*/</p><p>  #define D

18、IMODE_FILE00001</p><p>  #define DIMODE_DIR 00002</p><p>  #define DIMODE_PASSWD00004</p><p>  #define GRUP_00//管理員組</p><p>  #define GRUP_11</p>

19、<p>  #define GRUP_22</p><p>  #define GRUP_44</p><p><b>  2.2 結構體</b></p><p>  //磁盤i結點結構,</p><p>  struct inode{</p><p>  // char

20、di_name[DIRSIZ];</p><p>  unsigned __int16 di_ino;/*磁盤i節(jié)點標識*/</p><p>  unsigned __int16 di_number;/*關聯(lián)文件數(shù),當為0時表示刪除文件*/</p><p>  unsigned __int16 di_mode;/*存取權限*/</p>

21、<p>  unsigned __int16 di_uid;/*磁盤i節(jié)點用戶id*/</p><p>  unsigned __int16 di_gid;/*磁盤i節(jié)點權限組id*/ //1管理員組 2用戶組</p><p>  unsigned __int32 di_size;/*文件大樣*/</p><p>  unsigned __

22、int32 di_ctime; /* Creation time */</p><p>  unsigned __int32 di_mtime; /* Modification time */</p><p>  unsigned __int16 di_block[P_N_BLOCKS]; /* 一組 block 指針 */</p><p><b

23、>  };</b></p><p><b>  //目錄項結構</b></p><p>  struct direct{</p><p>  chard_name[DIRSIZ];/*目錄名(14字節(jié))*/</p><p>  __int16 d_ino;/*目錄號*/</p>&

24、lt;p><b>  };</b></p><p><b>  //超級快結構</b></p><p>  struct super_block{</p><p>  unsigned __int16 s_inodes_count; /* inodes 計數(shù) */</p><p> 

25、 unsigned __int16 s_blocks_count; /* blocks 計數(shù) */</p><p>  unsigned __int16 s_r_blocks_count; /* 保留的 blocks 計數(shù) */</p><p>  unsigned __int16 s_free_blocks_count; // 空閑的 blocks 計數(shù) </p&g

26、t;<p>  unsigned __int16 s_free_inodes_count; /* 空閑的 inodes 計數(shù) */</p><p>  unsigned __int16 s_free_blocks_group[GROUPNUM];//新增 一個數(shù)組來記錄每個數(shù)據(jù)塊組中的空閑數(shù)據(jù)塊計數(shù) </p><p>  unsigned __int16 s_first_da

27、ta_block; /* 第一個數(shù)據(jù) block */</p><p>  unsigned __int16 s_log_block_size; /* block 的大樣 */</p><p>  unsigned __int16 s_blocks_per_group; /* 每 block group 的 block 數(shù)量 */</p><p>  un

28、signed __int16 s_inodes_per_group; /* 每 block group 的 inode 數(shù)量 */</p><p><b>  };</b></p><p><b>  //用戶密碼</b></p><p>  struct pwd{</p><p>  unsi

29、gned __int8 p_uid;</p><p>  unsigned __int8 p_gid;</p><p>  char username[UNAMSIZ];/*用戶名 新加的*/ </p><p>  char password[UPWDSIZ];</p><p><b>  };</b></p&g

30、t;<p><b>  //目錄結構</b></p><p>  struct dir{</p><p>  struct direct direct[DIRNUM];</p><p>  __int16 size;</p><p><b>  };</b></p>&

31、lt;p>  2.3 全局變量和函數(shù)</p><p><b>  //全局變量</b></p><p>  unsigned __int8 di_bitmap[DINODENUM];// 硬盤inode節(jié)點位圖1表示已使用 0表示未使用</p><p>  unsigned __int8bk_bitmap[DATABLKNUM];

32、// 數(shù)據(jù)塊block位圖 </p><p>  struct super_block filsys;//超級塊</p><p>  struct pwd pwd[PWDNUM];</p><p>  FILE *fd;//文件指針</p><p>  struct inode *cur_inode;//

33、i節(jié)點當前目錄指針</p><p>  struct inode *inodetemp;//i節(jié)點指針</p><p>  const char fsystemname[20]="Linux.EXT2";//模擬硬盤的文件名</p><p>  struct direct dir_buf[BLOCKSIZ / sizeof(stru

34、ct direct)];//目錄數(shù)組</p><p>  char cmdhead[20];//cmd 的頭 表示所在哪個文件夾、</p><p>  int i_lock=0;//inode位圖鎖 可能會多線程</p><p>  int b_lock=0;//block位圖鎖</p><p>  struct pwd *cur_use

35、r;</p><p>  /*全局函數(shù)*/</p><p>  extern intFormat();//格式化磁盤</p><p>  extern intInstall();//啟動,安裝文件系統(tǒng)</p><p>  struct inode * read_inode(int);//install里面讀取文件dinode&l

36、t;/p><p>  struct direct * read_dir_data(int);//讀取存儲文件夾的物理塊</p><p>  extern void showdir();//命令 dir</p><p>  int Enterdir(char[]);//進入某個文件夾 命令-- cd 文件名</p><p>  int Fd_di

37、rfile(char[]);//查找當前目錄里的文件 沒找到返回-1 找到返回inode號</p><p>  int Iscmd(char[]);//判斷是否兩個字符串的命令</p><p>  void two_cmd(char[],char[]);//兩個字符串的命令</p><p>  int creat(char[]);//創(chuàng)建文件</p>

38、<p>  void changeinode();//交換指針</p><p>  char * ReadFile(char[]);//讀取文件</p><p>  int mkdir(char[]);//創(chuàng)建文件夾</p><p>  void showbitmap();//顯示位圖</p><p>  int deletefd(

39、char[]);//刪除文件</p><p>  int editfile(char[]);//編輯文件</p><p>  int rename(char[]);//重命名</p><p>  void showhelp();//命令幫助</p><p>  void login();</p><p>  void

40、logout();</p><p>  int access();//權限判斷</p><p>  /*磁盤i節(jié)點的分配與釋放(當一個新文件被建立的時候,在給該文件分配磁盤存儲區(qū)之前,</p><p>  應為該文件分配存放該文件說明信息的磁盤i節(jié)點,當從文件系統(tǒng)中刪除某個文件時,</p><p>  應首先刪除它的磁盤i節(jié)點項。)*/ &l

41、t;/p><p>  intialloc();/*開辟一個空閑的i節(jié)點,返回i節(jié)點*///磁盤塊分配與釋放函數(shù)</p><p>  intballoc(int);//申請硬盤空間</p><p><b>  2.4結構體說明</b></p><p>  (1)硬盤模擬文件:每個數(shù)據(jù)塊512字節(jié),第一個數(shù)據(jù)塊空閑備用,

42、第2塊是超級塊,第3塊是inode位圖,第4塊是block位圖,第5塊開始有32塊是inode節(jié)點,然后是數(shù)據(jù)區(qū)block,512塊。</p><p>  (2)超級塊:存放整個文件系統(tǒng)的基本狀態(tài),如:inode塊數(shù),block總塊數(shù),空閑的block計數(shù),空閑的inode計數(shù),每個數(shù)據(jù)塊組中的空閑塊數(shù)(為block分組,便于讀?。?,每個block的大樣(512字節(jié)),每個數(shù)據(jù)塊組的block塊數(shù)。</p&

43、gt;<p>  (3)Inode位圖:用一個數(shù)組來描述每個inode的使用狀況,1表示被占用,0表示空閑。</p><p>  (4)Block位圖:用一個數(shù)組來描述每個數(shù)據(jù)區(qū)的block的使用狀況,1表示被占用,0表示空閑。</p><p>  (5)inode節(jié)點:inode記錄了文件或者目錄在數(shù)據(jù)區(qū)存放位置,是文件還是目錄,是否系統(tǒng)文件,屬于管理員組還是普通用戶組,是

44、由誰創(chuàng)建的,創(chuàng)建時間等。如果是目錄,則還記錄了里面包含多少個文件或子目錄。是文件則記錄了文件的大樣。讀取文件要先通過inode然后找到block,才能讀取。</p><p>  (6)Block數(shù)據(jù)塊:存放文件的地方,如果是目錄則記錄了這個目錄下所有的文件和子目錄的名稱和所占的inode,如果是文本文檔,則是字節(jié)流文件。</p><p>  第三章 功能模塊(或算法)描述</p&g

45、t;<p>  3.1 format 格式化</p><p>  只寫打開模擬文件,初始化超級快,初始化dinode位圖 block位圖,初始化主目錄,初始化etc目錄,初始化管理員admin 目錄,初始化用戶xiao 目錄,初始化 用戶passwd文件,寫入模擬硬盤文件。</p><p>  3.2 install 安裝</p><p>  讀寫打

46、開模擬文件,讀取dinode位圖 block位圖,讀取主目錄,讀取etc目錄,讀取管理員admin 目錄,讀取用戶xiao 目錄,讀取 用戶passwd文件。 </p><p>  3.3 login 登陸</p><p>  用戶輸入用戶名和密碼,在passwd文件中查找是否有此用戶,核對密碼。正確則登陸成功,當前目錄設定到當前用戶文件夾下。登錄流程圖3.2。</p>&l

47、t;p>  3.4 ialloc 申請inode空間</p><p>  先檢測inode位圖是否加鎖,是則退出。加鎖,檢測inode空間是否還有已滿,是則退出。在inode位圖中順序查找空閑的inode,找到則返回inode地址,block解鎖。函數(shù)結束。流程圖3.3。</p><p>  登錄流程圖3.2 ialloc 流程圖3.3balloc流程圖3.4<

48、/p><p>  3.5 balloc 申請block空間</p><p>  先檢測block位圖是否加鎖,是則退出。加鎖,檢測block空間是否還有k個空閑,否則退出。在還有空閑block的組中查找是否有k個空閑,沒有則去下一個block組中查找,找到則返回block地址,block解鎖。函數(shù)結束。流程圖3.4。</p><p>  3.6 create 創(chuàng)建文本文

49、件</p><p>  查找當前目錄下是否有同名文件,是則退出,否則讓用戶輸入文本文件內(nèi)容,以‘###’結束。申請inode空間(ialloc函數(shù)),申請硬盤block空間(balloc函數(shù)),申請失敗則結束。將文件內(nèi)容寫入inode空間和block空間。修改當前目錄的結構,修改超級快,修改inode位圖,block位圖,寫入模擬硬盤。如圖4所示:</p><p>  圖4 create創(chuàng)

50、建文本文件</p><p>  3.7 cdir 創(chuàng)建文件夾</p><p>  查找當前目錄下是否有同名文件,是則退出,否則,申請inode空間(ialloc函數(shù)),申請硬盤block空間(balloc函數(shù)),申請失敗則結束。將文件夾內(nèi)容寫入inode空間和block空間。修改當前目錄的結構,修改超級快,修改inode位圖,block位圖,寫入模擬硬盤。</p><p

51、>  [root\etc\yang\fxb]#cdir caobinhui</p><p>  1已經(jīng)找到空閑的block 7 它在第0組</p><p><b>  當前目錄文件數(shù)3</b></p><p>  3.8 edit –讀取和追加文本文件</p><p>  Edit----調(diào)用讀取文件模塊,讀取成功

52、則用戶輸入追加的內(nèi)容,如果追加的內(nèi)容大于一個block則申請block空間,失敗則退出,申請成功則保存文件。</p><p>  3.9 access(文件名) 權限判斷</p><p>  先判斷當前目錄是否有該文件,在當前目錄的block找到該文件,判斷當前登錄用戶是哪個組,判斷是否該用戶創(chuàng)建,判斷該文件的可見級別。</p><p>  如果是該用戶創(chuàng)建的 則有

53、讀寫權限如果當前用戶是管理員組的 也具有讀寫權限如果該文件是用戶可查看文件則都具有權限。</p><p>  3.10 cd –進入子目錄 或上級目錄</p><p>  查找當前目錄是否有該子目錄,沒有則退出,調(diào)用access()判斷當前用戶是否有權限,無則退出,有則讀取該子目錄的inode,將當前目錄指向該目錄。</p><p>  [root\etc\yang

54、]#cd fxb</p><p>  [root\etc\yang\fxb]#</p><p>  3.11 attr(文件名)查看文件或者文件夾的屬性</p><p>  先查找當前目錄下是否有該文件或目錄,有則判斷文件是否系統(tǒng)文件,是否文本文件,是否目錄,由誰創(chuàng)建,屬于什么組,占用的block,和inode。將其全部顯示出來。</p><p&

55、gt;  3.12 del 刪除文件或目錄</p><p>  查找當前目錄是否有該文件名,沒有則退出,有則調(diào)用access()判斷是否有權限,有則判斷是否為系統(tǒng)文件,是則無法刪除,不是則判斷是否是文件,是文件則直接刪除,不是則判斷是否文件夾,是文件夾則判斷該文件夾下是否有文件,有文件則無法刪除。提示用戶是否刪除,確認則刪除文件,修改當前文件夾inode,block結構,修改該文件占有的inode和block位圖

56、為0,修改超級塊,寫入模擬硬盤。</p><p>  [root\etc\yang\fxb]#del caobinhui</p><p>  是否真的要刪除 caobinhui ?<y/n>y</p><p><b>  0 7</b></p><p>  [root\etc\yang\fxb]#cd c

57、aobinhui</p><p>  未找到該文件!請輸入正確的文件或目錄名</p><p><b>  進入目錄失敗!</b></p><p>  [root\etc\yang\fxb]#</p><p>  第四章 程序運行結果</p><p>  4.1格式化 和登錄界面</p>

58、;<p>  登錄后顯示幫助信息 ,進入到用戶文件夾下,如圖5所示:</p><p>  圖5 格式化及登錄界面</p><p>  4.2 ls命令---顯示當前目錄下的文件和目錄</p><p>  [root\etc\yang\fxb]#ls</p><p>  . <

59、dir> inode 6</p><p>  .. <dir> inode 4</p><p>  [root\etc\yang\fxb]#</p><p>  4.3 logout命令---注銷用戶</p><p>  [root\etc]#logout</p>

60、<p><b>  用戶名:</b></p><p>  普通用戶無法進入admin管理員目錄。</p><p><b>  第五章 心得體會</b></p><p>  操作系統(tǒng)課程設計是本課程重要的實踐教學環(huán)節(jié)。課程設計的目的,一方面使學生更透徹地理解操作系統(tǒng)的基本概念和原理,使之由抽象到具體;另一方面

61、,通過課程設計加強學生的實驗手段與實踐技能,培養(yǎng)學生獨立分析問題、解決問題、應用知識的能力和創(chuàng)新精神。與本課程的實驗教學相比,課程設計獨立設課,具有更多的學時,給學生更多自行設計、自主實驗的機會,充分放手讓學生真正培養(yǎng)學生的實踐動手能力,全面提高學生的綜合素質(zhì)。</p><p>  在設計的過程中遇到問題,可以說得是困難重重,遇到了過各種各樣的問題,同時在設計的過程中發(fā)現(xiàn)了我們的不足之處,對以前所學過的知識理解得

62、不夠深刻,掌握得不夠牢固,不過在老師和同學們的幫助下設計終于順利完成了,對給過我們幫助的所有同學和各位指導老師再次表示忠心的感謝!</p><p><b>  參考文獻</b></p><p>  [1] 袁慶龍,候文義.Ni-P合金鍍層組織形貌及顯微硬度研究[J].太原理工大學學報,2001,32(1):51-53.(連續(xù)出版物:[序號] 主要責任者.文獻題名[J]

63、.刊名,出版年份,卷號(期號):起止頁碼)</p><p>  [2] 劉國鈞,王連成.圖書館史研究[M].北京:高等教育出版社,1979:15-18,31.(專著:[序號] 主要責任者.文獻題名[M].出版地:出版者,出版年:起止頁碼.)</p><p>  [3] 孫品一.高校學報編輯工作現(xiàn)代化特征[C].中國高等學校自然科學學報研究會.科技編輯學論文集(2).北京:北京師范

64、大學出版社,1998:10-22.(論文集:[序號] 主要責任者.文獻題名[C]∥主編.論文集名.出版地:出版者,出版年:起止頁碼.)</p><p><b>  附:源代碼</b></p><p>  #include <stdio.h></p><p>  #include <stdlib.h></p>

65、<p>  #include <malloc.h></p><p>  #include <string.h></p><p>  #include <dos.h></p><p>  #include <conio.h></p><p>  #define BLOCKSIZ

66、512//磁盤塊的大樣</p><p>  #define DATABLKNUM 512//數(shù)據(jù)塊的數(shù)目</p><p>  #define BLKGRUPNUM50//數(shù)據(jù)塊組包含多少數(shù)據(jù)塊</p><p>  #define P_N_BLOCKS15//inode節(jié)點中 指向數(shù)據(jù)塊的指針個數(shù)</p><p>  #d

67、efineGROUPNUMDATABLKNUM/BLKGRUPNUM+1 //數(shù)據(jù)塊組 組數(shù)</p><p>  #define DINODESIZ 512//磁盤i結點區(qū)的大樣(空間32×512)</p><p>  #define DINODENUM 32//磁盤i結點區(qū)的塊數(shù)</p><p>  #define SYSOPENFI

68、LE 40</p><p>  #define DIRNUM 32//一個目錄下的最多目錄和文件的總和數(shù)</p><p>  #define DIRSIZ 14//文件、目錄名的長度(字節(jié))</p><p>  #define UPWDSIZ 15//秘密的長度</p><p>  #define

69、UNAMSIZ 15//用戶名的長度</p><p>  #define PWDSIZsizeof(struct pwd) //密碼結構的長度 </p><p>  #define PWDNUM BLOCKSIZ/PWDSIZ//密碼數(shù)據(jù)空間的大樣(pwd為單位)</p><p>  #define NOFILE

70、20//一個用戶最多可以打開的文件數(shù)目</p><p>  #define NHINO 128</p><p>  #define USERNUM 10//用戶名的長度</p><p>  #define DINODESTART 4*BLOCKSIZ//i結點區(qū)的開始地址-inodes table ,1引導 2超塊 3block bi

71、tmap 4inode bitmap </p><p>  #define DATASTART (2+DINODENUM)*BLOCKSIZ//數(shù)據(jù)區(qū)的開始地址</p><p>  #defineDATASTARTNO36//數(shù)據(jù)區(qū)開始指針</p><p>  /* di._mode */</p><p>  #define

72、 DIMODE_EMPTY00000/*可以用的空間*/</p><p>  #define DIMODE_FILE00001</p><p>  #define DIMODE_DIR 00002</p><p>  #define DIMODE_PASSWD00004</p><p>  #define DIMODE_SY

73、STEM00040/*系統(tǒng)文件*/</p><p>  #define DIMODE_READ 00010/* READ 和該數(shù)與操作后得到的是可以讀該文件的用戶組*/</p><p>  #define DIMODE_WRITE 00020/* WRITE */</p><p>  #define DIMODE_EXICUTE 01

74、000/* EXICUTE */</p><p>  #define DIMODE_ADMIN00100/*管理員權限*/</p><p>  #define DIMODE_SHARE00200/*不需要權限*/</p><p><b>  /*組*/</b></p><p>  #define GRUP_

75、00//管理員組</p><p>  #define GRUP_11</p><p>  #define GRUP_22</p><p>  #define GRUP_44</p><p>  /************************ 文件系統(tǒng) 數(shù)據(jù)結構 **********************

76、*********/</p><p>  /*————————————————————————</p><p><b>  磁盤i結點結構,</b></p><p>  ————————————————————————*/</p><p>  struct inode{</p><p>  //

77、 chardi_name[DIRSIZ];</p><p>  unsigned __int16 di_ino;/*磁盤i節(jié)點標識*/</p><p>  unsigned __int16 di_number;/*關聯(lián)文件數(shù),當為0時表示刪除文件*/</p><p>  unsigned __int16 di_mode;/*存取權限*/</

78、p><p>  unsigned __int16 di_uid;/*磁盤i節(jié)點用戶id*/</p><p>  unsigned __int16 di_gid;/*磁盤i節(jié)點權限組id*/ //1管理員組 2用戶組</p><p>  unsigned __int32 di_size;/*文件大樣*/</p><p>  unsign

79、ed __int32 di_ctime; /* Creation time */</p><p>  unsigned __int32 di_mtime; /* Modification time */</p><p>  unsigned __int16 di_block[P_N_BLOCKS]; /* 一組 block 指針 */</p><p>

80、<b>  };</b></p><p>  /*————————————————————————</p><p><b>  目錄項結構</b></p><p>  ————————————————————————*/</p><p>  struct direct{</p><

81、;p>  chard_name[DIRSIZ];/*目錄名(14字節(jié))*/</p><p>  __int16 d_ino;/*目錄號*/</p><p><b>  };</b></p><p>  /*————————————————————————</p><p><b>  超級快結構<

82、;/b></p><p>  ————————————————————————*/</p><p>  struct super_block{</p><p>  unsigned __int16 s_inodes_count; /* inodes 計數(shù) */</p><p>  unsigned __int16 s_bloc

83、ks_count; /* blocks 計數(shù) */</p><p>  unsigned __int16 s_r_blocks_count; /* 保留的 blocks 計數(shù) */</p><p>  unsigned __int16 s_free_blocks_count; // 空閑的 blocks 計數(shù) </p><p>  unsigned

84、__int16 s_free_inodes_count; /* 空閑的 inodes 計數(shù) */</p><p>  unsigned __int16 s_free_blocks_group[GROUPNUM];//新增 一個數(shù)組來記錄每個數(shù)據(jù)塊組中的空閑數(shù)據(jù)塊計數(shù) </p><p>  unsigned __int16 s_first_data_block; /* 第一個數(shù)據(jù) bloc

85、k */</p><p>  unsigned __int16 s_log_block_size; /* block 的大樣 */</p><p>  unsigned __int16 s_blocks_per_group; /* 每 block group 的 block 數(shù)量 */</p><p>  unsigned __int16 s_inodes_

86、per_group; /* 每 block group 的 inode 數(shù)量 */</p><p><b>  };</b></p><p>  /*————————————————————————</p><p><b>  用戶密碼</b></p><p>  ————————————————

87、————————*/</p><p>  struct pwd{</p><p>  unsigned __int8 p_uid;</p><p>  unsigned __int8 p_gid;</p><p>  char username[UNAMSIZ];/*用戶名 新加的*/ </p><p>  char

88、 password[UPWDSIZ];</p><p><b>  };</b></p><p>  /*————————————————————————</p><p><b>  目錄結構</b></p><p>  ————————————————————————*/</p>&

89、lt;p>  struct dir{</p><p>  struct direct direct[DIRNUM];</p><p>  __int16 size;</p><p><b>  };</b></p><p><b>  //全局變量</b></p><p

90、>  unsigned __int8 di_bitmap[DINODENUM];// 硬盤inode節(jié)點位圖 1表示已使用 0表示未使用</p><p>  unsigned __int8bk_bitmap[DATABLKNUM];// 數(shù)據(jù)塊block位圖 </p><p>  struct super_block filsys;//超級塊</p>

91、<p>  struct pwd pwd[PWDNUM];</p><p>  //struct user user[USERNUM];</p><p>  //int usernum;</p><p>  FILE *fd;//文件指針</p><p>  struct inode *cur_inode;

92、//i節(jié)點當前目錄指針</p><p>  //struct dinode *dinodef;//全局硬盤節(jié)點指針</p><p>  struct inode *inodetemp;//i節(jié)點指針</p><p>  //struct inode *inodetemp2;</p><p>  const cha

93、r fsystemname[20]="Linux.EXT2";//模擬硬盤的文件名</p><p>  struct direct dir_buf[BLOCKSIZ / sizeof(struct direct)];//目錄數(shù)組</p><p>  char cmdhead[20];//cmd 的頭 表示所在哪個文件夾、</p><p>

94、;  int i_lock=0;//inode位圖鎖 可能會多線程</p><p>  int b_lock=0;//block位圖鎖</p><p>  struct pwd *cur_user;</p><p>  /*全局函數(shù)*/</p><p>  extern intFormat();//格式化磁盤</p>

95、<p>  extern intInstall();//啟動,安裝文件系統(tǒng)</p><p>  struct inode * read_inode(int);//install里面讀取文件dinode</p><p>  struct direct * read_dir_data(int);//讀取存儲文件夾的物理塊</p><p>  extern

96、 void showdir();//命令 dir</p><p>  int Enterdir(char[]);//進入某個文件夾 命令-- cd 文件名</p><p>  int Fd_dirfile(char[]);//查找當前目錄里的文件 沒找到返回-1 找到返回inode號</p><p>  int Iscmd(char[]);//判斷是否兩個字符串的命

97、令</p><p>  void cmd_Up(char[],char[]);//兩個字符串的命令</p><p>  int creat(char[]);//創(chuàng)建文件</p><p>  void changeinode();//交換指針</p><p>  char * ReadFile(char[]);//讀取文件</p>

98、<p>  int cdir(char[]);//創(chuàng)建文件夾</p><p>  void showbitmap();//顯示位圖</p><p>  int deletefd(char[]);//刪除文件</p><p>  int editfile(char[]);//編輯文件</p><p>  int rename(cha

99、r[]);//重命名</p><p>  void showhelp();//命令幫助</p><p>  void login();</p><p>  void logout();</p><p>  int access();//權限判斷</p><p>  /*磁盤i節(jié)點的分配與釋放(當一個新文件被建立的時候,

100、在給該文件分配磁盤存儲區(qū)之前,</p><p>  應為該文件分配存放該文件說明信息的磁盤i節(jié)點,當從文件系統(tǒng)中刪除某個文件時,</p><p>  應首先刪除它的磁盤i節(jié)點項。)*/ </p><p>  intialloc();/*開辟一個空閑的i節(jié)點,返回i節(jié)點*/</p><p>  //磁盤塊分配與釋放函數(shù)</p>

101、<p>  intballoc(int);//申請硬盤空間</p><p>  void showaccess(char strname[20]);</p><p>  //內(nèi)存i節(jié)點的獲取與釋放 </p><p>  //extern struct inode *iget(unsigned int);/*獲取hino位置的i節(jié)點,返回i節(jié)點指針*/

102、</p><p>  //extern void iput(struct inode* );/*將i節(jié)點 釋放或是寫入磁盤*/</p><p><b>  //#endif</b></p><p>  void main()</p><p><b>  {</b></p>&l

103、t;p>  char str[10];</p><p>  char strname[10];</p><p><b>  char c;</b></p><p>  printf("是否格式化?<y/n>");</p><p>  scanf("%c",&

104、;c);</p><p>  fflush(stdin);</p><p>  if(c=='y')</p><p><b>  {</b></p><p>  if(!Format())</p><p><b>  {</b></p><

105、p><b>  return;</b></p><p><b>  }</b></p><p>  printf("格式化完畢!\n");</p><p><b>  }</b></p><p>  if(!Install())</p>

106、<p><b>  {</b></p><p><b>  return;</b></p><p><b>  }</b></p><p>  printf("login.................\n");</p><p><b>

107、;  login();</b></p><p>  showhelp();</p><p>  printf("%s>",cmdhead);</p><p><b>  while(1)</b></p><p><b>  {</b></p>&l

108、t;p>  scanf("%s",&str);</p><p>  if(strcmp(str,"exit")==0)</p><p><b>  {</b></p><p>  fclose(fd);</p><p><b>  return;</b

109、></p><p><b>  }</b></p><p>  elseif(strcmp(str,"dir")==0)</p><p><b>  {</b></p><p>  showdir();</p><p><b>  }&l

110、t;/b></p><p>  else if(strcmp(str,"bit")==0)</p><p><b>  {</b></p><p>  showbitmap();</p><p><b>  }</b></p><p>  else

111、if(strcmp(str,"help")==0)</p><p><b>  {</b></p><p>  showhelp();</p><p><b>  }</b></p><p>  else if(strcmp(str,"logout")==0)

112、</p><p><b>  {</b></p><p><b>  logout();</b></p><p><b>  }</b></p><p>  elseif(Iscmd(str))</p><p><b>  {</b&g

113、t;</p><p>  scanf("%s",&strname);</p><p>  cmd_Up(str,strname);</p><p><b>  }</b></p><p><b>  else</b></p><p><b&g

114、t;  {</b></p><p>  printf("錯誤命令!\n");</p><p><b>  }</b></p><p>  printf("%s>",cmdhead);</p><p><b>  }</b></p>

115、<p><b>  }</b></p><p>  //---------------------------格式化------------</p><p>  int Format()</p><p><b>  {</b></p><p>  struct pwd passwd [

116、BLOCKSIZ/PWDSIZ];</p><p><b>  int i;</b></p><p>  /*creat the file system file */</p><p>  fd = fopen (fsystemname, "wb");/*讀寫創(chuàng)建一個二進制文件*/</p><p>

117、  if(fd==NULL)</p><p><b>  {</b></p><p>  printf("硬盤模擬文件創(chuàng)建失敗!\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p>

118、<p><b>  //超級塊</b></p><p>  filsys.s_inodes_count=DINODENUM ; /* inodes 計數(shù) */</p><p>  filsys.s_blocks_count=DATABLKNUM; /* blocks 計數(shù) */</p><p>  filsys.

119、s_r_blocks_count=0; /* 保留的 blocks 計數(shù) */</p><p>  filsys. s_free_blocks_count=DATABLKNUM-5; /* 空閑的 blocks 計數(shù) */</p><p>  filsys.s_free_blocks_group[0]=50-5;//第一個block group 已經(jīng)被用了5個</p>

120、<p>  for(i=1;i<GROUPNUM-1;i++)</p><p><b>  {</b></p><p>  filsys.s_free_blocks_group[i]=50; //后面的group 全部空閑</p><p>  //printf("block group %d 空閑個數(shù)為%d\n&qu

121、ot;,i,filsys.s_free_blocks_group[i]);</p><p><b>  }</b></p><p>  filsys.s_free_blocks_group[GROUPNUM-1]=12;//最后一個block組 只有12個block</p><p>  filsys.s_free_inodes_count=DI

122、NODENUM-5; /* 空閑的 inodes 計數(shù) */</p><p>  filsys.s_first_data_block=DATASTARTNO; /* 第一個數(shù)據(jù) block 也就是*/</p><p>  filsys.s_log_block_size=BLOCKSIZ; /* block 的大樣 */</p><p>  filsys.s_

123、blocks_per_group=BLKGRUPNUM; /* 每 block group 的 block 數(shù)量 */</p><p>  filsys.s_inodes_per_group=0; //每 block group 的 inode 數(shù)量 暫未使用</p><p>  fseek(fd, BLOCKSIZ, SEEK_SET);</p><p> 

124、 fwrite (&filsys,BLOCKSIZ, 1,fd);</p><p>  //初始化dinode位圖 block位圖</p><p>  di_bitmap[0]=1;</p><p>  di_bitmap[1]=1;</p><p>  di_bitmap[2]=1;//前三個inode 分別被 root etc 用

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論