




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、. . 甘肅政法學(xué)院甘肅政法學(xué)院 計算機(jī)操作系統(tǒng)課程設(shè)計計算機(jī)操作系統(tǒng)課程設(shè)計 題 目 虛擬文件系統(tǒng)的實(shí)現(xiàn)虛擬文件系統(tǒng)的實(shí)現(xiàn) 計算機(jī)科學(xué)學(xué)院 計算機(jī)科學(xué)與技術(shù) 專業(yè) 10 級 計算科學(xué)與技術(shù)本科 班 姓 名:_ _ 指導(dǎo)教師:_ _ 成 績:_ _ 完成時間:_2013 年 7 月 . . 目錄目錄 第一章 課程設(shè)計簡介1 1.1 課程設(shè)計的目的1 1.2 課程設(shè)計內(nèi)容1 第二章 數(shù)據(jù)結(jié)構(gòu)的設(shè)計2 2.1 預(yù)定義2 2.2 結(jié)構(gòu)體2 2.3 全局變量和函數(shù)4 2.4 結(jié)構(gòu)體說明5 第三章 功能模塊(或算法)描述5 3.1 format 格式化5 3.2 install 安裝6 3.3 logi
2、n 登陸6 3.4 ialloc 申請inode空間6 3.5 balloc 申請block空間6 3.6 create 創(chuàng)建文本文件7 3.7 cdir 創(chuàng)建文件夾7 3.8 edit 讀取和追加文本文件7 3.9 access(文件名) 權(quán)限判斷7 3.10 cd 進(jìn)入子目錄 或上級目錄 8 3.11 attr(文件名)查看文件或者文件夾的屬性 8 3.12 del 刪除文件或目錄 8 第四章 程序運(yùn)行結(jié)果8 4.1 格式化 和登錄界面8 4.2 ls命令-顯示當(dāng)前目錄下的文件和目錄9 4.3 logout命令-注銷用戶 9 第五章 心得體會9 參考文獻(xiàn)10 附:源代碼11 . . 第一章
3、第一章 課程設(shè)計簡介課程設(shè)計簡介 1.11.1 課程設(shè)計的目的課程設(shè)計的目的 課程設(shè)計目的使學(xué)生熟悉文件管理系統(tǒng)的設(shè)計方法;加深對所學(xué)各種文件 操作的了解及其操作方法的特點(diǎn)。通過模擬文件系統(tǒng)的實(shí)現(xiàn),深入理解操作系 統(tǒng)中文件系統(tǒng)的理論知識, 加深對教材中的重要算法的理解。同時通過編程實(shí) 現(xiàn)這些算法,更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,提高綜合運(yùn)用各專業(yè)課知 識的能力。 1.21.2 課程設(shè)計內(nèi)容課程設(shè)計內(nèi)容 課程設(shè)計內(nèi)容設(shè)計一個簡單的多用戶文件系統(tǒng)。即: 在系統(tǒng)中用一個文件來模擬一個磁盤; 此系統(tǒng)至少有: login、create、del、ls、cd、md、rd、write、rename、att
4、r、relogin、clo se 等和部分文件屬性的功能。 實(shí)現(xiàn)這個文件系統(tǒng)。 能實(shí)際演示這個文件系統(tǒng)?;旧鲜沁M(jìn)入一個界面(此界面就是該文件系統(tǒng) 的界面)后,可以實(shí)現(xiàn)設(shè)計的操作要求。 1)設(shè)計一個 10 個用戶的文件系統(tǒng),每次用戶可保存 10 個文件,一次運(yùn)行用戶 可以打開 5 個文件。 2)程序采用二級文件目錄(即設(shè)置主目錄 mfd)和用戶文件目錄(ufd) 。另外, 為打開文件設(shè)置了運(yùn)行文件目錄(afd) 。 3)為了便于實(shí)現(xiàn),對文件的讀寫作了簡化,在執(zhí)行讀寫命令時,只需改讀寫指 針,并不進(jìn)行實(shí)際的讀寫操作。 4)因系統(tǒng)樣,文件目錄的檢索使用了簡單的線性搜索。 5)文件保護(hù)簡單使用了三位
5、保護(hù)碼:允許讀寫執(zhí)行、對應(yīng)位為 1,對應(yīng)位為 0,則表示不允許讀寫、執(zhí)行。 6)程序中使用的主要設(shè)計結(jié)構(gòu)如下:主文件目錄和用戶文件目錄(mfd、ufd) , 打開文件目錄(afd)即運(yùn)行文件目錄,如圖 5.1 所示。 . . 第二章第二章 數(shù)據(jù)結(jié)構(gòu)的設(shè)計數(shù)據(jù)結(jié)構(gòu)的設(shè)計 2.12.1 預(yù)定義預(yù)定義 #define blocksiz 512/磁盤塊的大樣 #define datablknum 512/數(shù)據(jù)塊的數(shù)目 #define blkgrupnum50/數(shù)據(jù)塊組包含多少數(shù)據(jù)塊 #define p_n_blocks15/inode 節(jié)點(diǎn)中 指向數(shù)據(jù)塊的指針個數(shù) #definegroupnumdat
6、ablknum/blkgrupnum+1 /數(shù)據(jù)塊組 組數(shù) #define dinodesiz 512/磁盤 i 結(jié)點(diǎn)區(qū)的大樣(空間 32512) #define dinodenum 32/磁盤 i 結(jié)點(diǎn)區(qū)的塊數(shù) #define sysopenfile 40 #define dirnum 32/一個目錄下的最多目錄和文件的總和數(shù) #define dirsiz 14/文件、目錄名的長度(字節(jié)) #define upwdsiz 15/密碼的長度 #define unamsiz 15/用戶名的長度 #define pwdsizsizeof(struct pwd) /密碼結(jié)構(gòu)的長度 #define p
7、wdnum blocksiz/pwdsiz/密碼數(shù)據(jù)空間的大樣(pwd 為單位) #define nofile 20/一個用戶最多可以打開的文件數(shù)目 #define dinodestart 4*blocksiz /i 結(jié)點(diǎn)區(qū)的開始地址-inodes table ,1 引導(dǎo) 2 超塊 3block bitmap 4inode bitmap #define datastart (2+dinodenum)*blocksiz/數(shù)據(jù)區(qū)的開始地址 #definedatastartno36/數(shù)據(jù)區(qū)開始指針 #define dimode_empty00000/*可以用的空間*/ #define dimode_
8、file00001 #define dimode_dir 00002 #define dimode_passwd00004 #define grup_00/管理員組 #define grup_11 #define grup_22 #define grup_44 2.22.2 結(jié)構(gòu)體結(jié)構(gòu)體 /磁盤 i 結(jié)點(diǎn)結(jié)構(gòu), struct inode / chardi_namedirsiz; unsigned _int16 di_ino;/*磁盤 i 節(jié)點(diǎn)標(biāo)識*/ unsigned _int16 di_number;/*關(guān)聯(lián)文件數(shù),當(dāng)為 0 時表示刪除 . . 文件*/ unsigned _int16 di
9、_mode; /*存取權(quán)限*/ unsigned _int16 di_uid; /*磁盤 i 節(jié)點(diǎn)用戶 id*/ unsigned _int16 di_gid; /*磁盤 i 節(jié)點(diǎn)權(quán)限組 id*/ /1 管理員 組 2 用戶組 unsigned _int32 di_size; /*文件大樣*/ unsigned _int32 di_ctime; /* creation time */ unsigned _int32 di_mtime; /* modification time */ unsigned _int16 di_blockp_n_blocks; /* 一組 block 指針 */ ;
10、/ 目錄項結(jié)構(gòu) struct direct chard_namedirsiz;/*目錄名(14 字節(jié))*/ _int16 d_ino;/*目錄號*/ ; /超級快結(jié)構(gòu) struct super_block unsigned _int16 s_inodes_count; /* inodes 計數(shù) */ unsigned _int16 s_blocks_count; /* blocks 計數(shù) */ unsigned _int16 s_r_blocks_count; /* 保留的 blocks 計數(shù) */ unsigned _int16 s_free_blocks_count; / 空閑的 bloc
11、ks 計數(shù) unsigned _int16 s_free_inodes_count; /* 空閑的 inodes 計數(shù) */ unsigned _int16 s_free_blocks_groupgroupnum;/新增 一個數(shù)組 來記錄每個數(shù)據(jù)塊組中的空閑數(shù)據(jù)塊計數(shù) unsigned _int16 s_first_data_block; /* 第一個數(shù)據(jù) block */ unsigned _int16 s_log_block_size; /* block 的大樣 */ unsigned _int16 s_blocks_per_group; /* 每 block group 的 block
12、數(shù)量 */ unsigned _int16 s_inodes_per_group; /* 每 block group 的 inode 數(shù)量 */ ; / 用戶密碼 struct pwd unsigned _int8 p_uid; unsigned _int8 p_gid; char usernameunamsiz;/*用戶名 新加的*/ char passwordupwdsiz; ; / 目錄結(jié)構(gòu) struct dir struct direct directdirnum; _int16 size; . . ; 2.32.3 全局變量和函數(shù)全局變量和函數(shù) /全局變量 unsigned _int
13、8 di_bitmapdinodenum; / 硬盤 inode 節(jié)點(diǎn)位圖 1 表示已 使用 0 表示未使用 unsigned _int8bk_bitmapdatablknum;/ 數(shù)據(jù)塊 block 位圖 struct super_block filsys;/超級塊 struct pwd pwdpwdnum; file *fd;/文件指針 struct inode *cur_inode;/i 節(jié)點(diǎn)當(dāng)前目錄指針 struct inode *inodetemp;/i 節(jié)點(diǎn)指針 const char fsystemname20=linux.ext2;/模擬硬盤的文件名 struct direct
14、dir_bufblocksiz / sizeof(struct direct);/目錄數(shù) 組 char cmdhead20;/cmd 的頭 表示所在哪個文件夾、 int i_lock=0;/inode 位圖鎖 可能會多線程 int b_lock=0;/block 位圖鎖 struct pwd *cur_user; /*全局函數(shù)*/ extern int format();/格式化磁盤 extern int install();/啟動,安裝文件系統(tǒng) struct inode * read_inode(int);/install 里面讀取文件 dinode struct direct * read
15、_dir_data(int);/讀取存儲文件夾的物理塊 extern void showdir();/命令 dir int enterdir(char);/進(jìn)入某個文件夾 命令- cd 文件名 int fd_dirfile(char);/查找當(dāng)前目錄里的文件 沒找到返回-1 找到返回 inode 號 int iscmd(char);/判斷是否兩個字符串的命令 void two_cmd(char,char);/兩個字符串的命令 int creat(char);/創(chuàng)建文件 void changeinode();/交換指針 char * readfile(char);/讀取文件 int mkdir(
16、char);/創(chuàng)建文件夾 void showbitmap();/顯示位圖 int deletefd(char);/刪除文件 int editfile(char);/編輯文件 int rename(char);/重命名 void showhelp();/命令幫助 void login(); void logout(); int access();/權(quán)限判斷 /*磁盤 i 節(jié)點(diǎn)的分配與釋放(當(dāng)一個新文件被建立的時候,在給該文件分配磁 . . 盤存儲區(qū)之前, 應(yīng)為該文件分配存放該文件說明信息的磁盤 i 節(jié)點(diǎn),當(dāng)從文件系統(tǒng)中刪除某個 文件時, 應(yīng)首先刪除它的磁盤 i 節(jié)點(diǎn)項。 )*/ intiallo
17、c();/*開辟一個空閑的 i 節(jié)點(diǎn),返回 i 節(jié)點(diǎn)*/磁盤塊分配與釋 放函數(shù) intballoc(int);/申請硬盤空間 2.42.4 結(jié)構(gòu)體說明結(jié)構(gòu)體說明 (1)硬盤模擬文件:每個數(shù)據(jù)塊 512 字節(jié),第一個數(shù)據(jù)塊空閑備用,第 2 塊是超 級塊,第 3 塊是 inode 位圖,第 4 塊是 block 位圖,第 5 塊開始有 32 塊是 inode 節(jié)點(diǎn),然后是數(shù)據(jù)區(qū) block,512 塊。 (2)超級塊:存放整個文件系統(tǒng)的基本狀態(tài),如:inode 塊數(shù),block 總塊數(shù), 空閑的 block 計數(shù),空閑的 inode 計數(shù),每個數(shù)據(jù)塊組中的空閑塊數(shù)(為 block 分組,便于讀?。?/p>
18、 ,每個 block 的大樣(512 字節(jié)) ,每個數(shù)據(jù)塊組的 block 塊數(shù)。 (3)inode 位圖:用一個數(shù)組來描述每個 inode 的使用狀況,1 表示被占用,0 表示空閑。 (4)block 位圖:用一個數(shù)組來描述每個數(shù)據(jù)區(qū)的 block 的使用狀況,1 表示被 占用,0 表示空閑。 (5)inode 節(jié)點(diǎn):inode 記錄了文件或者目錄在數(shù)據(jù)區(qū)存放位置,是文件還是目 錄,是否系統(tǒng)文件,屬于管理員組還是普通用戶組,是由誰創(chuàng)建的,創(chuàng)建時間 等。如果是目錄,則還記錄了里面包含多少個文件或子目錄。是文件則記錄了 文件的大樣。讀取文件要先通過 inode 然后找到 block,才能讀取。
19、(6)block 數(shù)據(jù)塊:存放文件的地方,如果是目錄則記錄了這個目錄下所有的文 件和子目錄的名稱和所占的 inode,如果是文本文檔,則是字節(jié)流文件。 第三章第三章 功能模塊(或算法)描述功能模塊(或算法)描述 3.13.1 formatformat 格式化格式化 只寫打開模擬文件,初始化超級快,初始化 dinode 位圖 block 位圖,初 始化主目錄,初始化 etc 目錄,初始化管理員 admin 目錄,初始化用戶 xiao 目錄,初始化 用戶 passwd 文件,寫入模擬硬盤文件。 . . 3.23.2 installinstall 安裝安裝 讀寫打開模擬文件,讀取 dinode 位圖
20、 block 位圖,讀取主目錄,讀取 etc 目錄,讀取管理員 admin 目錄,讀取用戶 xiao 目錄,讀取 用戶 passwd 文件。 3.33.3 loginlogin 登陸登陸 用戶輸入用戶名和密碼,在 passwd 文件中查找是否有此用戶,核對密碼。 正確則登陸成功,當(dāng)前目錄設(shè)定到當(dāng)前用戶文件夾下。登錄流程圖 3.2。 3.43.4 iallocialloc 申請申請 inodeinode 空間空間 先檢測 inode 位圖是否加鎖,是則退出。加鎖,檢測 inode 空間是否還有 已滿,是則退出。在 inode 位圖中順序查找空閑的 inode,找到則返回 inode 地址,blo
21、ck 解鎖。函數(shù)結(jié)束。流程圖 3.3。 login 登錄 結(jié)束 是,登錄成功 輸入用戶名 查找是否有改 用戶名 輸入密碼 是 否 密碼是否正確 否 ialloc 申請inode空間 inode位圖是否加鎖 否,加鎖 inode空間是否已滿 否 在ionde位圖順序查 找空閑的inode 找到返回inode地址 inode位圖解鎖 結(jié)束 申請失敗 是 找不到 balloc(int k) 申請k個block空間 block位圖是否加鎖 否,加鎖 是否有k個空閑的 block 是 在block位圖按照分 組查找空閑的block 找到返回block地址 block位圖解鎖 結(jié)束 申請失敗 否 找不到
22、登錄流程圖 3.2 ialloc 流程圖 3.3balloc 流程圖 3.4 3.53.5 ballocballoc 申請申請 blockblock 空間空間 先檢測 block 位圖是否加鎖,是則退出。加鎖,檢測 block 空間是否還有 k 個空閑,否則退出。在還有空閑 block 的組中查找是否有 k 個空閑,沒有則 . . 去下一個 block 組中查找,找到則返回 block 地址,block 解鎖。函數(shù)結(jié)束。 流程圖 3.4。 3.63.6 createcreate 創(chuàng)建文本文件創(chuàng)建文本文件 查找當(dāng)前目錄下是否有同名文件,是則退出,否則讓用戶輸入文本文件內(nèi) 容,以#結(jié)束。申請 in
23、ode 空間(ialloc 函數(shù)),申請硬盤 block 空間 (balloc 函數(shù)) ,申請失敗則結(jié)束。將文件內(nèi)容寫入 inode 空間和 block 空間。 修改當(dāng)前目錄的結(jié)構(gòu),修改超級快,修改 inode 位圖,block 位圖,寫入模擬硬 盤。如圖 4 所示: 圖 4 create 創(chuàng)建文本文件 3.73.7 cdircdir 創(chuàng)建文件夾創(chuàng)建文件夾 查找當(dāng)前目錄下是否有同名文件,是則退出,否則,申請 inode 空間 (ialloc 函數(shù)),申請硬盤 block 空間(balloc 函數(shù)) ,申請失敗則結(jié)束。將文 件夾內(nèi)容寫入 inode 空間和 block 空間。修改當(dāng)前目錄的結(jié)構(gòu),
24、修改超級快, 修改 inode 位圖,block 位圖,寫入模擬硬盤。 rootetcyangfxb#cdir caobinhui 1 已經(jīng)找到空閑的 block 7 它在第 0 組 當(dāng)前目錄文件數(shù) 3 3.83.8 editedit 讀取和追加文本文件讀取和追加文本文件 edit-調(diào)用讀取文件模塊,讀取成功則用戶輸入追加的內(nèi)容,如果追加 的內(nèi)容大于一個 block 則申請 block 空間,失敗則退出,申請成功則保存文件。 3.93.9 accessaccess(文件名)(文件名) 權(quán)限判斷權(quán)限判斷 先判斷當(dāng)前目錄是否有該文件,在當(dāng)前目錄的 block 找到該文件,判斷當(dāng) . . 前登錄用戶
25、是哪個組,判斷是否該用戶創(chuàng)建,判斷該文件的可見級別。 如果是該用戶創(chuàng)建的 則有讀寫權(quán)限如果當(dāng)前用戶是管理員組的 也具有讀寫權(quán) 限如果該文件是用戶可查看文件則都具有權(quán)限。 3.103.10 cdcd 進(jìn)入子目錄進(jìn)入子目錄 或上級目錄或上級目錄 查找當(dāng)前目錄是否有該子目錄,沒有則退出,調(diào)用 access()判斷當(dāng)前用 戶是否有權(quán)限,無則退出,有則讀取該子目錄的 inode,將當(dāng)前目錄指向該目 錄。 rootetcyang#cd fxb rootetcyangfxb# 3.113.11 attrattr(文件名)查看文件或者文件夾的屬性(文件名)查看文件或者文件夾的屬性 先查找當(dāng)前目錄下是否有該文件
26、或目錄,有則判斷文件是否系統(tǒng)文件,是 否文本文件,是否目錄,由誰創(chuàng)建,屬于什么組,占用的 block,和 inode。將 其全部顯示出來。 3.123.12 deldel 刪除文件或目錄刪除文件或目錄 查找當(dāng)前目錄是否有該文件名,沒有則退出,有則調(diào)用 access()判斷是 否有權(quán)限,有則判斷是否為系統(tǒng)文件,是則無法刪除,不是則判斷是否是文件, 是文件則直接刪除,不是則判斷是否文件夾,是文件夾則判斷該文件夾下是否 有文件,有文件則無法刪除。提示用戶是否刪除,確認(rèn)則刪除文件,修改當(dāng)前 文件夾 inode,block 結(jié)構(gòu),修改該文件占有的 inode 和 block 位圖為 0,修改 超級塊,寫
27、入模擬硬盤。 rootetcyangfxb#del caobinhui 是否真的要刪除 caobinhui ?y 0 7 rootetcyangfxb#cd caobinhui 未找到該文件!請輸入正確的文件或目錄名 進(jìn)入目錄失敗! rootetcyangfxb# . . 第四章第四章 程序運(yùn)行結(jié)果程序運(yùn)行結(jié)果 4.14.1 格式化格式化 和登錄界面和登錄界面 登錄后顯示幫助信息 ,進(jìn)入到用戶文件夾下,如圖 5 所示: 圖 5 格式化及登錄界面 4.24.2 lsls 命令命令-顯示當(dāng)前目錄下的文件和目錄顯示當(dāng)前目錄下的文件和目錄 rootetcyangfxb#ls . inode 6 . i
28、node 4 rootetcyangfxb# 4.34.3 logoutlogout 命令命令-注銷用戶注銷用戶 rootetc#logout 用戶名: 普通用戶無法進(jìn)入 admin 管理員目錄。 . . 第五章第五章 心得體會心得體會 操作系統(tǒng)課程設(shè)計是本課程重要的實(shí)踐教學(xué)環(huán)節(jié)。課程設(shè)計的目的,一方 面使學(xué)生更透徹地理解操作系統(tǒng)的基本概念和原理,使之由抽象到具體;另一 方面,通過課程設(shè)計加強(qiáng)學(xué)生的實(shí)驗(yàn)手段與實(shí)踐技能,培養(yǎng)學(xué)生獨(dú)立分析問題、 解決問題、應(yīng)用知識的能力和創(chuàng)新精神。與本課程的實(shí)驗(yàn)教學(xué)相比,課程設(shè)計 獨(dú)立設(shè)課,具有更多的學(xué)時,給學(xué)生更多自行設(shè)計、自主實(shí)驗(yàn)的機(jī)會,充分放 手讓學(xué)生真正培
29、養(yǎng)學(xué)生的實(shí)踐動手能力,全面提高學(xué)生的綜合素質(zhì)。 在設(shè)計的過程中遇到問題,可以說得是困難重重,遇到了過各種各樣的問 題,同時在設(shè)計的過程中發(fā)現(xiàn)了我們的不足之處,對以前所學(xué)過的知識理解得 不夠深刻,掌握得不夠牢固,不過在老師和同學(xué)們的幫助下設(shè)計終于順利完成 了,對給過我們幫助的所有同學(xué)和各位指導(dǎo)老師再次表示忠心的感謝! 參考文獻(xiàn)參考文獻(xiàn) 1 袁慶龍,候文義ni-p 合金鍍層組織形貌及顯微硬度研究 太原理工大學(xué)學(xué)報,2001,32(1): 51-53.(連續(xù)出版物:序號 主要責(zé)任者文獻(xiàn)題名j 刊名,出版年份,卷號(期號):起止頁碼) 2 劉國鈞,王連成圖書館史研究 北京:高等教育出版社,1979:1
30、5-18,31 (專著:序號 主要責(zé)任者文獻(xiàn)題名 出版地:出版者,出版年:起止頁碼 ) 3 孫品一高校學(xué)報編輯工作現(xiàn)代化特征 中國高等學(xué)校自然科學(xué)學(xué)報研究會科技編輯學(xué)論文 集(2)北京:北京師范大學(xué)出版社,1998:10-22 (論文集:序號 主要責(zé)任者文獻(xiàn)題名主 編論文集名出版地:出版者,出版年:起止頁碼 ) . . 附:源代碼附:源代碼 #include #include #include #include #include #include #define blocksiz 512/磁盤塊的大樣 #define datablknum 512/數(shù)據(jù)塊的數(shù)目 #define blkgrupn
31、um50/數(shù)據(jù)塊組包含多少數(shù)據(jù)塊 #define p_n_blocks 15/inode 節(jié)點(diǎn)中 指向數(shù)據(jù)塊的指針個數(shù) #definegroupnum datablknum/blkgrupnum+1 /數(shù)據(jù)塊組 組數(shù) #define dinodesiz 512/磁盤 i 結(jié)點(diǎn)區(qū)的大樣(空間 32512) #define dinodenum 32/磁盤 i 結(jié)點(diǎn)區(qū)的塊數(shù) #define sysopenfile 40 #define dirnum 32/一個目錄下的最多目錄和文件的總和數(shù) #define dirsiz 14/文件、目錄名的長度(字節(jié)) #define upwdsiz 15/秘密的長
32、度 #define unamsiz 15/用戶名的長度 #define pwdsizsizeof(struct pwd) /密碼結(jié)構(gòu)的長度 #define pwdnum blocksiz/pwdsiz/密碼數(shù)據(jù)空間的大樣(pwd 為單位) #define nofile 20/一個用戶最多可以打開的文件數(shù)目 #define nhino 128 #define usernum 10/用戶名的長度 #define dinodestart 4*blocksiz/i 結(jié)點(diǎn)區(qū)的開始地址-inodes table ,1 引導(dǎo) 2 超 塊 3block bitmap 4inode bitmap #define
33、 datastart (2+dinodenum)*blocksiz/數(shù)據(jù)區(qū)的開始地址 #definedatastartno 36/數(shù)據(jù)區(qū)開始指針 /* di._mode */ #define dimode_empty00000/*可以用的空間*/ #define dimode_file00001 #define dimode_dir 00002 #define dimode_passwd 00004 #define dimode_system 00040/*系統(tǒng)文件*/ #define dimode_read 00010 /* read 和該數(shù)與操作后得到的是可以讀該文件的 用戶組*/ #de
34、fine dimode_write 00020 /* write */ #define dimode_exicute 01000 /* exicute */ #define dimode_admin00100/*管理員權(quán)限*/ #define dimode_share00200/*不需要權(quán)限*/ /*組*/ #define grup_00/管理員組 . . #define grup_11 #define grup_22 #define grup_44 /* 文件系統(tǒng) 數(shù)據(jù)結(jié)構(gòu) */ /* 磁盤 i 結(jié)點(diǎn)結(jié)構(gòu), */ struct inode / chardi_namedirsiz; unsig
35、ned _int16 di_ino;/*磁盤 i 節(jié)點(diǎn)標(biāo)識*/ unsigned _int16 di_number;/*關(guān)聯(lián)文件數(shù),當(dāng)為 0 時表示刪除文件*/ unsigned _int16 di_mode;/*存取權(quán)限*/ unsigned _int16 di_uid; /*磁盤 i 節(jié)點(diǎn)用戶 id*/ unsigned _int16 di_gid; /*磁盤 i 節(jié)點(diǎn)權(quán)限組 id*/ /1 管理員組 2 用戶組 unsigned _int32 di_size; /*文件大樣*/ unsigned _int32 di_ctime; /* creation time */ unsigned
36、_int32 di_mtime; /* modification time */ unsigned _int16 di_blockp_n_blocks; /* 一組 block 指針 */ ; /* 目錄項結(jié)構(gòu) */ struct direct char d_namedirsiz; /*目錄名(14 字節(jié))*/ _int16 d_ino;/*目錄號*/ ; /* 超級快結(jié)構(gòu) */ struct super_block unsigned _int16 s_inodes_count; /* inodes 計數(shù) */ unsigned _int16 s_blocks_count; /* blocks
37、 計數(shù) */ unsigned _int16 s_r_blocks_count; /* 保留的 blocks 計數(shù) */ unsigned _int16 s_free_blocks_count; / 空閑的 blocks 計數(shù) unsigned _int16 s_free_inodes_count; /* 空閑的 inodes 計數(shù) */ unsigned _int16 s_free_blocks_groupgroupnum;/新增 一個數(shù)組來記錄每個數(shù) 據(jù)塊組中的空閑數(shù)據(jù)塊計數(shù) unsigned _int16 s_first_data_block; /* 第一個數(shù)據(jù) block */ uns
38、igned _int16 s_log_block_size; /* block 的大樣 */ unsigned _int16 s_blocks_per_group; /* 每 block group 的 block 數(shù)量 */ unsigned _int16 s_inodes_per_group; /* 每 block group 的 inode 數(shù)量 */ ; /* . . 用戶密碼 */ struct pwd unsigned _int8 p_uid; unsigned _int8 p_gid; char usernameunamsiz;/*用戶名 新加的*/ char passwordu
39、pwdsiz; ; /* 目錄結(jié)構(gòu) */ struct dir struct direct directdirnum; _int16 size; ; /全局變量 unsigned _int8 di_bitmapdinodenum;/ 硬盤 inode 節(jié)點(diǎn)位圖 1 表示已使用 0 表示未 使用 unsigned _int8bk_bitmapdatablknum;/ 數(shù)據(jù)塊 block 位圖 struct super_block filsys;/超級塊 struct pwd pwdpwdnum; /struct user userusernum; /int usernum; file *fd;/
40、文件指針 struct inode *cur_inode;/i 節(jié)點(diǎn)當(dāng)前目錄指針 /struct dinode *dinodef;/全局硬盤節(jié)點(diǎn)指針 struct inode *inodetemp;/i 節(jié)點(diǎn)指針 /struct inode *inodetemp2; const char fsystemname20=linux.ext2; /模擬硬盤的文件名 struct direct dir_bufblocksiz / sizeof(struct direct);/目錄數(shù)組 char cmdhead20;/cmd 的頭 表示所在哪個文件夾、 int i_lock=0;/inode 位圖鎖 可
41、能會多線程 int b_lock=0;/block 位圖鎖 struct pwd *cur_user; /*全局函數(shù)*/ extern int format();/格式化磁盤 extern int install();/啟動,安裝文件系統(tǒng) struct inode * read_inode(int);/install 里面讀取文件 dinode struct direct * read_dir_data(int);/讀取存儲文件夾的物理塊 extern void showdir();/命令 dir int enterdir(char);/進(jìn)入某個文件夾 命令- cd 文件名 int fd_di
42、rfile(char);/查找當(dāng)前目錄里的文件 沒找到返回-1 找到返回 inode 號 . . int iscmd(char);/判斷是否兩個字符串的命令 void cmd_up(char,char);/兩個字符串的命令 int creat(char);/創(chuàng)建文件 void changeinode();/交換指針 char * readfile(char);/讀取文件 int cdir(char);/創(chuàng)建文件夾 void showbitmap();/顯示位圖 int deletefd(char);/刪除文件 int editfile(char);/編輯文件 int rename(char);
43、/重命名 void showhelp();/命令幫助 void login(); void logout(); int access();/權(quán)限判斷 /*磁盤 i 節(jié)點(diǎn)的分配與釋放(當(dāng)一個新文件被建立的時候,在給該文件分配磁盤存儲區(qū)之 前, 應(yīng)為該文件分配存放該文件說明信息的磁盤 i 節(jié)點(diǎn),當(dāng)從文件系統(tǒng)中刪除某個文件時, 應(yīng)首先刪除它的磁盤 i 節(jié)點(diǎn)項。 )*/ intialloc();/*開辟一個空閑的 i 節(jié)點(diǎn),返回 i 節(jié)點(diǎn)*/ /磁盤塊分配與釋放函數(shù) intballoc(int);/申請硬盤空間 void showaccess(char strname20); /內(nèi)存 i 節(jié)點(diǎn)的獲取與
44、釋放 /extern struct inode *iget(unsigned int);/*獲取 hino 位置的 i 節(jié)點(diǎn),返回 i 節(jié)點(diǎn)指針*/ /extern void iput(struct inode* );/*將 i 節(jié)點(diǎn) 釋放或是寫入磁盤*/ /#endif void main() char str10; char strname10; char c; printf(是否格式化?); scanf(%c, fflush(stdin); if(c=y) if(!format() return; printf(格式化完畢!n); if(!install() . . return; pr
45、intf(login.n); login(); showhelp(); printf(%s,cmdhead); while(1) scanf(%s, if(strcmp(str,exit)=0) fclose(fd); return; else if(strcmp(str,dir)=0) showdir(); else if(strcmp(str,bit)=0) showbitmap(); else if(strcmp(str,help)=0) showhelp(); else if(strcmp(str,logout)=0) logout(); else if(iscmd(str) scan
46、f(%s, cmd_up(str,strname); else printf(錯誤命令!n); printf(%s,cmdhead); /-格式化- int format() . . struct pwd passwd blocksiz/pwdsiz; int i; /*creat the file system file */ fd = fopen (fsystemname, wb);/*讀寫創(chuàng)建一個二進(jìn)制文件*/ if(fd=null) printf(硬盤模擬文件創(chuàng)建失敗!n); return 0; /超級塊 filsys.s_inodes_count=dinodenum ; /* ino
47、des 計數(shù) */ filsys.s_blocks_count=datablknum; /* blocks 計數(shù) */ filsys. s_r_blocks_count=0; /* 保留的 blocks 計數(shù) */ filsys. s_free_blocks_count=datablknum-5; /* 空閑的 blocks 計數(shù) */ filsys.s_free_blocks_group0=50-5;/第一個 block group 已經(jīng)被用了 5 個 for(i=1;igroupnum-1;i+) filsys.s_free_blocks_groupi=50; /后面的 group 全部空
48、閑 /printf(block group %d 空閑個數(shù)為%dn,i,filsys.s_free_blocks_groupi); filsys.s_free_blocks_groupgroupnum-1=12;/最后一個 block 組 只有 12 個 block filsys.s_free_inodes_count=dinodenum-5; /* 空閑的 inodes 計數(shù) */ filsys.s_first_data_block=datastartno; /* 第一個數(shù)據(jù) block 也就是*/ filsys.s_log_block_size=blocksiz; /* block 的大樣
49、 */ filsys.s_blocks_per_group=blkgrupnum; /* 每 block group 的 block 數(shù)量 */ filsys.s_inodes_per_group=0; /每 block group 的 inode 數(shù)量 暫未使用 fseek(fd, blocksiz, seek_set); fwrite ( /初始化 dinode 位圖 block 位圖 di_bitmap0=1; di_bitmap1=1; di_bitmap2=1;/前三個 inode 分別被 root etc 用戶 passwd 文件占用 di_bitmap3=1; di_bitmap
50、4=1; bk_bitmap0=1; bk_bitmap1=1; bk_bitmap2=1;/前三個 inode 分別被 root etc 用戶 passwd 文件占用 bk_bitmap3=1; bk_bitmap4=1; for(i=5;idinodenum;i+) di_bitmapi=0; bk_bitmapi=0; . . for(;idi_name,/); ininode-di_ino=0;/i 節(jié)點(diǎn)標(biāo)志 ininode-di_number=3;/關(guān)聯(lián) 3 個文件夾 ininode-di_mode=dimode_dir|dimode_system;/0 為目錄 ininode-di
51、_uid=1;/用戶 id 第一個用戶 ininode-di_gid=1;/組 id 管理員組 ininode-di_size=0;/為目錄 ininode-di_ctime=0; /* creation time */ ininode-di_mtime=0; /* modification time */ ininode-di_block0=0;/所占物理塊號 后 3 塊分別是 一級指針,二級指針,3 級指針 fseek(fd,dinodestart, seek_set); fwrite(ininode,sizeof(struct inode), 1, fd); strcpy(dir_buf
52、0.d_name, .); dir_buf0.d_ino= 0;/當(dāng)前目錄的 dinode 號 strcpy(dir_buf1.d_name,.); dir_buf1.d_ino= 0;/主目錄的上級目錄還是自己 strcpy(dir_buf2.d_name, etc); dir_buf2.d_ino = 1;/etc 目錄 fseek(fd, datastart, seek_set); fwrite(dir_buf, blocksiz, 1, fd); /etc 目錄 ininode-di_ino=1;/i 節(jié)點(diǎn)標(biāo)志 ininode-di_number=5;/ ininode-di_gid=
53、1;/組 id ininode-di_block0=1;/所占物理塊號 后 3 塊分別是 一級指針,二級指針,3 級指針 fseek(fd, dinodestart+blocksiz, seek_set); fwrite(ininode,sizeof(struct inode), 1, fd); . . strcpy (dir_buf0.d_name, .); dir_buf0.d_ino = 1; strcpy(dir_buf1.d_name, .); dir_buf1.d_ino = 0; strcpy(dir_buf2.d_name, passwd); dir_buf2.d_ino =
54、2; strcpy(dir_buf3.d_name, admin); dir_buf3.d_ino = 3; strcpy(dir_buf4.d_name, xiao); dir_buf4.d_ino = 4; fseek(fd, datastart+blocksiz, seek_set); fwrite (dir_buf, blocksiz,1,fd); / admin 目錄 ininode-di_ino=3;/i 節(jié)點(diǎn)標(biāo)志 ininode-di_number=2;/ ininode-di_gid=0;/組 id ininode-di_block0=3;/所占物理塊號 后 3 塊分別是 一級
55、指針,二級指針,3 級指針 fseek(fd, dinodestart+blocksiz*3, seek_set); fwrite(ininode,sizeof(struct inode), 1, fd); strcpy (dir_buf0.d_name, .); dir_buf0.d_ino = 3; strcpy(dir_buf1.d_name, .); dir_buf1.d_ino = 1; fseek(fd, datastart+blocksiz*3, seek_set); fwrite (dir_buf, blocksiz,1,fd); / xiao 目錄 ininode-di_in
56、o=4;/i 節(jié)點(diǎn)標(biāo)志 ininode-di_number=2;/ ininode-di_uid=2;/用戶 id ininode-di_gid=1;/組 id ininode-di_block0=4;/所占物理塊號 后 3 塊分別是 一級指針,二級指針,3 級指針 fseek(fd, dinodestart+blocksiz*4, seek_set); fwrite(ininode,sizeof(struct inode), 1, fd); strcpy (dir_buf0.d_name, .); dir_buf0.d_ino =4; strcpy(dir_buf1.d_name, .);
57、dir_buf1.d_ino = 1; fseek(fd, datastart+blocksiz*4, seek_set); fwrite (dir_buf, blocksiz,1,fd); /用戶 passwd 文件 passwd0.p_uid= 1; passwd0.p_gid = grup_0; /管理員 strcpy(passwd0.username, admin); strcpy(passwd0.password, admin); . . passwd1.p_uid= 2; passwd1.p_gid = grup_1; strcpy(passwd1.username, xiao);
58、 strcpy(passwd1.password, xiao); for (i=2; idi_ino=2;/i 節(jié)點(diǎn)標(biāo)志 ininode-di_number=2;/ ininode-di_mode=dimode_passwd|dimode_system;/ ininode-di_uid=1;/用戶 id 第一個用戶 ininode-di_gid=1;/組 id 管理員組 ininode-di_size=blocksiz;/大樣 ininode-di_ctime=0; /* creation time */ ininode-di_mtime=0; /* modification time */
59、ininode-di_block0=2;/所占物理塊號 后 3 塊分別是 一級指針,二級指針,3 級指針 fseek(fd, dinodestart+blocksiz*2, seek_set); fwrite(ininode,sizeof(struct inode), 1, fd); fclose(fd); free(ininode); return 1; intinstall() /struct pwd passwd blocksiz/pwdsiz;/用戶 passwd 數(shù)組 int i; /struct inode *inode_temp; printf(install.n); fd =
60、fopen (fsystemname, rb+);/ 只讀方式打開硬盤模擬文件 if(fd=null) printf(文件打開失敗n); return 0; fseek(fd,blocksiz,seek_set); fread( inodetemp=(struct inode *)malloc(sizeof (struct inode); if(!inodetemp) . . printf(inodetemp 內(nèi)存分配失敗!n); return 0; cur_inode=(struct inode *)malloc(sizeof (struct inode); if(!cur_inode) p
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 斜屋面掛瓦施工方案
- 寧波標(biāo)志桿施工方案
- 1000億天然氣合同范例
- 橋梁臨建護(hù)欄施工方案
- 人教部編版小學(xué)語文作:-讓生活更美好精簡教案多篇
- 中建各種內(nèi)部合同范例
- 四川2025年四川中煙工業(yè)有限責(zé)任公司招聘170人筆試歷年參考題庫附帶答案詳解
- 住宅采暖改造合同范例
- 停薪留崗合同范例
- 臨時代管合同范例
- GB/T 5750.2-2023生活飲用水標(biāo)準(zhǔn)檢驗(yàn)方法第2部分:水樣的采集與保存
- 《非暴力溝通》分享
- 企業(yè)人力資源管理師(三級)人力資源管理師考試題庫及答案
- 醫(yī)院院長在2023年全院職工代表大會閉幕會上的講話
- 班主任基本功大賽模擬情景答辯主題(含解析)
- 護(hù)理文書書寫規(guī)范PDCA
- 粉煤灰檢測報告
- 《Python程序設(shè)計(第3版)》教學(xué)大綱(參考)
- 廣西的地理發(fā)展介紹ppt下載
- 深靜脈血栓形成的診斷和治療指南(第三版)
- 大班數(shù)學(xué)《算式與算式比大小》
評論
0/150
提交評論