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

下載本文檔

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

文檔簡介

1、操作系統(tǒng)課程設(shè)計一個用戶級文件系統(tǒng)的設(shè)計目錄1、課程設(shè)計的主要目的-32、相關(guān)的技術(shù)背景-32.1. 文件系統(tǒng)簡介-32.2. FUSE簡介-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、測試結(jié)果-94.1. 創(chuàng)建文件系統(tǒng)-94.2. 文件夾測試-104.3. 文件測試-114.4. 測試格式化功能-124.5. 卸載文件系統(tǒng)-125、源代碼的目錄結(jié)構(gòu)及存放位置-136、運(yùn)行環(huán)境-131課程設(shè)計的主要目的更加深入地理解文件系統(tǒng)的原理和設(shè)計,了解

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

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

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

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

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

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

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

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

10、節(jié)long nNextBlock; /下一塊的指針char dataMAX_DATA_IN_BLOCK;/可用的虛擬存儲空間;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 *);/*這個函數(shù)與 stat() 類似。st_dev 和 st_blksize 域都可以忽略。st_ino 域也會被忽略,除非在執(zhí)行 mount 時指定了 use_ino 選項。*/int (*readdir) (const char *, fuse_dirh_t, fuse

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

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

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

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

17、*truncate) (const char *, off_t);/*這個函數(shù)用來修改文件的大小。*/int (*init) (struct fuse_conn_info *);/*這個函數(shù)用來對加載的文件系統(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);/往塊中寫入內(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)一起來。int op_open(const char * org_path, u_fs_file_directory *attr);op_open( )/*返回要打開的目錄或文件的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。在寫文件時,調(diào)用此函數(shù)可以更改文件的大小。*/int op_rm(const char *path,int flag);op_rm( )/*函數(shù)把刪除目錄和文件統(tǒng)一起來。刪除時,要把對應(yīng)的數(shù)據(jù)塊釋放;把u_fs_file_directory記錄的flag標(biāo)記為0。*/4測試結(jié)果注意:cy采用宏定義,即在u_fs.h里對路徑進(jìn)行定義?,F(xiàn)定義為#define UFS_ISO “/home/chenyue/aimao/ufs_iso” 此值應(yīng)根據(jù)不同系統(tǒng)改成對應(yīng)的絕對路徑。4.1創(chuàng)建文件系統(tǒng)1. 分配磁盤空間dd bs=1K count=5K if=/dev/zero of=./ufs_iso2. 格式化磁盤空間./u_fs_init3. 創(chuàng)建裝載位置mkdir cy 裝載ufs_iso文件系統(tǒng)到cy文件夾,發(fā)現(xiàn)在位置一欄新增了“c

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論