版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
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í) 計(jì)算科學(xué)與技術(shù)本科 班</p><p><b> 目錄</b></p><p> 第一章 課程設(shè)計(jì)簡(jiǎn)介
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)體說(shuō)明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 申請(qǐng)inode空間6</p><p> 3.5 balloc 申請(qǐng)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)入子目錄 或上級(jí)目錄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> 第五章 心得體會(huì)9</p><p><b> 參考文獻(xiàn)10</b></p><
7、;p><b> 附:源代碼11</b></p><p> 第一章 課程設(shè)計(jì)簡(jiǎn)介</p><p> 1.1 課程設(shè)計(jì)的目的</p><p> 課程設(shè)計(jì)目的使學(xué)生熟悉文件管理系統(tǒng)的設(shè)計(jì)方法;加深對(duì)所學(xué)各種文件操作的了解及其操作方法的特點(diǎn)。通過(guò)模擬文件系統(tǒng)的實(shí)現(xiàn),深入理解操作系統(tǒng)中文件系統(tǒng)的理論知識(shí), 加深對(duì)教材中的重要算法的理解。
8、同時(shí)通過(guò)編程實(shí)現(xiàn)這些算法,更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,提高綜合運(yùn)用各專業(yè)課知識(shí)的能力。</p><p> 1.2 課程設(shè)計(jì)內(nèi)容</p><p> 課程設(shè)計(jì)內(nèi)容設(shè)計(jì)一個(gè)簡(jiǎn)單的多用戶文件系統(tǒng)。即:</p><p> ?、僭谙到y(tǒng)中用一個(gè)文件來(lái)模擬一個(gè)磁盤(pán);</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、開(kāi)5個(gè)文件。</p><p> 2)程序采用二級(jí)文件目錄(即設(shè)置主目錄MFD)和用戶文件目錄(UFD)。另外,為打開(kāi)文件設(shè)置了運(yùn)行文件目錄(AFD)。</p><p> 3)為了便于實(shí)現(xiàn),對(duì)文件的讀寫(xiě)作了簡(jiǎn)化,在執(zhí)行讀寫(xiě)命令時(shí),只需改讀寫(xiě)指針,并不進(jìn)行實(shí)際的讀寫(xiě)操作。</p><p> 4)因系統(tǒng)樣,文件目錄的檢索使用了簡(jiǎn)單的線性搜索。</p>
11、<p> 5)文件保護(hù)簡(jiǎn)單使用了三位保護(hù)碼:允許讀寫(xiě)執(zhí)行、對(duì)應(yīng)位為1,對(duì)應(yīng)位為0,則表示不允許讀寫(xiě)、執(zhí)行。</p><p> 6)程序中使用的主要設(shè)計(jì)結(jié)構(gòu)如下:主文件目錄和用戶文件目錄(MFD、UFD),打開(kāi)文件目錄(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án)塊的大樣</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//磁盤(pán)i結(jié)點(diǎn)區(qū)的大樣(空間32×512)</p><p> #define DINODENUM
14、 32//磁盤(pán)i結(jié)點(diǎn)區(qū)的塊數(shù)</p><p> #define SYSOPENFILE 40</p><p> #define DIRNUM 32//一個(gè)目錄下的最多目錄和文件的總和數(shù)</p><p> #define DIRSIZ 14//文件、目錄名的長(zhǎng)度(字節(jié))</p><p> #defi
15、ne UPWDSIZ 15//密碼的長(zhǎng)度</p><p> #define UNAMSIZ 15//用戶名的長(zhǎng)度</p><p> #define PWDSIZsizeof(struct pwd) //密碼結(jié)構(gòu)的長(zhǎng)度 </p><p> #define PWDNUM BLOCKSIZ/PWDSIZ//密碼數(shù)
16、據(jù)空間的大樣(pwd為單位)</p><p> #define NOFILE 20//一個(gè)用戶最多可以打開(kāi)的文件數(shù)目</p><p> #define DINODESTART 4*BLOCKSIZ</p><p> //i結(jié)點(diǎn)區(qū)的開(kāi)始地址-inodes table ,1引導(dǎo) 2超塊 3block bitmap 4inode bitmap <
17、/p><p> #define DATASTART (2+DINODENUM)*BLOCKSIZ//數(shù)據(jù)區(qū)的開(kāi)始地址</p><p> #defineDATASTARTNO36//數(shù)據(jù)區(qū)開(kāi)始指針</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> //磁盤(pán)i結(jié)點(diǎn)結(jié)構(gòu),</p><p> struct inode{</p><p> // char
20、di_name[DIRSIZ];</p><p> unsigned __int16 di_ino;/*磁盤(pán)i節(jié)點(diǎn)標(biāo)識(shí)*/</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;/*磁盤(pán)i節(jié)點(diǎn)用戶id*/</p><p> unsigned __int16 di_gid;/*磁盤(pán)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;/*目錄號(hào)*/</p>&
24、lt;p><b> };</b></p><p><b> //超級(jí)快結(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ù)組來(lái)記錄每個(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];// 硬盤(pán)inode節(jié)點(diǎn)位圖1表示已使用 0表示未使用</p><p> unsigned __int8bk_bitmap[DATABLKNUM];
32、// 數(shù)據(jù)塊block位圖 </p><p> struct super_block filsys;//超級(jí)塊</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án)的文件名</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位圖鎖 可能會(huì)多線程</p><p> int b_lock=0;//block位圖鎖</p><p> struct pwd *cur_use
35、r;</p><p> /*全局函數(shù)*/</p><p> extern intFormat();//格式化磁盤(pán)</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);//讀取存儲(chǔ)文件夾的物理塊</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)前目錄里的文件 沒(méi)找到返回-1 找到返回inode號(hào)</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> /*磁盤(pán)i節(jié)點(diǎn)的分配與釋放(當(dāng)一個(gè)新文件被建立的時(shí)候,在給該文件分配磁盤(pán)存儲(chǔ)區(qū)之前,</p><p> 應(yīng)為該文件分配存放該文件說(shuō)明信息的磁盤(pán)i節(jié)點(diǎn),當(dāng)從文件系統(tǒng)中刪除某個(gè)文件時(shí),</p><p> 應(yīng)首先刪除它的磁盤(pán)i節(jié)點(diǎn)項(xiàng)。)*/ &l
41、t;/p><p> intialloc();/*開(kāi)辟一個(gè)空閑的i節(jié)點(diǎn),返回i節(jié)點(diǎn)*///磁盤(pán)塊分配與釋放函數(shù)</p><p> intballoc(int);//申請(qǐng)硬盤(pán)空間</p><p><b> 2.4結(jié)構(gòu)體說(shuō)明</b></p><p> (1)硬盤(pán)模擬文件:每個(gè)數(shù)據(jù)塊512字節(jié),第一個(gè)數(shù)據(jù)塊空閑備用,
42、第2塊是超級(jí)塊,第3塊是inode位圖,第4塊是block位圖,第5塊開(kāi)始有32塊是inode節(jié)點(diǎn),然后是數(shù)據(jù)區(qū)block,512塊。</p><p> (2)超級(jí)塊:存放整個(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ù)組來(lái)描述每個(gè)inode的使用狀況,1表示被占用,0表示空閑。</p><p> (4)Block位圖:用一個(gè)數(shù)組來(lái)描述每個(gè)數(shù)據(jù)區(qū)的block的使用狀況,1表示被占用,0表示空閑。</p><p> (5)inode節(jié)點(diǎn):inode記錄了文件或者目錄在數(shù)據(jù)區(qū)存放位置,是文件還是目錄,是否系統(tǒng)文件,屬于管理員組還是普通用戶組,是
44、由誰(shuí)創(chuàng)建的,創(chuàng)建時(shí)間等。如果是目錄,則還記錄了里面包含多少個(gè)文件或子目錄。是文件則記錄了文件的大樣。讀取文件要先通過(guò)inode然后找到block,才能讀取。</p><p> (6)Block數(shù)據(jù)塊:存放文件的地方,如果是目錄則記錄了這個(gè)目錄下所有的文件和子目錄的名稱和所占的inode,如果是文本文檔,則是字節(jié)流文件。</p><p> 第三章 功能模塊(或算法)描述</p&g
45、t;<p> 3.1 format 格式化</p><p> 只寫(xiě)打開(kāi)模擬文件,初始化超級(jí)快,初始化dinode位圖 block位圖,初始化主目錄,初始化etc目錄,初始化管理員admin 目錄,初始化用戶xiao 目錄,初始化 用戶passwd文件,寫(xiě)入模擬硬盤(pán)文件。</p><p> 3.2 install 安裝</p><p> 讀寫(xiě)打
46、開(kāi)模擬文件,讀取dinode位圖 block位圖,讀取主目錄,讀取etc目錄,讀取管理員admin 目錄,讀取用戶xiao 目錄,讀取 用戶passwd文件。 </p><p> 3.3 login 登陸</p><p> 用戶輸入用戶名和密碼,在passwd文件中查找是否有此用戶,核對(duì)密碼。正確則登陸成功,當(dāng)前目錄設(shè)定到當(dāng)前用戶文件夾下。登錄流程圖3.2。</p>&l
47、t;p> 3.4 ialloc 申請(qǐng)inode空間</p><p> 先檢測(cè)inode位圖是否加鎖,是則退出。加鎖,檢測(cè)inode空間是否還有已滿,是則退出。在inode位圖中順序查找空閑的inode,找到則返回inode地址,block解鎖。函數(shù)結(jié)束。流程圖3.3。</p><p> 登錄流程圖3.2 ialloc 流程圖3.3balloc流程圖3.4<
48、/p><p> 3.5 balloc 申請(qǐng)block空間</p><p> 先檢測(cè)block位圖是否加鎖,是則退出。加鎖,檢測(cè)block空間是否還有k個(gè)空閑,否則退出。在還有空閑block的組中查找是否有k個(gè)空閑,沒(méi)有則去下一個(gè)block組中查找,找到則返回block地址,block解鎖。函數(shù)結(jié)束。流程圖3.4。</p><p> 3.6 create 創(chuàng)建文本文
49、件</p><p> 查找當(dāng)前目錄下是否有同名文件,是則退出,否則讓用戶輸入文本文件內(nèi)容,以‘###’結(jié)束。申請(qǐng)inode空間(ialloc函數(shù)),申請(qǐng)硬盤(pán)block空間(balloc函數(shù)),申請(qǐng)失敗則結(jié)束。將文件內(nèi)容寫(xiě)入inode空間和block空間。修改當(dāng)前目錄的結(jié)構(gòu),修改超級(jí)快,修改inode位圖,block位圖,寫(xiě)入模擬硬盤(pán)。如圖4所示:</p><p> 圖4 create創(chuàng)
50、建文本文件</p><p> 3.7 cdir 創(chuàng)建文件夾</p><p> 查找當(dāng)前目錄下是否有同名文件,是則退出,否則,申請(qǐng)inode空間(ialloc函數(shù)),申請(qǐng)硬盤(pán)block空間(balloc函數(shù)),申請(qǐng)失敗則結(jié)束。將文件夾內(nèi)容寫(xiě)入inode空間和block空間。修改當(dāng)前目錄的結(jié)構(gòu),修改超級(jí)快,修改inode位圖,block位圖,寫(xiě)入模擬硬盤(pán)。</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則申請(qǐng)block空間,失敗則退出,申請(qǐng)成功則保存文件。</p><p> 3.9 access(文件名) 權(quán)限判斷</p><p> 先判斷當(dāng)前目錄是否有該文件,在當(dāng)前目錄的block找到該文件,判斷當(dāng)前登錄用戶是哪個(gè)組,判斷是否該用戶創(chuàng)建,判斷該文件的可見(jiàn)級(jí)別。</p><p> 如果是該用戶創(chuàng)建的 則有
53、讀寫(xiě)權(quán)限如果當(dāng)前用戶是管理員組的 也具有讀寫(xiě)權(quán)限如果該文件是用戶可查看文件則都具有權(quán)限。</p><p> 3.10 cd –進(jìn)入子目錄 或上級(jí)目錄</p><p> 查找當(dāng)前目錄是否有該子目錄,沒(méi)有則退出,調(diào)用access()判斷當(dāng)前用戶是否有權(quán)限,無(wú)則退出,有則讀取該子目錄的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)文件,是否文本文件,是否目錄,由誰(shuí)創(chuàng)建,屬于什么組,占用的block,和inode。將其全部顯示出來(lái)。</p><p&
55、gt; 3.12 del 刪除文件或目錄</p><p> 查找當(dāng)前目錄是否有該文件名,沒(méi)有則退出,有則調(diào)用access()判斷是否有權(quán)限,有則判斷是否為系統(tǒng)文件,是則無(wú)法刪除,不是則判斷是否是文件,是文件則直接刪除,不是則判斷是否文件夾,是文件夾則判斷該文件夾下是否有文件,有文件則無(wú)法刪除。提示用戶是否刪除,確認(rèn)則刪除文件,修改當(dāng)前文件夾inode,block結(jié)構(gòu),修改該文件占有的inode和block位圖
56、為0,修改超級(jí)塊,寫(xiě)入模擬硬盤(pán)。</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> 未找到該文件!請(qǐng)輸入正確的文件或目錄名</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> 普通用戶無(wú)法進(jìn)入admin管理員目錄。</p><p><b> 第五章 心得體會(huì)</b></p><p> 操作系統(tǒng)課程設(shè)計(jì)是本課程重要的實(shí)踐教學(xué)環(huán)節(jié)。課程設(shè)計(jì)的目的,一方面使學(xué)生更透徹地理解操作系統(tǒng)的基本概念和原理,使之由抽象到具體;另一方面
61、,通過(guò)課程設(shè)計(jì)加強(qiáng)學(xué)生的實(shí)驗(yàn)手段與實(shí)踐技能,培養(yǎng)學(xué)生獨(dú)立分析問(wèn)題、解決問(wèn)題、應(yīng)用知識(shí)的能力和創(chuàng)新精神。與本課程的實(shí)驗(yàn)教學(xué)相比,課程設(shè)計(jì)獨(dú)立設(shè)課,具有更多的學(xué)時(shí),給學(xué)生更多自行設(shè)計(jì)、自主實(shí)驗(yàn)的機(jī)會(huì),充分放手讓學(xué)生真正培養(yǎng)學(xué)生的實(shí)踐動(dòng)手能力,全面提高學(xué)生的綜合素質(zhì)。</p><p> 在設(shè)計(jì)的過(guò)程中遇到問(wèn)題,可以說(shuō)得是困難重重,遇到了過(guò)各種各樣的問(wèn)題,同時(shí)在設(shè)計(jì)的過(guò)程中發(fā)現(xiàn)了我們的不足之處,對(duì)以前所學(xué)過(guò)的知識(shí)理解得
62、不夠深刻,掌握得不夠牢固,不過(guò)在老師和同學(xué)們的幫助下設(shè)計(jì)終于順利完成了,對(duì)給過(guò)我們幫助的所有同學(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ù)出版物:[序號(hào)] 主要責(zé)任者.文獻(xiàn)題名[J]
63、.刊名,出版年份,卷號(hào)(期號(hào)):起止頁(yè)碼)</p><p> [2] 劉國(guó)鈞,王連成.圖書(shū)館史研究[M].北京:高等教育出版社,1979:15-18,31.(專著:[序號(hào)] 主要責(zé)任者.文獻(xiàn)題名[M].出版地:出版者,出版年:起止頁(yè)碼.)</p><p> [3] 孫品一.高校學(xué)報(bào)編輯工作現(xiàn)代化特征[C].中國(guó)高等學(xué)校自然科學(xué)學(xué)報(bào)研究會(huì).科技編輯學(xué)論文集(2).北京:北京師范
64、大學(xué)出版社,1998:10-22.(論文集:[序號(hào)] 主要責(zé)任者.文獻(xiàn)題名[C]∥主編.論文集名.出版地:出版者,出版年:起止頁(yè)碼.)</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án)塊的大樣</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//磁盤(pán)i結(jié)點(diǎn)區(qū)的大樣(空間32×512)</p><p> #define DINODENUM 32//磁盤(pán)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//文件、目錄名的長(zhǎng)度(字節(jié))</p><p> #define UPWDSIZ 15//秘密的長(zhǎng)度</p><p> #define
69、UNAMSIZ 15//用戶名的長(zhǎng)度</p><p> #define PWDSIZsizeof(struct pwd) //密碼結(jié)構(gòu)的長(zhǎng)度 </p><p> #define PWDNUM BLOCKSIZ/PWDSIZ//密碼數(shù)據(jù)空間的大樣(pwd為單位)</p><p> #define NOFILE
70、20//一個(gè)用戶最多可以打開(kāi)的文件數(shù)目</p><p> #define NHINO 128</p><p> #define USERNUM 10//用戶名的長(zhǎng)度</p><p> #define DINODESTART 4*BLOCKSIZ//i結(jié)點(diǎn)區(qū)的開(kāi)始地址-inodes table ,1引導(dǎo) 2超塊 3block bi
71、tmap 4inode bitmap </p><p> #define DATASTART (2+DINODENUM)*BLOCKSIZ//數(shù)據(jù)區(qū)的開(kāi)始地址</p><p> #defineDATASTARTNO36//數(shù)據(jù)區(qū)開(kāi)始指針</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> 磁盤(pán)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;/*磁盤(pán)i節(jié)點(diǎn)標(biāo)識(shí)*/</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;/*磁盤(pán)i節(jié)點(diǎn)用戶id*/</p><p> unsigned __int16 di_gid;/*磁盤(pán)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;/*目錄號(hào)*/</p><p><b> };</b></p><p> /*————————————————————————</p><p><b> 超級(jí)快結(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ù)組來(lái)記錄每個(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];// 硬盤(pán)inode節(jié)點(diǎn)位圖 1表示已使用 0表示未使用</p><p> unsigned __int8bk_bitmap[DATABLKNUM];// 數(shù)據(jù)塊block位圖 </p><p> struct super_block filsys;//超級(jí)塊</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;//全局硬盤(pán)節(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án)的文件名</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位圖鎖 可能會(huì)多線程</p><p> int b_lock=0;//block位圖鎖</p><p> struct pwd *cur_user;</p><p> /*全局函數(shù)*/</p><p> extern intFormat();//格式化磁盤(pán)</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);//讀取存儲(chǔ)文件夾的物理塊</p><p> extern
96、 void showdir();//命令 dir</p><p> int Enterdir(char[]);//進(jìn)入某個(gè)文件夾 命令-- cd 文件名</p><p> int Fd_dirfile(char[]);//查找當(dāng)前目錄里的文件 沒(méi)找到返回-1 找到返回inode號(hào)</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> /*磁盤(pán)i節(jié)點(diǎn)的分配與釋放(當(dāng)一個(gè)新文件被建立的時(shí)候,
100、在給該文件分配磁盤(pán)存儲(chǔ)區(qū)之前,</p><p> 應(yīng)為該文件分配存放該文件說(shuō)明信息的磁盤(pán)i節(jié)點(diǎn),當(dāng)從文件系統(tǒng)中刪除某個(gè)文件時(shí),</p><p> 應(yīng)首先刪除它的磁盤(pán)i節(jié)點(diǎn)項(xiàng)。)*/ </p><p> intialloc();/*開(kāi)辟一個(gè)空閑的i節(jié)點(diǎn),返回i節(jié)點(diǎn)*/</p><p> //磁盤(pán)塊分配與釋放函數(shù)</p>
101、<p> intballoc(int);//申請(qǐng)硬盤(pán)空間</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) 釋放或是寫(xiě)入磁盤(pá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");/*讀寫(xiě)創(chuàng)建一個(gè)二進(jìn)制文件*/</p><p>
117、 if(fd==NULL)</p><p><b> {</b></p><p> printf("硬盤(pán)模擬文件創(chuàng)建失敗!\n");</p><p><b> return 0;</b></p><p><b> }</b></p>
118、<p><b> //超級(jí)塊</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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(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)告--多級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)簡(jiǎn)單文件系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)--簡(jiǎn)單文件系統(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)告--多級(jí)文件系統(tǒng).doc
- 操作系統(tǒng)課程設(shè)計(jì)---文件系統(tǒng)的模擬
- 操作系統(tǒng)課程設(shè)計(jì)--樹(shù)形目錄文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--linux二級(jí)文件系統(tǒng)設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)二級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)二級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)(文件系統(tǒng)管理)
- 操作系統(tǒng)課程設(shè)計(jì)----二級(jí)文件系統(tǒng)
評(píng)論
0/150
提交評(píng)論