版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、設(shè)計(jì)時(shí)間: 2011-1-5至2011-1-7 專(zhuān)業(yè)年級(jí):08計(jì)科4班 姓名: 一.設(shè)計(jì)目的:通過(guò)操作系統(tǒng)內(nèi)其中一個(gè)子系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn),掌握l(shuí)inux文件系統(tǒng)的基本原理、結(jié)構(gòu)和實(shí)現(xiàn)方法,掌握l(shuí)inux文件系統(tǒng)中文件的建立、打開(kāi)、讀/寫(xiě)、執(zhí)行、屬性等系統(tǒng)調(diào)用的使用,學(xué)會(huì)設(shè)計(jì)簡(jiǎn)單的文件系統(tǒng)并實(shí)現(xiàn)一組操作,以及學(xué)習(xí)文件系統(tǒng)的系統(tǒng)調(diào)用命令,提高對(duì)文件系統(tǒng)實(shí)現(xiàn)功能的理解和掌握。同時(shí),掌握操作系統(tǒng)設(shè)計(jì)的方法與技巧,增強(qiáng)系統(tǒng)軟件設(shè)計(jì)的實(shí)際工作能力。二.設(shè)計(jì)內(nèi)容:為linux 設(shè)計(jì)一個(gè)簡(jiǎn)單的二級(jí)文件系統(tǒng)。本文件系統(tǒng)采用類(lèi)似dos系統(tǒng)的文件管理方式,每次調(diào)用該文件系統(tǒng)時(shí),首先申請(qǐng)一定的內(nèi)存空間,然后對(duì)該內(nèi)存空間
2、進(jìn)行分配。將申請(qǐng)到的空間劃分為目錄區(qū),文件區(qū);采用位示圖進(jìn)行空間管理,盤(pán)塊的分配使用顯示鏈接(fat表)的方式。每次調(diào)用該文件系統(tǒng)時(shí)自動(dòng)為其分配空間,并將上次操作的結(jié)果從硬盤(pán)上調(diào)入內(nèi)存;當(dāng)結(jié)束調(diào)用時(shí)則將操作的結(jié)果重新存入硬盤(pán),以便下次調(diào)用。(每次使用都會(huì)自動(dòng)搜索文件系統(tǒng),以此確定是否是第一次使用;若是則格式化生成文件系統(tǒng),否則讀取已存在的文件系統(tǒng)。)三設(shè)計(jì)過(guò)程1、 實(shí)現(xiàn)功能該系統(tǒng)具備下列功能:login 用戶(hù)登錄 logout 注銷(xiāo)mkdir/md 創(chuàng)建目錄 rmdir/rd 刪除目錄cd/cd . 修改目錄creat 創(chuàng)建文件open 打開(kāi)文件dir 顯示當(dāng)前目錄和文件write 讀文件 d
3、elete 刪除文件close 關(guān)閉文件2、 添加功能(1) 制作了一個(gè)“操作命令符”列表框,說(shuō)明接下來(lái)如何操作,這樣有利于更好地閱讀、操作和運(yùn)行程序,使不懂得程序代碼的人也可以運(yùn)行該程序,更好地理解該程序?qū)崿F(xiàn)的功能。(2) 在命令解釋層函數(shù)cmdexp()里加了一些選擇和操作功能,增加程序?qū)崿F(xiàn)的功能,如原來(lái)程序只有顯示當(dāng)前目錄和文件、創(chuàng)建目錄和修改目錄的功能,把它拓展到系統(tǒng)所要求的全部功能,并在原有的程序的基礎(chǔ)上進(jìn)行相應(yīng)的修改,使程序更加完善。3、 設(shè)計(jì)思路(1) 要將文件存儲(chǔ)在磁盤(pán)上,必須為之分配相應(yīng)的存儲(chǔ)空間,并對(duì)文件存儲(chǔ)空間進(jìn)行管理,為了簡(jiǎn)化對(duì)文件的訪(fǎng)問(wèn)和共享,還應(yīng)設(shè)置相應(yīng)的用戶(hù)文件描
4、述表及文件表。 文件卷的組織unix中,把每個(gè)磁盤(pán)(帶)看作是一個(gè)文件卷,每個(gè)文件卷上可存放一個(gè)具有獨(dú)立目錄結(jié)構(gòu)的文件系統(tǒng)。一個(gè)文件卷包含許多物理塊,并按塊號(hào)排列如下圖:0# 1# 2# 3# k# k+1# n# 其中,0#塊用于系統(tǒng)引導(dǎo)或空閑,1#為超級(jí)塊(superblock),存放文件卷的資源管理信息,如整個(gè)文件卷的盤(pán)塊數(shù)、磁盤(pán)索引結(jié)點(diǎn)的盤(pán)塊數(shù)、空閑盤(pán)塊號(hào)棧及指針等。2#k#存放磁盤(pán)索引結(jié)點(diǎn)。每個(gè)索引結(jié)點(diǎn)64b,第k+1#n#存放文件數(shù)據(jù)。 空閑盤(pán)塊的組織 unix采用成組鏈接法組織空閑盤(pán)塊。它將若干個(gè)空閑盤(pán)塊劃歸一個(gè)組,將每組中所有盤(pán)塊號(hào)存放在其前一組的第一個(gè)空閑盤(pán)塊中,而第一組中所
5、有空閑盤(pán)塊號(hào)放入超級(jí)塊的空閑盤(pán)塊號(hào)棧中。 例: 超級(jí)塊表 10910610310095211208205202 310307304301空閑盤(pán)塊的分配與回收內(nèi)核要從文件系統(tǒng)中分配一盤(pán)塊時(shí),先檢查超級(jí)塊空閑盤(pán)塊號(hào)棧是否已上鎖。是則調(diào)用sleep睡眠,否則將超級(jí)塊中空閑盤(pán)塊棧棧頂盤(pán)塊號(hào)分配出去?;厥諘r(shí),若空閑盤(pán)塊號(hào)棧未滿(mǎn),直接將回收盤(pán)塊編號(hào)記入空閑盤(pán)塊號(hào)棧中。若回收時(shí)棧已滿(mǎn),須先將棧中的所有空閑盤(pán)塊號(hào)復(fù)制到新回收的盤(pán)塊中,再將新回收盤(pán)塊的編號(hào)作為新棧的棧底塊號(hào)進(jìn)棧。(2) unix中,為了加速對(duì)文件目錄的查找,將文件名和文件說(shuō)明分開(kāi),由文件說(shuō)明形成一個(gè)稱(chēng)為索引結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu),而相應(yīng)的文件目錄項(xiàng)則只
6、由文件符號(hào)名和指向索引結(jié)點(diǎn)的指針構(gòu)成。對(duì)目錄的管理應(yīng)包括的功能有:對(duì)索引結(jié)點(diǎn)的管理:每個(gè)文件都有一唯一的磁盤(pán)索引結(jié)點(diǎn)(di_node)。文件被打開(kāi)后,還有一個(gè)內(nèi)存索引結(jié)點(diǎn)(i_node)。創(chuàng)建一新文件時(shí),就為之建立一個(gè)磁盤(pán)索引結(jié)點(diǎn),以將文件的有關(guān)信息記入其中,并將用戶(hù)提供的文件名和磁盤(pán)索引結(jié)點(diǎn)號(hào)一并組成一個(gè)新目錄項(xiàng),記入其父目錄文件中。文件被撤消時(shí),系統(tǒng)要回收該文件的磁盤(pán)索引結(jié)點(diǎn),從其父目錄中刪除該目錄項(xiàng)。隨著文件的打開(kāi)與關(guān)閉,系統(tǒng)還要為之分配和回收內(nèi)存索引結(jié)點(diǎn)。磁盤(pán)索引結(jié)點(diǎn)中,包含有關(guān)文件的下述一系列信息:文件模式di_mode、文件所有者用戶(hù)標(biāo)識(shí)符di_uid、同組用戶(hù)標(biāo)識(shí)符di_gid、
7、文件長(zhǎng)度di_size、文件的聯(lián)接計(jì)數(shù)di_nlink、文件的物理地址di_addr、文件的訪(fǎng)問(wèn)時(shí)間di_atime、文件的修改時(shí)間di_mtime和文件的建立時(shí)間di_citime。 內(nèi)存索引結(jié)點(diǎn):文件被打開(kāi)后,系統(tǒng)為它在內(nèi)存索引結(jié)點(diǎn)表區(qū)中建一內(nèi)存索引結(jié)點(diǎn),以方便用戶(hù)和系統(tǒng)對(duì)文件的訪(fǎng)問(wèn)。磁盤(pán)索引結(jié)點(diǎn)的分配與回收分配過(guò)程ialloc:當(dāng)內(nèi)核創(chuàng)建一新文件時(shí),要為之分配一空閑磁盤(pán)i結(jié)點(diǎn)。如分配成功,便再分配一內(nèi)存i結(jié)點(diǎn)。其過(guò)程如下:檢查超級(jí)塊上鎖否。由于超級(jí)塊是臨界資源,諸進(jìn)程必須互斥地訪(fǎng)問(wèn)它,故在進(jìn)入ialloc后,要先檢查它是否已上鎖,若是則睡眠等待;檢查i結(jié)點(diǎn)??辗?。若i結(jié)點(diǎn)棧中已無(wú)空閑結(jié)點(diǎn)
8、編號(hào),則應(yīng)從盤(pán)中再調(diào)入一批i結(jié)點(diǎn)號(hào)進(jìn)棧。若盤(pán)中已無(wú)空閑i結(jié)點(diǎn),則出錯(cuò)處理,返回;從空閑i結(jié)點(diǎn)編號(hào)棧中分配一i結(jié)點(diǎn),并對(duì)它初始化、填寫(xiě)有關(guān)文件的屬性;分配內(nèi)存i結(jié)點(diǎn);將磁盤(pán)i結(jié)點(diǎn)總數(shù)-1,置超級(jí)塊修改標(biāo)志,返回。 回收過(guò)程ifree:當(dāng)刪除文件時(shí),應(yīng)回收其所占用的盤(pán)塊及相應(yīng)的磁盤(pán)i結(jié)點(diǎn)。具體有:檢查超級(jí)塊上鎖否。若是,直接返回,即不把本次回收的i結(jié)點(diǎn)號(hào)記入空閑i結(jié)點(diǎn)編號(hào)棧中;檢查i結(jié)點(diǎn)編號(hào)棧滿(mǎn)否。若已滿(mǎn),無(wú)法再裝入新回收的i結(jié)點(diǎn)號(hào),立即返回,若未滿(mǎn),便將回收的i結(jié)點(diǎn)編號(hào)進(jìn)棧,并使當(dāng)前空閑結(jié)點(diǎn)數(shù)+1;置超級(jí)塊修改標(biāo)志,返回。 內(nèi)存索引結(jié)點(diǎn)的分配與回收 分配過(guò)程iget:雖然iget用在打開(kāi)文件時(shí)為
9、之分配i結(jié)點(diǎn),但由于允許文件被共享,因此,如果一文件已被其他用戶(hù)打開(kāi)并有了內(nèi)存i結(jié)點(diǎn),則此時(shí)只需將i結(jié)點(diǎn)中的引用計(jì)數(shù)+1。如果文件尚未被任何用戶(hù)(進(jìn)程)打開(kāi),則由iget過(guò)程為該文件分配一內(nèi)存i結(jié)點(diǎn),并調(diào)用bread過(guò)程將其磁盤(pán)i結(jié)點(diǎn)的內(nèi)容拷貝到內(nèi)存i結(jié)點(diǎn)中并進(jìn)行初始化。 回收過(guò)程iput:進(jìn)程要關(guān)閉某文件時(shí),須調(diào)用iput過(guò)程,先對(duì)該文件內(nèi)存i結(jié)點(diǎn)中的引用計(jì)數(shù)-1。若結(jié)果為0,便回收該內(nèi)存i結(jié)點(diǎn),再對(duì)該文件的磁盤(pán)i結(jié)點(diǎn)中的連接計(jì)數(shù)減1,若其結(jié)果也為0,便刪除此文件,并回收分配給該文件的盤(pán)塊和磁盤(pán)i結(jié)點(diǎn)。(3)主要文件操作的處理過(guò)程打開(kāi)文件open:檢索目錄,內(nèi)核調(diào)用namei從根目錄或從當(dāng)前
10、目錄,沿目錄樹(shù)查找指定的索引結(jié)點(diǎn)。若未找到或該文件不允許存取,則出錯(cuò)處理返回null,否則轉(zhuǎn)入下一步;分配內(nèi)存索引結(jié)點(diǎn),如果該文件已被其它用戶(hù)打開(kāi),只需對(duì)上一步中所找到的i結(jié)點(diǎn)引用計(jì)數(shù)+1,否則應(yīng)為被打開(kāi)文件分配一內(nèi)存i結(jié)點(diǎn),并調(diào)用磁盤(pán)讀過(guò)程將磁盤(pán)i結(jié)點(diǎn)的內(nèi)容拷貝到內(nèi)存i結(jié)點(diǎn)中,并設(shè)置i.count=1;分配文件表項(xiàng),為已打開(kāi)的文件分配一文件表項(xiàng),使表項(xiàng)中的f.inode 指向內(nèi)存索引結(jié)點(diǎn);分配用戶(hù)文件描述表項(xiàng)。 創(chuàng)建文件creat:核心調(diào)用namei,從根目錄或當(dāng)前目錄開(kāi)始,逐級(jí)向下查找指定的索引結(jié)點(diǎn)。此時(shí)有以下二種情況:重寫(xiě)文件,namei找到了指定i結(jié)點(diǎn),調(diào)用free釋放原有文件的磁盤(pán)塊
11、。此時(shí)內(nèi)核忽略用戶(hù)指定的許可權(quán)方式和所有者,而保持原有文件的存取權(quán)限方式和文件主。最后打開(kāi)。新建,namei未找到。調(diào)用ialloc,為新創(chuàng)建的文件分配一磁盤(pán)索引結(jié)點(diǎn),并將新文件名及所分配到的i結(jié)點(diǎn)編號(hào),寫(xiě)入其父目錄中,建立一新目錄項(xiàng)。利用與open相同的方式,把新文件打開(kāi)。 關(guān)閉文件close:根據(jù)用戶(hù)文件描述符fd,從相應(yīng)的用戶(hù)文件描述符表項(xiàng)中,獲得指向文件表項(xiàng)的指針fp,再對(duì)該文件表項(xiàng)中的f.count-1。4、 算法和流程圖(1)部分主要的算法:主函數(shù):#include #include filsys.hstruct hinode hinodenhino;/* 查找內(nèi)存i節(jié)點(diǎn)的hash
12、表 */struct filsys filsys;/* 超級(jí)塊數(shù)據(jù)結(jié)構(gòu) */struct inode * cur_path_inode; /* 文件系統(tǒng)(內(nèi)存i節(jié)點(diǎn))數(shù)據(jù)結(jié)構(gòu) */struct user userusernum; /* 用戶(hù)打開(kāi)表數(shù)據(jù)結(jié)構(gòu) */struct file sys_ofilesysopenfile; /* 系統(tǒng)打開(kāi)表數(shù)據(jù)結(jié)構(gòu) */struct direct cur_directnofile;/* 目錄數(shù)據(jù)結(jié)構(gòu)路徑 */unsigned short cur_dir_id;/* 當(dāng)前目錄指針 */char cur_path_namedirsiz;file *fd; /*
13、本系統(tǒng)的所有文件指針 */void main()char reg_or_log; / 注冊(cè)/登錄變量名char buf50,buf250,buf350;int i;cur_dir_id = 0;printf( nttwelcome to this system!n );printf( initializing.n );fd = fopen( filesystem.dat, r+b );if( fd != null )/* 文件已經(jīng)存在,不用格式化 */printf( installing.n );init();/* 讀取磁盤(pán)數(shù)據(jù) */else/* 文件已經(jīng)存在,要進(jìn)行格式化 */if( for
14、mat() = 0 )/* 格式化 */return;/* 格式化不成功 */printf( installing.n );init();/* 讀取磁盤(pán)數(shù)據(jù) */again:printf( ndo you want to register or login? (r/l) );while( 1 )reg_or_log = getch();/* 注冊(cè)新用戶(hù) */if( reg_or_log = r ) | ( reg_or_log = r )printf( %cn, reg_or_log );reg();goto again;/* 登陸已有用戶(hù) */else if( reg_or_log = l
15、) | ( reg_or_log = l )printf( %cn, reg_or_log );if( login() = 0) /* 登陸不成功 */goto again;break;strcpy( cur_directcur_dir_id.d_name, / );cur_directcur_dir_id.d_ino = rootdir;strcpy( cur_path_name, / );printf(n t操作命令符n); for (i=0; i=35; i+) printf( *); printf(n * );printf( 1-dir/l/ls 顯示當(dāng)前目錄和文件 ); printf
16、(2-cd .退回到上一級(jí)目錄 ); printf(*n);printf(n * ); printf( 3-cd 文件名 顯示文件名目錄 );printf(4-mkdir/md 文件名 創(chuàng)建目錄 );printf(*n);printf(n * );printf( 5-rmdir/rd 文件名 刪除目錄 );printf(6-mkfile/mf 文件名 創(chuàng)建文件 );printf(*n);printf(n * );printf( 7-open 文件名 打開(kāi)文件 );printf(8-write 文件名 寫(xiě)文件 );printf(*n);printf(n * );printf( 9-read 文件
17、名 讀文件 );printf( 10-close 文件名 關(guān)閉文件 );printf(*n);printf(n * );printf( 11-delete 文件名 刪除文件 ); printf( 12-logout 注銷(xiāo) ); printf(*n); for (i=0; i=35; i+) printf( *);printf(n);while(1)if( cmdexp() = 1 )break;halt();命令解釋層函數(shù):#include #include #include filsys.hchar input_buf20;/* 命令行輸入緩沖區(qū) */static char str20;in
18、t over;/* 命令行結(jié)束標(biāo)記 */int fd1;int i,j;/* 命令解釋層函數(shù) */int cmdexp()over = 0;printf(%slocalhost%s$ , useruser_id.u_name, cur_path_name);getcmd();/* 顯示當(dāng)前目錄 */if( strcmp( input_buf, dir ) = 0 ) | ( strcmp( input_buf, l ) = 0 ) | ( strcmp( input_buf, ls ) = 0 )_dir();clearbuf();return 0;/* 改變當(dāng)前目錄 */if( strcmp
19、( input_buf, cd ) = 0 )getcmd(); /* 取得命令 */chdir ( input_buf ); /改變當(dāng)前目錄用函數(shù)clearbuf();return 0;/* 創(chuàng)建目錄(建立子目錄) */if( strcmp( input_buf, mkdir ) = 0 ) |( strcmp( input_buf, md ) = 0 )if( over )printf( 請(qǐng)?jiān)趍kdir后輸入要?jiǎng)?chuàng)建的目錄名n );clearbuf();return 0;getcmd();if( input_buf0 = 0 )printf( 請(qǐng)?jiān)趍kdir后輸入要?jiǎng)?chuàng)建的目錄名n );cle
20、arbuf();return 0;mkdir( input_buf );while(!over)getcmd();if( input_buf0 != 0 )mkdir( input_buf );clearbuf();return 0;if( strcmp( input_buf, rmdir ) = 0 ) | ( strcmp( input_buf, rd ) = 0 )if( over )printf( 請(qǐng)?jiān)趓mdir后輸入要?jiǎng)h除的目錄名 );clearbuf();return 0;getcmd();if( input_buf0 = 0 )printf( 請(qǐng)?jiān)趓mdir后輸入要?jiǎng)h除的目錄名n
21、 );clearbuf();return 0;rmdir( input_buf );while( !over )getcmd();if( input_buf0 != 0 )rmdir( input_buf );clearbuf();return 0;if( strcmp( input_buf, mkfile ) = 0 | ( strcmp( input_buf, mf ) = 0 )if( over )printf( 請(qǐng)?jiān)趍kfile后輸入要?jiǎng)?chuàng)建的文件名n );clearbuf();return 0;getcmd();if( input_buf0 = 0 )printf( 請(qǐng)?jiān)趍kfile后
22、輸入要?jiǎng)?chuàng)建的文件名n );clearbuf();return 0;creat( input_buf,01777);while(!over)getcmd();if( input_buf0 != 0 )creat( input_buf,01777);clearbuf();return 0;if( strcmp( input_buf, open ) = 0 )if( over )printf( 請(qǐng)?jiān)趏pen后輸入要打開(kāi)的文件名n );clearbuf();return 0;getcmd();if( input_buf0 = 0 )printf( 請(qǐng)?jiān)趏pen后輸入要打開(kāi)的文件名n );clearbu
23、f();return 0;open( input_buf,0004);while(!over)getcmd();if( input_buf0 != 0 )open( input_buf,0004);clearbuf();return 0;if( strcmp( input_buf, write ) = 0 )if( over )printf( 請(qǐng)?jiān)趙rite后輸入要執(zhí)行“寫(xiě)”操作的文件名n );clearbuf();return 0;getcmd();if( input_buf0 = 0 )printf( 請(qǐng)?jiān)趙rite后輸入要執(zhí)行“寫(xiě)”操作的文件名n );clearbuf();return
24、0; fd1=creat( input_buf,01777);i=write(fd1,str,512);printf(請(qǐng)輸入你要寫(xiě)的內(nèi)容:);for(j=0;ji;i+)scanf(%c,&stri);if( stri = n )break;while(!over)getcmd();if( input_buf0 != 0 )fd1=creat( input_buf,01777);i=write(fd1,str,512);printf(請(qǐng)輸入你要寫(xiě)的內(nèi)容:);for(j=0;ji;i+)scanf(%c,&stri);if( stri = n )break;clearbuf();return 0
25、;if( strcmp( input_buf, close ) = 0 )if( over )printf( 請(qǐng)?jiān)赾lose后輸入要關(guān)閉的文件名n );clearbuf();return 0;getcmd();if( input_buf0 = 0 )printf( 請(qǐng)?jiān)赾lose后輸入要關(guān)閉的文件名n );clearbuf();return 0; fd1=creat( input_buf,01777);close(fd1);while(!over)getcmd();if( input_buf0 != 0 )fd1=creat( input_buf,01777);close(fd1);clear
26、buf();return 0;if( strcmp( input_buf, delete ) = 0 )if(over)printf( 請(qǐng)?jiān)赿elete后輸入要?jiǎng)h除的文件名n );clearbuf();return 0;getcmd();if( input_buf0 = 0 )printf( 請(qǐng)?jiān)赿elete后輸入要?jiǎng)h除的文件名n );clearbuf();return 0;_delete(input_buf);while(!over)getcmd();if( input_buf0 != 0 )_delete(input_buf);clearbuf();return 0;if( strcmp(
27、 input_buf, logout ) = 0 )clearbuf();return 1;/* 找不到該命令 */if( input_buf0 != 0 )printf( bash: %s command not foundn, input_buf );clearbuf();return 0;/* 取得命令 */getcmd()int i= 0;while( !over )input_bufi = getchar();if( input_bufi = )if( i = 0 )/* 命令行的開(kāi)始是空格,應(yīng)舍去 */i-;elseinput_bufi=0;break;elseif( input_
28、bufi = n )over = 1;input_bufi=0;break;i+;/* 清空緩沖區(qū) */clearbuf()while( !over )if( getchar() =n )break;文件系統(tǒng)格式化函數(shù):#include #include filsys.hint format() /文件系統(tǒng)格式化函數(shù)struct filsys aaa;struct inode * inode;struct user tempuserusernum;struct dinode dinode_buf;struct direct dir_bufblocksiz / directsiz;unsigne
29、d int block_bufblocksiz / sizeof( int );char * buf;int i, j, k;fd = fopen( filesystem.dat, w+b );/* 建立文件 */buf = (char * )malloc( 1024*1024 );/* 申請(qǐng)1m空間 */if( buf = null )/* 申請(qǐng)不成功,返回 */printf( nthe system file cant be created!n );return 0;/* 申請(qǐng)成功,把其空間寫(xiě)入filesystem.dat,使filesystem.dat為1m */fseek( fd, 0
30、, seek_set );fwrite( buf, 1, 1024*1024, fd );free ( buf );dinode_buf.di_mode = diempty;/* 設(shè)置磁盤(pán)i節(jié)點(diǎn)緩沖區(qū),diempty表示空閑 */fseek( fd, dinodestart, seek_set );for( i = 0; i i_mode = diempty;/* 第0塊不用 */iput( inode );inode = iget( 1 );/* 第1盤(pán)塊放用戶(hù)名表 */inode-i_number = 1;inode-i_mode = direg; /普通文件inode-i_size =
31、sizeof( struct user ) * usernum;inode-i_addr0 = 1;/* 用戶(hù)imacih是超級(jí)用戶(hù) */strcpy( tempuser0.u_name, imacih );strcpy( tempuser0.password, dgh123456 );tempuser0.u_default_mode = supermode;tempuser0.u_gid = 1;tempuser0.u_uid = 1;for( i = 1; i i_addr0, seek_set );fwrite( tempuser, 1, inode-i_size, fd );iput(
32、 inode );inode = iget( 2 );/* 第2盤(pán)塊用于存儲(chǔ)根目錄 */inode-i_number = 1;inode-i_mode = defaultmode | didir;inode-i_size = 2 * directsiz;inode-i_addr0 = 2;strcpy( dir_buf0.d_name, / );dir_buf0.d_ino = 2;strcpy( dir_buf1.d_name, / );dir_buf1.d_ino = 2;strcpy( dir_buf2.d_name, etc );dir_buf2.d_ino = 3;fseek( fd
33、, datastart + blocksiz * inode-i_addr0, seek_set );fwrite( dir_buf, 1, inode-i_size, fd );iput( inode );inode = iget( 2 );/* 2 etc dir id */inode-i_number = 1;inode-i_mode = defaultmode | didir;inode-i_size = 2 * directsiz;inode-i_addr0 = 2;/* 第3盤(pán)塊用于根目錄下的子目錄 */strcpy( dir_buf0.d_name, . );dir_buf0.d
34、_ino = 1;strcpy( dir_buf1.d_name, . );dir_buf1.d_ino = 2;fseek( fd, datastart + blocksiz * inode-i_addr0, seek_set );fwrite( dir_buf, 1, 2 * directsiz, fd );iput( inode );/* 2. 初始化超級(jí)塊 */filsys.s_ninode = dinodeblk * blocksiz / dinodesiz - 3;/* 空閑磁盤(pán)i節(jié)點(diǎn)數(shù) */filsys.s_nfree = fileblk - 3;/* 空閑文件塊數(shù) */* 初始
35、化空閑磁盤(pán)i節(jié)點(diǎn)堆棧 */for( i = 0; i nicinod; i+ )filsys.s_inodei = 3 + i;/* 從第3個(gè)磁盤(pán)i塊,前面3個(gè)已用 */filsys.s_pinode = 0;/* 當(dāng)前空閑塊指針 */filsys.s_rinode = nicinod + 3;/ 下一準(zhǔn)備裝入空閑盤(pán)塊號(hào)棧的盤(pán)塊號(hào)/* 把第1組空閑盤(pán)塊放進(jìn)空閑盤(pán)塊堆棧 */for( i = 0; i nicfree; i+ )filsys.s_freei = 3 + nicfree - 1 - i;filsys.s_pfree = nicfree - 1;for( i = 3 + nicfre
36、e * 2 - 1; i fileblk; i += nicfree )for( j = 0; j nicfree; j+ )/* 往緩沖區(qū)寫(xiě)與成組鏈接法組織空閑盤(pán)塊有關(guān)的信息:下一組盤(pán)塊空閑塊號(hào)與塊數(shù) */block_bufj = i - j;block_bufnicfree = nicfree;/* 該項(xiàng)記錄本組的空閑盤(pán)塊數(shù) */* 把緩沖區(qū)內(nèi)容寫(xiě)到每組空閑盤(pán)塊的最后一塊中 */bwrite( i - nicfree, block_buf );/* 最后一組空閑盤(pán)塊可能不足nicfree塊,故需單獨(dú)處理 */i = i - nicfree;for( j = 0; j fileblk - i
37、 + 1; j+ )block_bufj = fileblk - j;block_bufnicfree = fileblk - i + 1;/* 最末組的空閑盤(pán)塊數(shù) */bwrite( i, block_buf );/* 把超級(jí)塊寫(xiě)入 block 1# */fseek( fd, blocksiz, seek_set );fwrite( &filsys, 1, sizeof( struct filsys ), fd );aaa=filsys;return 1;空閑盤(pán)塊分配、回收函數(shù):#include #include filsys.hstatic unsigned int block_bufbl
38、ocksiz;/* 空閑盤(pán)塊分配函數(shù) */unsigned int balloc()unsigned int free_block, free_block_num;int i;if( filsys.s_nfree = 0 )/* 磁盤(pán)已滿(mǎn),無(wú)空閑盤(pán)塊 */printf( disk has no spacen );return -1;free_block = filsys.s_freefilsys.s_pfree;if( filsys.s_pfree = 0 )/* 已經(jīng)是棧底 */* 讀取棧底盤(pán)塊號(hào)所對(duì)應(yīng)的盤(pán)塊數(shù)據(jù) */bread( filsys.s_freefilsys.s_pfree, b
39、lock_buf );free_block_num = block_bufnicfree;/* 該空閑盤(pán)塊組的盤(pán)塊數(shù) */* 把盤(pán)塊組放到空閑盤(pán)塊號(hào)棧上 */for( i = 0; i free_block_num; i+ )filsys.s_freei = block_bufi;filsys.s_pfree = free_block_num - 1;/* 指針指向棧頂 */elsefilsys.s_pfree-;/* 棧指針下移一位 */filsys.s_nfree-;/* 空閑盤(pán)塊少1 */filsys.s_fmod = supdate;/* 置超級(jí)塊修改標(biāo)志 */return free_
40、block;/* 空閑盤(pán)塊回收函數(shù) */bfree( unsigned int block_num )int i;filsys.s_pfree+;if( filsys.s_pfree = nicfree )/* 空閑盤(pán)塊堆棧已滿(mǎn) */block_bufnicfree = nicfree;/* 空閑盤(pán)塊堆棧的盤(pán)塊數(shù)nicfree記入緩沖區(qū) */for( i = 0; i nicfree; i+ )block_bufi = filsys.s_freei; /* 把空閑盤(pán)塊數(shù)據(jù)寫(xiě)入緩沖區(qū) */filsys.s_pfree = 0;/* 棧指針指向棧底 */bwrite( block_num, blo
41、ck_buf );/* 緩沖區(qū)內(nèi)容寫(xiě)入新回收的盤(pán)塊 */filsys.s_freefilsys.s_pfree = block_num;/* 回收盤(pán)塊 */filsys.s_nfree+;/* 空閑盤(pán)塊多1 */filsys.s_fmod = supdate;/* 置超級(jí)塊修改標(biāo)志 */節(jié)點(diǎn)分配和釋放函數(shù):#include #include filsys.hstatic struct dinode block_bufblocksiz / dinodesiz;struct inode * ialloc()struct filsys aaa;struct inode * temp_inode;un
42、signed int cur_di,temp;int i;if( filsys.s_ninode = 0 )/* 沒(méi)有空閑磁盤(pán)i節(jié)點(diǎn) */printf( no leisure dinode!n );return null;if( filsys.s_pinode = nicinod )/* 空閑磁盤(pán)i節(jié)點(diǎn)???*/cur_di = filsys.s_rinode;if( filsys.s_ninode = nicinod )/* 空閑磁盤(pán)i節(jié)點(diǎn)數(shù)可裝滿(mǎn)空閑i節(jié)點(diǎn)棧 */filsys.s_pinode = 0;/* 把下一組磁盤(pán)i節(jié)點(diǎn)讀進(jìn)空閑磁盤(pán)i節(jié)點(diǎn)棧 */while( filsys.s_pin
43、ode nicinod )fseek (fd, dinodestart + cur_di * dinodesiz, seek_set);fread (block_buf, 1, blocksiz, fd);for( i = 0; ( i blocksiz / dinodesiz ) & ( filsys.s_pinode nicinod ); )if( block_bufi.di_mode = diempty )/* 該磁盤(pán)i節(jié)點(diǎn)空閑 */filsys.s_inodefilsys.s_pinode = cur_di;/* 把該i節(jié)點(diǎn)裝入空閑棧 */filsys.s_pinode+;/* 棧指針
44、下移一位 */i+;cur_di+;filsys.s_pinode = 0;else/* 剩下的空閑磁盤(pán)i節(jié)點(diǎn)不能裝滿(mǎn)棧區(qū) */* 計(jì)算出空閑棧指針裝入i節(jié)點(diǎn)的第一個(gè)位置 */filsys.s_pinode = nicinod - filsys.s_ninode;while( filsys.s_pinode nicinod )fseek (fd, dinodestart + cur_di * dinodesiz, seek_set);fread (block_buf, 1, blocksiz, fd);for( i = 0; ( i blocksiz / dinodesiz ) & ( fil
45、sys.s_pinode i_number = 1;/temp_inode-i_uid = useruser_id.u_uid;/temp_inode-i_gid = useruser_id.u_gid;/temp_inode-i_size = 0;/temp_inode-i_addr0 = 0;/iput( temp_inode );/* 分配內(nèi)存i節(jié)點(diǎn) */temp_inode = iget( filsys.s_inodefilsys.s_pinode );/* 從磁盤(pán)i節(jié)點(diǎn)讀取數(shù)據(jù)到內(nèi)存i節(jié)點(diǎn) */fseek( fd, dinodestart + filsys.s_inodefilsys.s_pinode * dinodesiz, seek_set );fwrite( &temp_inode-i_numb
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)火機(jī)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)柴油發(fā)電機(jī)組自動(dòng)監(jiān)控器數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)手搖式收音機(jī)燈數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)PC食品盒數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025年中國(guó)燃?xì)馀L(fēng)機(jī)市場(chǎng)調(diào)查研究報(bào)告
- 2025年中國(guó)顯影套液市場(chǎng)調(diào)查研究報(bào)告
- 2025至2031年中國(guó)益智復(fù)方維生素片行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 二零二五年度電梯安裝工程節(jié)能環(huán)保技術(shù)合同4篇
- 2025年度電商企業(yè)員工保密協(xié)議及離職競(jìng)業(yè)禁止合同范本4篇
- 2025版木門(mén)安裝與室內(nèi)外景觀(guān)照明合同2篇
- GB/T 16895.3-2024低壓電氣裝置第5-54部分:電氣設(shè)備的選擇和安裝接地配置和保護(hù)導(dǎo)體
- 計(jì)劃合同部部長(zhǎng)述職報(bào)告范文
- 人教版高一地理必修一期末試卷
- GJB9001C質(zhì)量管理體系要求-培訓(xùn)專(zhuān)題培訓(xùn)課件
- 二手車(chē)車(chē)主寄售協(xié)議書(shū)范文范本
- 窗簾采購(gòu)?fù)稑?biāo)方案(技術(shù)方案)
- 基于學(xué)習(xí)任務(wù)群的小學(xué)語(yǔ)文單元整體教學(xué)設(shè)計(jì)策略的探究
- 生活用房設(shè)施施工方案模板
- 上海市楊浦區(qū)2022屆初三中考二模英語(yǔ)試卷+答案
- 高中英語(yǔ)原版小說(shuō)整書(shū)閱讀指導(dǎo)《奇跡男孩》(wonder)-Part one 講義
- GB/T 9755-2001合成樹(shù)脂乳液外墻涂料
評(píng)論
0/150
提交評(píng)論