操作系統(tǒng)大作業(yè)-ufs文件系統(tǒng)_第1頁(yè)
操作系統(tǒng)大作業(yè)-ufs文件系統(tǒng)_第2頁(yè)
操作系統(tǒng)大作業(yè)-ufs文件系統(tǒng)_第3頁(yè)
操作系統(tǒng)大作業(yè)-ufs文件系統(tǒng)_第4頁(yè)
操作系統(tǒng)大作業(yè)-ufs文件系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、操作系統(tǒng)課程設(shè)計(jì)一個(gè)用戶級(jí)文件系統(tǒng)的設(shè)計(jì)目錄1、課程設(shè)計(jì)的主要目的-32、相關(guān)的技術(shù)背景-32.1. 文件系統(tǒng)簡(jiǎn)介-32.2. FUSE簡(jiǎn)介-32.3. 解壓FUSE-42.4. 編譯并安裝FUSE-53、主要思想和技術(shù)路線-53.1. 數(shù)據(jù)結(jié)構(gòu)定義-53.2. 主要函數(shù)定義-53.2.1.u_fs函數(shù)-63.2.2.base函數(shù)-84、測(cè)試結(jié)果-94.1. 創(chuàng)建文件系統(tǒng)-94.2. 文件夾測(cè)試-104.3. 文件測(cè)試-114.4. 測(cè)試格式化功能-124.5. 卸載文件系統(tǒng)-125、源代碼的目錄結(jié)構(gòu)及存放位置-136、運(yùn)行環(huán)境-131課程設(shè)計(jì)的主要目的更加深入地理解文件系統(tǒng)的原理和設(shè)計(jì),了解

2、在linux平臺(tái)下的編程,加強(qiáng)學(xué)生動(dòng)手能力,豐富代碼經(jīng)驗(yàn)。實(shí)現(xiàn)兩層目錄系統(tǒng),有以下的要求和限制:1.根目錄可以包含子目錄和普通文件2.子目錄只能包含普通文件,不能包括其他子目錄3.所有文件都能可讀寫(xiě)(改變模式0666),忽略權(quán)限4.許多文件屬性如創(chuàng)建和修改時(shí)間不需要準(zhǔn)確地儲(chǔ)存, 5.文件不能被截?cái)?.目錄看成是文件2.相關(guān)的技術(shù)背景2.1文件系統(tǒng)文件系統(tǒng)是一種用來(lái)存儲(chǔ)和組織計(jì)算機(jī)文件、目錄及其包含的數(shù)據(jù)的方法,它使文件、目錄以及數(shù)據(jù)的查找和訪問(wèn)得到簡(jiǎn)化。文件系統(tǒng)能提供豐富的擴(kuò)展能力。它可以編寫(xiě)成底層文件系統(tǒng)的一個(gè)封裝程序,從而對(duì)其中的數(shù)據(jù)進(jìn)行管理,并提供一個(gè)增強(qiáng)的、具有豐富特性的文件系統(tǒng)。2.

3、2FUSE簡(jiǎn)介FUSE是linux平臺(tái)下使用用戶空間的文件系統(tǒng)。我們不需要了解linux內(nèi)核模塊的編程知識(shí),只要利用FUSE提供的文件系統(tǒng)框架,就可以創(chuàng)建自己的功能完備的文件系統(tǒng)。FUSE主要是由以下的三部分構(gòu)成:l 內(nèi)核模塊FUSEl 用戶空間庫(kù)libfusel mount/umount程序fusermount 在 FUSE 中創(chuàng)建一個(gè)文件系統(tǒng),先安裝一個(gè) FUSE 內(nèi)核模塊,然后使用 FUSE 庫(kù)和 API 。用戶空間進(jìn)程在執(zhí)行操作文件的系統(tǒng)調(diào)用的時(shí)候,在內(nèi)核空間,VFS就會(huì)調(diào)用各文件系統(tǒng)定義的對(duì)應(yīng)操作函數(shù)。FUSE內(nèi)核模塊中被定義的操作函數(shù)把和它對(duì)應(yīng)的請(qǐng)求送到實(shí)現(xiàn)文件系統(tǒng)的用戶空間進(jìn)程(

4、FUSE文件系統(tǒng),也就是后臺(tái)程序),并等待回應(yīng)。FUSE內(nèi)核模塊和FUSE文件系統(tǒng)間的通信是通過(guò)設(shè)備文件/dev/fuse進(jìn)行的。FUSE文件系統(tǒng)把定義的FUSE操作函數(shù)群的地址登錄到fuse_operations結(jié)構(gòu)體中,并通過(guò)把fuse_operations的地址作為參數(shù),調(diào)fuse_main()函數(shù)以下的圖指出在example/hello的例子中,文件系統(tǒng)調(diào)用的路徑。1. 打開(kāi)設(shè)備文件/dev/fuse2. 掛載FUSE文件系統(tǒng)3. 做成FUSE文件系統(tǒng)句柄4. 登錄FUSE操作函數(shù)到FUSE文件系統(tǒng)句柄中5. 登錄信號(hào)處理器6. 執(zhí)行事件循環(huán)A) 從設(shè)備文件/dev/fuse中讀取來(lái)自

5、內(nèi)核模塊的請(qǐng)求B) 執(zhí)行和這個(gè)請(qǐng)求對(duì)應(yīng)的操作函數(shù)C) 寫(xiě)入返回給內(nèi)核模塊的應(yīng)答到設(shè)備文件/dev/fuse中7. 卸載FUSE文件系統(tǒng)在庫(kù)函數(shù)fuse_main()中,執(zhí)行以下的動(dòng)作。 API庫(kù)里定義的接口如getattr, mknod,mkdir,unlink等包含在./include/fuse.h頭文件里。2.3解壓 FUSE要開(kāi)發(fā)一個(gè)文件系統(tǒng),首先請(qǐng)下載 FUSE 的源代碼并展開(kāi)這個(gè)包:tar -zxvf fuse-2.7.0.tar.gz。這會(huì)創(chuàng)建一個(gè) FUSE 目錄,其中保存的是源代碼。fuse-2.7.0 目錄的內(nèi)容如下: ./doc 包含了與 FUSE 有關(guān)的

6、文檔?,F(xiàn)在,這只有一個(gè)文件 how-fuse-works。 ./kernel 包含了 FUSE 內(nèi)核模塊的源代碼(對(duì)于使用 FUSE 開(kāi)發(fā)文件系統(tǒng)來(lái)說(shuō),您當(dāng)然不用懂得這些代碼的機(jī)制)。 ./include 包含了 FUSE API 頭,您需要這些文件來(lái)創(chuàng)建文件系統(tǒng)。您現(xiàn)在唯一需要的就是 fuse.h。 ./lib 中存放的是創(chuàng)建 FUSE 庫(kù)的源代碼,您需要將它們與您的二進(jìn)制文件鏈接在一起來(lái)創(chuàng)建文件系統(tǒng)。 ./util 中存放的是 FUSE 工具庫(kù)的源代碼。 ./example 當(dāng)然包含的是一些供您參考的例子,例如 fusexmp.null 和 hello 文件系統(tǒng)。 2.4編譯并安裝 FUS

7、E在 fuse-2.7.0 目錄中運(yùn)行 configure 腳本: ./configure。這會(huì)創(chuàng)建所需要的 makefile 等內(nèi)容。運(yùn)行 ./make 來(lái)編譯庫(kù)、二進(jìn)制文件和內(nèi)核模塊。查看 kernel 目錄中的文件 ./kernel/fuse.ko 這是內(nèi)核模塊文件。還要查看 lib 目錄中的 fuse.o、mount.o 和 helper.o。運(yùn)行 ./make install 完成 FUSE 的安裝。 重要提示:在編譯 FUSE 時(shí),系統(tǒng)中需要有內(nèi)核頭文件或源代碼。為了簡(jiǎn)單起見(jiàn),請(qǐng)確保將內(nèi)核源代碼放到 /usr/src/ 目錄中。3主要思想和技術(shù)路線3.1數(shù)據(jù)結(jié)構(gòu)定義u_fs文件系統(tǒng)

8、使用一個(gè)鏡像文件(本機(jī)測(cè)試為ufs_iso文件),空間分配如下。Super block(1 block)Bitmap block(1280 blocks)Data block(all the rest blocks)測(cè)試時(shí)分配了1K * 5K = 5M空間,共10240塊。超級(jí)塊 super block超級(jí)塊一定是文件系統(tǒng)的第一塊,描述了整個(gè)文件系統(tǒng),結(jié)構(gòu)定義如下:struct sb long fs_size; /整個(gè)文件系統(tǒng)的塊數(shù)long first_blk;/根目錄所在的第一塊long bitmap; /位圖塊大小目錄 Directory目錄應(yīng)看做文件。每個(gè)目錄下包含一個(gè)u_fs_dire

9、ctory_entry結(jié)構(gòu)的表。在本文件系統(tǒng)沒(méi)有對(duì)目錄個(gè)數(shù)作出限制,但要注意文件名不得超過(guò)8字節(jié),拓展名不超過(guò)3字節(jié)。struct u_fs_file_directory char fnameMAX_FILENAME + 1; /文件名char fextMAX_EXTENSION + 1; /拓展名size_t fsize;/大小long nStartBlock; /起始?jí)Kint flag;/類(lèi)型:0-未使用 1-文件 2-目錄文件 Files文件存儲(chǔ)在單一、預(yù)分配的虛擬磁盤(pán)上,每個(gè)虛擬塊大小為512字節(jié)。struct u_fs_disk_block size_t size; /該塊用了多少字

10、節(jié)long nNextBlock; /下一塊的指針char dataMAX_DATA_IN_BLOCK;/可用的虛擬存儲(chǔ)空間;3.2主要函數(shù)定義3.2.1.u_fs函數(shù)定義 fuse_operation 結(jié)構(gòu)中用到的函數(shù)struct fuse_operations int (*getattr) (const char *, struct stat *);int (*readdir) (const char *, fuse_dirh_t, fuse_dirfil_t); int (*mknod) (const char *, mode_t, dev_t); int (*mkdir) (const

11、 char *, mode_t); int (*unlink) (const char *); int (*rmdir) (const char *); int (*open) (const char *, struct fuse_file_info *); int (*read) (const char *, char *, size_t, off_t, struct fuse_file_info *); int (*write) (const char *, const char *, size_t, off_t,struct fuse_file_info *); int (*flush)

12、 (const char *, struct fuse_file_info *); int (*truncate) (const char *, off_t); int (*init) (struct fuse_conn_info *);int (*getattr) (const char *, struct stat *);/*這個(gè)函數(shù)與 stat() 類(lèi)似。st_dev 和 st_blksize 域都可以忽略。st_ino 域也會(huì)被忽略,除非在執(zhí)行 mount 時(shí)指定了 use_ino 選項(xiàng)。*/int (*readdir) (const char *, fuse_dirh_t, fuse

13、_dirfil_t);/*這個(gè)函數(shù)會(huì)讀取一個(gè)目錄中的內(nèi)容。這個(gè)操作實(shí)際上是在一次調(diào)用中執(zhí)行 opendir()、readdir()、closedir() 序列。對(duì)于每個(gè)目錄項(xiàng)來(lái)說(shuō),都應(yīng)該調(diào)用 filldir() 函數(shù)。*/int (*mknod) (const char *, mode_t, dev_t);/*這個(gè)函數(shù)會(huì)創(chuàng)建一個(gè)文件節(jié)點(diǎn)。此處沒(méi)有 create() 操作;mknod() 會(huì)在創(chuàng)建非目錄、非符號(hào)鏈接的節(jié)點(diǎn)時(shí)調(diào)用。*/int (*mkdir) (const char *, mode_t);int (*rmdir) (const char *);/*這兩個(gè)函數(shù)分別用來(lái)創(chuàng)建和刪除一個(gè)目

14、錄。 */int (*unlink) (const char *);/*這個(gè)函數(shù)用來(lái)刪除一個(gè)文件。 */int (*open) (const char *, struct fuse_file_info *);/*這是文件的打開(kāi)操作。對(duì) open() 函數(shù)不能傳遞創(chuàng)建或截?cái)鄻?biāo)記(O_CREAT、O_EXCL、O_TRUNC)。這個(gè)函數(shù)應(yīng)該檢查是否允許執(zhí)行給定的標(biāo)記的操作。另外,open() 也可能在 fuse_file_info 結(jié)構(gòu)中返回任意的文件句柄,這會(huì)傳遞給所有的文件操作。)*/int (*read) (const char *, char *, size_t, off_t, struc

15、t fuse_file_info *);/*這個(gè)函數(shù)從一個(gè)打開(kāi)文件中讀取數(shù)據(jù)。除非碰到 EOF 或出現(xiàn)錯(cuò)誤,否則 read() 應(yīng)該返回所請(qǐng)求的字節(jié)數(shù)的數(shù)據(jù);否則,其余數(shù)據(jù)都會(huì)被替換成 0。一個(gè)例外是在執(zhí)行 mount 命令時(shí)指定了 direct_io 選項(xiàng),在這種情況中 read() 系統(tǒng)調(diào)用的返回值會(huì)影響這個(gè)操作的返回值。*/int (*write) (const char *, const char *, size_t, off_t, struct fuse_file_info *);/*這個(gè)函數(shù)將數(shù)據(jù)寫(xiě)入一個(gè)打開(kāi)的文件中。除非碰到 EOF 或出現(xiàn)錯(cuò)誤,否則 write() 應(yīng)該返回所請(qǐng)

16、求的字節(jié)數(shù)的數(shù)據(jù)。一個(gè)例外是在執(zhí)行 mount 命令時(shí)指定了 direct_io 選項(xiàng)(這于 read() 操作的情況類(lèi)似)。*/int (*flush) (const char *, struct fuse_file_info *);/*這表示要刷新緩存數(shù)據(jù)。它并不等于 fsync() 函數(shù) 也不是請(qǐng)求同步臟數(shù)據(jù)。每次對(duì)一個(gè)文件描述符執(zhí)行 close() 函數(shù)時(shí),都會(huì)調(diào)用 flush();因此如果文件系統(tǒng)希望在 close() 中返回寫(xiě)錯(cuò)誤,并且這個(gè)文件已經(jīng)緩存了臟數(shù)據(jù),那么此處就是回寫(xiě)數(shù)據(jù)并返回錯(cuò)誤的好地方。由于很多應(yīng)用程序都會(huì)忽略 close() 錯(cuò)誤,因此這通常用處不大。*/int (

17、*truncate) (const char *, off_t);/*這個(gè)函數(shù)用來(lái)修改文件的大小。*/int (*init) (struct fuse_conn_info *);/*這個(gè)函數(shù)用來(lái)對(duì)加載的文件系統(tǒng)初始化,如:獲得文件系統(tǒng)的大小。*/3.2.2.base函數(shù)定義為u_fs的FUSE用戶操作提供底層操作,在base.c定義供u_fs調(diào)用。int op_read_blk(long blk,u_fs_disk_block * content);/讀取塊中的內(nèi)容int op_write_blk(long blk,u_fs_disk_block * content);/往塊中寫(xiě)入內(nèi)容int

18、op_search_free_blk(int num,long* start_blk);/尋找空閑塊,采用首次匹配法int op_set_blk(long blk,int flag);/設(shè)置塊的flag位int op_create(const char *, int flag);op_create( )/函數(shù)把創(chuàng)建目錄和文件統(tǒng)一起來(lái)。int op_open(const char * org_path, u_fs_file_directory *attr);op_open( )/*返回要打開(kāi)的目錄或文件的u_fs_file_directory記錄,根據(jù)此記錄可以知道目錄或文件所在的數(shù)據(jù)塊,大小等

19、屬性,以備調(diào)用的函數(shù)使用。*/int op_setattr(const char* org_path, u_fs_file_directory * attr);op_setattr( )/*更改文件或目錄的u_fs_file_directory記錄。在刪除文件或目錄,使用此函數(shù)可使flag設(shè)為0。在寫(xiě)文件時(shí),調(diào)用此函數(shù)可以更改文件的大小。*/int op_rm(const char *path,int flag);op_rm( )/*函數(shù)把刪除目錄和文件統(tǒng)一起來(lái)。刪除時(shí),要把對(duì)應(yīng)的數(shù)據(jù)塊釋放;把u_fs_file_directory記錄的flag標(biāo)記為0。*/4測(cè)試結(jié)果注意:cy采用宏定義,即在u_fs.h里對(duì)路徑進(jìn)行定義?,F(xiàn)定義為#define UFS_ISO “/home/chenyue/aimao/ufs_iso” 此值應(yīng)根據(jù)不同系統(tǒng)改成對(duì)應(yīng)的絕對(duì)路徑。4.1創(chuàng)建文件系統(tǒng)1. 分配磁盤(pán)空間dd bs=1K count=5K if=/dev/zero of=./ufs_iso2. 格式化磁盤(pán)空間./u_fs_init3. 創(chuàng)建裝載位置mkdir cy 裝載ufs_iso文件系統(tǒng)到cy文件夾,發(fā)現(xiàn)在位置一欄新增了“c

溫馨提示

  • 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ù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論