版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)</p><p> 題 目 虛擬文件系統(tǒng)的實(shí)現(xiàn)</p><p> 計(jì)算機(jī)科學(xué)學(xué)院 計(jì)算機(jī)科學(xué)與技術(shù) 專業(yè)</p><p> 10 級 計(jì)算科學(xué)與技術(shù)本科 班</p><p><b> 目錄</b></p><p> 第一章 課程設(shè)計(jì)簡介
2、1</p><p> 1.1 課程設(shè)計(jì)的目的1</p><p> 1.2 課程設(shè)計(jì)內(nèi)容1</p><p> 第二章 數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)2</p><p><b> 2.1 預(yù)定義2</b></p><p><b> 2.2 結(jié)構(gòu)體2</b></p>
3、;<p> 2.3 全局變量和函數(shù)4</p><p> 2.4結(jié)構(gòu)體說明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(文件名) 權(quán)限判斷7</p><p> 3.10 cd –進(jìn)入子目錄 或上級目錄8</p><p> 3.11 attr(文件名)查看文件或者文件夾的屬性8</p><p> 3.12 del 刪除文件或目錄8</p><p> 第四章 程序運(yùn)行結(jié)果8</p>
6、<p> 4.1格式化 和登錄界面8</p><p> 4.2 ls命令---顯示當(dāng)前目錄下的文件和目錄9</p><p> 4.3 logout命令---注銷用戶9</p><p> 第五章 心得體會9</p><p><b> 參考文獻(xiàn)10</b></p><
7、;p><b> 附:源代碼11</b></p><p> 第一章 課程設(shè)計(jì)簡介</p><p> 1.1 課程設(shè)計(jì)的目的</p><p> 課程設(shè)計(jì)目的使學(xué)生熟悉文件管理系統(tǒng)的設(shè)計(jì)方法;加深對所學(xué)各種文件操作的了解及其操作方法的特點(diǎn)。通過模擬文件系統(tǒng)的實(shí)現(xiàn),深入理解操作系統(tǒng)中文件系統(tǒng)的理論知識, 加深對教材中的重要算法的理解。
8、同時(shí)通過編程實(shí)現(xiàn)這些算法,更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,提高綜合運(yùn)用各專業(yè)課知識的能力。</p><p> 1.2 課程設(shè)計(jì)內(nèi)容</p><p> 課程設(shè)計(jì)內(nèi)容設(shè)計(jì)一個(gè)簡單的多用戶文件系統(tǒng)。即:</p><p> ?、僭谙到y(tǒng)中用一個(gè)文件來模擬一個(gè)磁盤;</p><p> ?、诖讼到y(tǒng)至少有:login、create、del、ls、cd
9、、md、rd、write、rename、attr、relogin、close等和部分文件屬性的功能。</p><p> ③實(shí)現(xiàn)這個(gè)文件系統(tǒng)。</p><p> ④能實(shí)際演示這個(gè)文件系統(tǒng)?;旧鲜沁M(jìn)入一個(gè)界面(此界面就是該文件系統(tǒng)的界面)后,可以實(shí)現(xiàn)設(shè)計(jì)的操作要求。</p><p> 1)設(shè)計(jì)一個(gè)10個(gè)用戶的文件系統(tǒng),每次用戶可保存10個(gè)文件,一次運(yùn)行用戶可以打
10、開5個(gè)文件。</p><p> 2)程序采用二級文件目錄(即設(shè)置主目錄MFD)和用戶文件目錄(UFD)。另外,為打開文件設(shè)置了運(yùn)行文件目錄(AFD)。</p><p> 3)為了便于實(shí)現(xiàn),對文件的讀寫作了簡化,在執(zhí)行讀寫命令時(shí),只需改讀寫指針,并不進(jìn)行實(shí)際的讀寫操作。</p><p> 4)因系統(tǒng)樣,文件目錄的檢索使用了簡單的線性搜索。</p>
11、<p> 5)文件保護(hù)簡單使用了三位保護(hù)碼:允許讀寫執(zhí)行、對應(yīng)位為1,對應(yīng)位為0,則表示不允許讀寫、執(zhí)行。</p><p> 6)程序中使用的主要設(shè)計(jì)結(jié)構(gòu)如下:主文件目錄和用戶文件目錄(MFD、UFD),打開文件目錄(AFD)即運(yùn)行文件目錄,如圖5.1所示。 </p><p> 第二章 數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)</p><p><b> 2.1
12、預(yù)定義</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é)點(diǎn)中 指向數(shù)據(jù)塊的指針個(gè)數(shù)</p><p> #defineGROUPNUMDATABLKNUM/BLKGRUPNUM+1 //數(shù)據(jù)塊組 組數(shù)</p><p> #define DINODESIZ 512//磁盤i結(jié)點(diǎn)區(qū)的大樣(空間32×512)</p><p> #define DINODENUM
14、 32//磁盤i結(jié)點(diǎn)區(qū)的塊數(shù)</p><p> #define SYSOPENFILE 40</p><p> #define DIRNUM 32//一個(gè)目錄下的最多目錄和文件的總和數(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) //密碼結(jié)構(gòu)的長度 </p><p> #define PWDNUM BLOCKSIZ/PWDSIZ//密碼數(shù)
16、據(jù)空間的大樣(pwd為單位)</p><p> #define NOFILE 20//一個(gè)用戶最多可以打開的文件數(shù)目</p><p> #define DINODESTART 4*BLOCKSIZ</p><p> //i結(jié)點(diǎn)區(qū)的開始地址-inodes table ,1引導(dǎo) 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 結(jié)構(gòu)體</b></p><p> //磁盤i結(jié)點(diǎn)結(jié)構(gòu),</p><p> struct inode{</p><p> // char
20、di_name[DIRSIZ];</p><p> unsigned __int16 di_ino;/*磁盤i節(jié)點(diǎn)標(biāo)識*/</p><p> unsigned __int16 di_number;/*關(guān)聯(lián)文件數(shù),當(dāng)為0時(shí)表示刪除文件*/</p><p> unsigned __int16 di_mode;/*存取權(quán)限*/</p>
21、<p> unsigned __int16 di_uid;/*磁盤i節(jié)點(diǎn)用戶id*/</p><p> unsigned __int16 di_gid;/*磁盤i節(jié)點(diǎn)權(quán)限組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> //目錄項(xiàng)結(jié)構(gòu)</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> //超級快結(jié)構(gòu)</b></p><p> struct super_block{</p><p> unsigned __int16 s_inodes_count; /* inodes 計(jì)數(shù) */</p><p>
25、 unsigned __int16 s_blocks_count; /* blocks 計(jì)數(shù) */</p><p> unsigned __int16 s_r_blocks_count; /* 保留的 blocks 計(jì)數(shù) */</p><p> unsigned __int16 s_free_blocks_count; // 空閑的 blocks 計(jì)數(shù) </p&g
26、t;<p> unsigned __int16 s_free_inodes_count; /* 空閑的 inodes 計(jì)數(shù) */</p><p> unsigned __int16 s_free_blocks_group[GROUPNUM];//新增 一個(gè)數(shù)組來記錄每個(gè)數(shù)據(jù)塊組中的空閑數(shù)據(jù)塊計(jì)數(shù) </p><p> unsigned __int16 s_first_da
27、ta_block; /* 第一個(gè)數(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> //目錄結(jié)構(gòu)</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é)點(diǎn)位圖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é)點(diǎn)當(dāng)前目錄指針</p><p> struct inode *inodetemp;//i節(jié)點(diǎn)指針</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 的頭 表示所在哪個(gè)文件夾、</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();//啟動(dòng),安裝文件系統(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[]);//進(jìn)入某個(gè)文件夾 命令-- cd 文件名</p><p> int Fd_di
37、rfile(char[]);//查找當(dāng)前目錄里的文件 沒找到返回-1 找到返回inode號</p><p> int Iscmd(char[]);//判斷是否兩個(gè)字符串的命令</p><p> void two_cmd(char[],char[]);//兩個(gè)字符串的命令</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();//權(quán)限判斷</p><p> /*磁盤i節(jié)點(diǎn)的分配與釋放(當(dāng)一個(gè)新文件被建立的時(shí)候,在給該文件分配磁盤存儲區(qū)之前,</p><p> 應(yīng)為該文件分配存放該文件說明信息的磁盤i節(jié)點(diǎn),當(dāng)從文件系統(tǒng)中刪除某個(gè)文件時(shí),</p><p> 應(yīng)首先刪除它的磁盤i節(jié)點(diǎn)項(xiàng)。)*/ &l
41、t;/p><p> intialloc();/*開辟一個(gè)空閑的i節(jié)點(diǎn),返回i節(jié)點(diǎn)*///磁盤塊分配與釋放函數(shù)</p><p> intballoc(int);//申請硬盤空間</p><p><b> 2.4結(jié)構(gòu)體說明</b></p><p> (1)硬盤模擬文件:每個(gè)數(shù)據(jù)塊512字節(jié),第一個(gè)數(shù)據(jù)塊空閑備用,
42、第2塊是超級塊,第3塊是inode位圖,第4塊是block位圖,第5塊開始有32塊是inode節(jié)點(diǎn),然后是數(shù)據(jù)區(qū)block,512塊。</p><p> (2)超級塊:存放整個(gè)文件系統(tǒng)的基本狀態(tài),如:inode塊數(shù),block總塊數(shù),空閑的block計(jì)數(shù),空閑的inode計(jì)數(shù),每個(gè)數(shù)據(jù)塊組中的空閑塊數(shù)(為block分組,便于讀?。總€(gè)block的大樣(512字節(jié)),每個(gè)數(shù)據(jù)塊組的block塊數(shù)。</p&
43、gt;<p> (3)Inode位圖:用一個(gè)數(shù)組來描述每個(gè)inode的使用狀況,1表示被占用,0表示空閑。</p><p> (4)Block位圖:用一個(gè)數(shù)組來描述每個(gè)數(shù)據(jù)區(qū)的block的使用狀況,1表示被占用,0表示空閑。</p><p> (5)inode節(jié)點(diǎn):inode記錄了文件或者目錄在數(shù)據(jù)區(qū)存放位置,是文件還是目錄,是否系統(tǒng)文件,屬于管理員組還是普通用戶組,是
44、由誰創(chuàng)建的,創(chuàng)建時(shí)間等。如果是目錄,則還記錄了里面包含多少個(gè)文件或子目錄。是文件則記錄了文件的大樣。讀取文件要先通過inode然后找到block,才能讀取。</p><p> (6)Block數(shù)據(jù)塊:存放文件的地方,如果是目錄則記錄了這個(gè)目錄下所有的文件和子目錄的名稱和所占的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文件中查找是否有此用戶,核對密碼。正確則登陸成功,當(dāng)前目錄設(shè)定到當(dāng)前用戶文件夾下。登錄流程圖3.2。</p>&l
47、t;p> 3.4 ialloc 申請inode空間</p><p> 先檢測inode位圖是否加鎖,是則退出。加鎖,檢測inode空間是否還有已滿,是則退出。在inode位圖中順序查找空閑的inode,找到則返回inode地址,block解鎖。函數(shù)結(jié)束。流程圖3.3。</p><p> 登錄流程圖3.2 ialloc 流程圖3.3balloc流程圖3.4<
48、/p><p> 3.5 balloc 申請block空間</p><p> 先檢測block位圖是否加鎖,是則退出。加鎖,檢測block空間是否還有k個(gè)空閑,否則退出。在還有空閑block的組中查找是否有k個(gè)空閑,沒有則去下一個(gè)block組中查找,找到則返回block地址,block解鎖。函數(shù)結(jié)束。流程圖3.4。</p><p> 3.6 create 創(chuàng)建文本文
49、件</p><p> 查找當(dāng)前目錄下是否有同名文件,是則退出,否則讓用戶輸入文本文件內(nèi)容,以‘###’結(jié)束。申請inode空間(ialloc函數(shù)),申請硬盤block空間(balloc函數(shù)),申請失敗則結(jié)束。將文件內(nèi)容寫入inode空間和block空間。修改當(dāng)前目錄的結(jié)構(gòu),修改超級快,修改inode位圖,block位圖,寫入模擬硬盤。如圖4所示:</p><p> 圖4 create創(chuàng)
50、建文本文件</p><p> 3.7 cdir 創(chuàng)建文件夾</p><p> 查找當(dāng)前目錄下是否有同名文件,是則退出,否則,申請inode空間(ialloc函數(shù)),申請硬盤block空間(balloc函數(shù)),申請失敗則結(jié)束。將文件夾內(nèi)容寫入inode空間和block空間。修改當(dāng)前目錄的結(jié)構(gòu),修改超級快,修改inode位圖,block位圖,寫入模擬硬盤。</p><p
51、> [root\etc\yang\fxb]#cdir caobinhui</p><p> 1已經(jīng)找到空閑的block 7 它在第0組</p><p><b> 當(dāng)前目錄文件數(shù)3</b></p><p> 3.8 edit –讀取和追加文本文件</p><p> Edit----調(diào)用讀取文件模塊,讀取成功
52、則用戶輸入追加的內(nèi)容,如果追加的內(nèi)容大于一個(gè)block則申請block空間,失敗則退出,申請成功則保存文件。</p><p> 3.9 access(文件名) 權(quán)限判斷</p><p> 先判斷當(dāng)前目錄是否有該文件,在當(dāng)前目錄的block找到該文件,判斷當(dāng)前登錄用戶是哪個(gè)組,判斷是否該用戶創(chuàng)建,判斷該文件的可見級別。</p><p> 如果是該用戶創(chuàng)建的 則有
53、讀寫權(quán)限如果當(dāng)前用戶是管理員組的 也具有讀寫權(quán)限如果該文件是用戶可查看文件則都具有權(quán)限。</p><p> 3.10 cd –進(jìn)入子目錄 或上級目錄</p><p> 查找當(dāng)前目錄是否有該子目錄,沒有則退出,調(diào)用access()判斷當(dāng)前用戶是否有權(quán)限,無則退出,有則讀取該子目錄的inode,將當(dāng)前目錄指向該目錄。</p><p> [root\etc\yang
54、]#cd fxb</p><p> [root\etc\yang\fxb]#</p><p> 3.11 attr(文件名)查看文件或者文件夾的屬性</p><p> 先查找當(dāng)前目錄下是否有該文件或目錄,有則判斷文件是否系統(tǒng)文件,是否文本文件,是否目錄,由誰創(chuàng)建,屬于什么組,占用的block,和inode。將其全部顯示出來。</p><p&
55、gt; 3.12 del 刪除文件或目錄</p><p> 查找當(dāng)前目錄是否有該文件名,沒有則退出,有則調(diào)用access()判斷是否有權(quán)限,有則判斷是否為系統(tǒng)文件,是則無法刪除,不是則判斷是否是文件,是文件則直接刪除,不是則判斷是否文件夾,是文件夾則判斷該文件夾下是否有文件,有文件則無法刪除。提示用戶是否刪除,確認(rèn)則刪除文件,修改當(dāng)前文件夾inode,block結(jié)構(gòu),修改該文件占有的inode和block位圖
56、為0,修改超級塊,寫入模擬硬盤。</p><p> [root\etc\yang\fxb]#del caobinhui</p><p> 是否真的要?jiǎng)h除 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> 進(jìn)入目錄失敗!</b></p><p> [root\etc\yang\fxb]#</p><p> 第四章 程序運(yùn)行結(jié)果</p><p> 4.1格式化 和登錄界面</p>
58、;<p> 登錄后顯示幫助信息 ,進(jìn)入到用戶文件夾下,如圖5所示:</p><p> 圖5 格式化及登錄界面</p><p> 4.2 ls命令---顯示當(dāng)前目錄下的文件和目錄</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> 普通用戶無法進(jìn)入admin管理員目錄。</p><p><b> 第五章 心得體會</b></p><p> 操作系統(tǒng)課程設(shè)計(jì)是本課程重要的實(shí)踐教學(xué)環(huán)節(jié)。課程設(shè)計(jì)的目的,一方面使學(xué)生更透徹地理解操作系統(tǒng)的基本概念和原理,使之由抽象到具體;另一方面
61、,通過課程設(shè)計(jì)加強(qiáng)學(xué)生的實(shí)驗(yàn)手段與實(shí)踐技能,培養(yǎng)學(xué)生獨(dú)立分析問題、解決問題、應(yīng)用知識的能力和創(chuàng)新精神。與本課程的實(shí)驗(yàn)教學(xué)相比,課程設(shè)計(jì)獨(dú)立設(shè)課,具有更多的學(xué)時(shí),給學(xué)生更多自行設(shè)計(jì)、自主實(shí)驗(yàn)的機(jī)會,充分放手讓學(xué)生真正培養(yǎng)學(xué)生的實(shí)踐動(dòng)手能力,全面提高學(xué)生的綜合素質(zhì)。</p><p> 在設(shè)計(jì)的過程中遇到問題,可以說得是困難重重,遇到了過各種各樣的問題,同時(shí)在設(shè)計(jì)的過程中發(fā)現(xiàn)了我們的不足之處,對以前所學(xué)過的知識理解得
62、不夠深刻,掌握得不夠牢固,不過在老師和同學(xué)們的幫助下設(shè)計(jì)終于順利完成了,對給過我們幫助的所有同學(xué)和各位指導(dǎo)老師再次表示忠心的感謝!</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 袁慶龍,候文義.Ni-P合金鍍層組織形貌及顯微硬度研究[J].太原理工大學(xué)學(xué)報(bào),2001,32(1):51-53.(連續(xù)出版物:[序號] 主要責(zé)任者.文獻(xiàn)題名[J]
63、.刊名,出版年份,卷號(期號):起止頁碼)</p><p> [2] 劉國鈞,王連成.圖書館史研究[M].北京:高等教育出版社,1979:15-18,31.(專著:[序號] 主要責(zé)任者.文獻(xiàn)題名[M].出版地:出版者,出版年:起止頁碼.)</p><p> [3] 孫品一.高校學(xué)報(bào)編輯工作現(xiàn)代化特征[C].中國高等學(xué)校自然科學(xué)學(xué)報(bào)研究會.科技編輯學(xué)論文集(2).北京:北京師范
64、大學(xué)出版社,1998:10-22.(論文集:[序號] 主要責(zé)任者.文獻(xiàn)題名[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é)點(diǎn)中 指向數(shù)據(jù)塊的指針個(gè)數(shù)</p><p> #d
67、efineGROUPNUMDATABLKNUM/BLKGRUPNUM+1 //數(shù)據(jù)塊組 組數(shù)</p><p> #define DINODESIZ 512//磁盤i結(jié)點(diǎn)區(qū)的大樣(空間32×512)</p><p> #define DINODENUM 32//磁盤i結(jié)點(diǎn)區(qū)的塊數(shù)</p><p> #define SYSOPENFI
68、LE 40</p><p> #define DIRNUM 32//一個(gè)目錄下的最多目錄和文件的總和數(shù)</p><p> #define DIRSIZ 14//文件、目錄名的長度(字節(jié))</p><p> #define UPWDSIZ 15//秘密的長度</p><p> #define
69、UNAMSIZ 15//用戶名的長度</p><p> #define PWDSIZsizeof(struct pwd) //密碼結(jié)構(gòu)的長度 </p><p> #define PWDNUM BLOCKSIZ/PWDSIZ//密碼數(shù)據(jù)空間的大樣(pwd為單位)</p><p> #define NOFILE
70、20//一個(gè)用戶最多可以打開的文件數(shù)目</p><p> #define NHINO 128</p><p> #define USERNUM 10//用戶名的長度</p><p> #define DINODESTART 4*BLOCKSIZ//i結(jié)點(diǎn)區(qū)的開始地址-inodes table ,1引導(dǎo) 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/*管理員權(quán)限*/</p><p> #define DIMODE_SHARE00200/*不需要權(quán)限*/</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ù)結(jié)構(gòu) **********************
76、*********/</p><p> /*————————————————————————</p><p><b> 磁盤i結(jié)點(diǎn)結(jié)構(gòu),</b></p><p> ————————————————————————*/</p><p> struct inode{</p><p> //
77、 chardi_name[DIRSIZ];</p><p> unsigned __int16 di_ino;/*磁盤i節(jié)點(diǎn)標(biāo)識*/</p><p> unsigned __int16 di_number;/*關(guān)聯(lián)文件數(shù),當(dāng)為0時(shí)表示刪除文件*/</p><p> unsigned __int16 di_mode;/*存取權(quán)限*/</
78、p><p> unsigned __int16 di_uid;/*磁盤i節(jié)點(diǎn)用戶id*/</p><p> unsigned __int16 di_gid;/*磁盤i節(jié)點(diǎn)權(quán)限組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> 目錄項(xiàng)結(jié)構(gòu)</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> 超級快結(jié)構(gòu)<
82、;/b></p><p> ————————————————————————*/</p><p> struct super_block{</p><p> unsigned __int16 s_inodes_count; /* inodes 計(jì)數(shù) */</p><p> unsigned __int16 s_bloc
83、ks_count; /* blocks 計(jì)數(shù) */</p><p> unsigned __int16 s_r_blocks_count; /* 保留的 blocks 計(jì)數(shù) */</p><p> unsigned __int16 s_free_blocks_count; // 空閑的 blocks 計(jì)數(shù) </p><p> unsigned
84、__int16 s_free_inodes_count; /* 空閑的 inodes 計(jì)數(shù) */</p><p> unsigned __int16 s_free_blocks_group[GROUPNUM];//新增 一個(gè)數(shù)組來記錄每個(gè)數(shù)據(jù)塊組中的空閑數(shù)據(jù)塊計(jì)數(shù) </p><p> unsigned __int16 s_first_data_block; /* 第一個(gè)數(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> 目錄結(jié)構(gòu)</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é)點(diǎn)位圖 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é)點(diǎn)當(dāng)前目錄指針</p><p> //struct dinode *dinodef;//全局硬盤節(jié)點(diǎn)指針</p><p> struct inode *inodetemp;//i節(jié)點(diǎn)指針</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 的頭 表示所在哪個(gè)文件夾、</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();//啟動(dòng),安裝文件系統(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[]);//進(jìn)入某個(gè)文件夾 命令-- cd 文件名</p><p> int Fd_dirfile(char[]);//查找當(dāng)前目錄里的文件 沒找到返回-1 找到返回inode號</p><p> int Iscmd(char[]);//判斷是否兩個(gè)字符串的命
97、令</p><p> void cmd_Up(char[],char[]);//兩個(gè)字符串的命令</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();//權(quán)限判斷</p><p> /*磁盤i節(jié)點(diǎn)的分配與釋放(當(dāng)一個(gè)新文件被建立的時(shí)候,
100、在給該文件分配磁盤存儲區(qū)之前,</p><p> 應(yīng)為該文件分配存放該文件說明信息的磁盤i節(jié)點(diǎn),當(dāng)從文件系統(tǒng)中刪除某個(gè)文件時(shí),</p><p> 應(yīng)首先刪除它的磁盤i節(jié)點(diǎn)項(xiàng)。)*/ </p><p> intialloc();/*開辟一個(gè)空閑的i節(jié)點(diǎn),返回i節(jié)點(diǎn)*/</p><p> //磁盤塊分配與釋放函數(shù)</p>
101、<p> intballoc(int);//申請硬盤空間</p><p> void showaccess(char strname[20]);</p><p> //內(nèi)存i節(jié)點(diǎn)的獲取與釋放 </p><p> //extern struct inode *iget(unsigned int);/*獲取hino位置的i節(jié)點(diǎn),返回i節(jié)點(diǎn)指針*/
102、</p><p> //extern void iput(struct inode* );/*將i節(jié)點(diǎn) 釋放或是寫入磁盤*/</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("錯(cuò)誤命令!\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)建一個(gè)二進(jìn)制文件*/</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 計(jì)數(shù) */</p><p> filsys.s_blocks_count=DATABLKNUM; /* blocks 計(jì)數(shù) */</p><p> filsys.
119、s_r_blocks_count=0; /* 保留的 blocks 計(jì)數(shù) */</p><p> filsys. s_free_blocks_count=DATABLKNUM-5; /* 空閑的 blocks 計(jì)數(shù) */</p><p> filsys.s_free_blocks_group[0]=50-5;//第一個(gè)block group 已經(jīng)被用了5個(gè)</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 空閑個(gè)數(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;//最后一個(gè)block組 只有12個(gè)block</p><p> filsys.s_free_inodes_count=DI
122、NODENUM-5; /* 空閑的 inodes 計(jì)數(shù) */</p><p> filsys.s_first_data_block=DATASTARTNO; /* 第一個(gè)數(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;//前三個(gè)inode 分別被 root etc 用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)--模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)---模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)-模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)--基于linux的模擬文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)簡單文件系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)--簡單文件系統(tǒng)的實(shí)現(xiàn)
- 《操作系統(tǒng)》課程設(shè)計(jì)-- 模擬文件管理系統(tǒng)
- 操作系統(tǒng)文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)
- 《操作系統(tǒng)》課程設(shè)計(jì)--模擬文件管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級文件系統(tǒng).doc
- 操作系統(tǒng)課程設(shè)計(jì)---文件系統(tǒng)的模擬
- 操作系統(tǒng)課程設(shè)計(jì)--樹形目錄文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--linux二級文件系統(tǒng)設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)二級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)二級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)(文件系統(tǒng)管理)
- 操作系統(tǒng)課程設(shè)計(jì)----二級文件系統(tǒng)
評論
0/150
提交評論