版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、簡(jiǎn)單多用戶文件系統(tǒng)目錄一、課程設(shè)計(jì)任務(wù)描述2二、設(shè)計(jì)思想說(shuō)明22.1 對(duì)該任務(wù)的理解分析22.2 設(shè)計(jì)任務(wù)剖析32.3 程序設(shè)計(jì)環(huán)境及工具選擇42.4 函數(shù)層次圖(即模塊關(guān)系圖)5三、EXT2文件系統(tǒng)簡(jiǎn)介53.1文件系統(tǒng)概述53.2 EXT2文件系統(tǒng)簡(jiǎn)介5四、數(shù)據(jù)設(shè)計(jì)與表示74.1 頭文件說(shuō)明74.1.1 頭文件:types.h74.1.2頭文件:filetype.h74.1.3頭文件:sys.h84.2數(shù)據(jù)結(jié)構(gòu)說(shuō)明84.2.1 超級(jí)塊(super block)84.2.2 組描述符84.2.3 磁盤索引節(jié)點(diǎn)94.2.4 內(nèi)存索引節(jié)點(diǎn)10磁盤目錄項(xiàng)結(jié)構(gòu)體104.2.6當(dāng)前目錄結(jié)構(gòu)體114.2.
2、7用戶打開文件表結(jié)構(gòu)體114.2.8系統(tǒng)打開文件表結(jié)構(gòu)體114.2.9用戶結(jié)構(gòu)體124.3 宏定義說(shuō)明124.4 主要函數(shù)列表134.5 算法流程圖14五、數(shù)據(jù)分析175.1 輸入數(shù)據(jù)175.2 輸出數(shù)據(jù)分析17六、使用說(shuō)明186.1歡迎界面186.2 用戶登陸界面186.3 系統(tǒng)使用界面196.4 創(chuàng)建目錄及顯示目錄界面19七、課程設(shè)計(jì)總結(jié)207.1 與給定文件系統(tǒng)的對(duì)比分析207.2 未完成部分及改進(jìn)方法207.2 課程設(shè)計(jì)總結(jié)20八、參考文獻(xiàn)20九、程序源代碼及注解21一、課程設(shè)計(jì)任務(wù)描述為L(zhǎng)INUX設(shè)計(jì)一個(gè)簡(jiǎn)單的二級(jí)文件系統(tǒng)。要求做到以下幾點(diǎn):1、 可以實(shí)現(xiàn)下列幾條命令Login 用戶
3、登錄Dir列文件目錄Create創(chuàng)建文件Delete刪除文件Open打開文件Close關(guān)閉文件Read讀文件Write 寫文件2、列目錄時(shí)要列出文件名、物理地址、保護(hù)碼和文件長(zhǎng)度。3、源文件可以進(jìn)行讀寫保護(hù)。二、設(shè)計(jì)思想說(shuō)明2.1 對(duì)該任務(wù)的理解分析一個(gè)文件系統(tǒng)從功能上劃分程序?yàn)樗膫€(gè)部分,第一部分是有關(guān)高速緩沖區(qū)的管理程序,主要實(shí)現(xiàn)了對(duì)硬盤等塊設(shè)備進(jìn)行數(shù)據(jù)高速存取的函數(shù);第二部分代碼描述了文件系統(tǒng)的底層通用函數(shù),說(shuō)明了文件索引節(jié)點(diǎn)的管理、磁盤數(shù)據(jù)塊的分配和釋放以及文件名與i節(jié)點(diǎn)的轉(zhuǎn)換算法;第三部分程序是有關(guān)對(duì)文件中數(shù)據(jù)進(jìn)行讀寫操作,包括對(duì)字符設(shè)備、管道、塊讀寫文件中數(shù)據(jù)的訪問(wèn);第四部分的程序與
4、文件的系統(tǒng)調(diào)用接口的實(shí)現(xiàn)有關(guān),主要涉及文件打開、關(guān)閉、創(chuàng)建以及有關(guān)文件目錄操作等的系統(tǒng)調(diào)用。由于我們不能親自設(shè)計(jì)驅(qū)動(dòng)程序,所以我們要模擬文件系統(tǒng)的設(shè)計(jì)、實(shí)現(xiàn)和功能,就不能把它直接做為操作系統(tǒng)實(shí)際的文件系統(tǒng)進(jìn)行掛接。鑒于此,我們就有兩個(gè)思路來(lái)完成該任務(wù),一是在實(shí)際的硬盤上創(chuàng)建一個(gè)文件,把它做為磁盤進(jìn)行各種對(duì)磁盤的模擬操作,這樣做的好處是可以對(duì)它進(jìn)行連續(xù)操作,只要在退出文件系統(tǒng)時(shí),及時(shí)保存它的狀態(tài),當(dāng)我們下次啟動(dòng)程序時(shí),就能繼續(xù)以前的操作,相比而言這更接近于實(shí)際;二是在內(nèi)存中開辟一塊空間,譬如1M或2M大小,繼而對(duì)這塊內(nèi)存區(qū)域模擬磁盤操作,操作靈活但這樣需每次開辟空間,極有可能隱藏一些需要關(guān)閉文件
5、系統(tǒng)才能發(fā)現(xiàn)的錯(cuò)誤,也就是說(shuō)這樣做不易于排錯(cuò)。在本次的課程設(shè)計(jì)中,我們決定采用第一種方案。由于是在文件級(jí)上的操作,所以我們不必去寫設(shè)備驅(qū)動(dòng)程序,只需要開辟文件調(diào)用fwrite、fread、fseek、ftell、fput、fget等庫(kù)函數(shù)進(jìn)行讀寫即可。在文件系統(tǒng)四部分程序中,我們只需要編寫第二部分文件系統(tǒng)的底層通用函數(shù)即可。2.2 設(shè)計(jì)任務(wù)剖析在本次的課程設(shè)計(jì)中,我們沒有沿用課程設(shè)計(jì)指導(dǎo)書上文件系統(tǒng)的例子程序,而是決定模擬Linux的標(biāo)準(zhǔn)根文件系統(tǒng)EXT2,其原因我們會(huì)在課程設(shè)計(jì)總結(jié)中給出。我們認(rèn)為EXT2主要的設(shè)計(jì)思想是磁盤分區(qū)再分組,數(shù)據(jù)存儲(chǔ)使用混合索引方式。這也是我們要實(shí)現(xiàn)的主要功能。在
6、參考了Linux0.11文件系統(tǒng)Minix2.0及Linux2.4EXT2的底層通用函數(shù)后,本著設(shè)計(jì)簡(jiǎn)單可表達(dá)EXT2設(shè)計(jì)思想的原則,我們需要編寫的程序要實(shí)現(xiàn)下列功能:l 格式化程序。在硬盤上創(chuàng)建一個(gè)文件,用來(lái)模擬磁盤;對(duì)磁盤按照EXT2文件系統(tǒng)結(jié)構(gòu)進(jìn)行劃分;主要數(shù)據(jù)的寫入,包括根目錄、登陸文檔、超級(jí)塊、組描述符的初始化及組描述符表、塊位圖索引節(jié)點(diǎn)位圖的初始化及索引節(jié)點(diǎn)表。l 磁盤讀寫函數(shù)。這部分的函數(shù)要完成的功能包括:讀寫指定的磁盤塊;讀寫指定的索引節(jié)點(diǎn)表和塊位圖;讀寫指定的超級(jí)塊和組描述符。l 數(shù)據(jù)塊分配和回收函數(shù)。按照先組從小到大,后邏輯塊編號(hào)從小到大的順序分配數(shù)據(jù)塊;回收指定的邏輯塊改
7、寫相應(yīng)組內(nèi)的塊位圖。l 索引節(jié)點(diǎn)分配和回收。按照先組從小到大,后索引編號(hào)從小到大的順序分配索引節(jié)點(diǎn);回收指定的索引節(jié)點(diǎn)改寫相應(yīng)組內(nèi)的索引節(jié)點(diǎn)位圖。l 目錄操作函數(shù)。列表顯示當(dāng)前目錄內(nèi)目錄項(xiàng),更改目錄及刪除目錄。l 文件操作函數(shù)。組織進(jìn)程和文件系統(tǒng)的關(guān)系,包括用戶打開文件表和系統(tǒng)打開文件表的初始化和管理。創(chuàng)建文件、刪除文件、打開文件、關(guān)閉文件、讀文件和寫文件。程序是引用文件描述符來(lái)操作文件的。l 用戶認(rèn)證。讀取文件系統(tǒng)的密碼文檔,對(duì)登陸用戶驗(yàn)證。由于EXT2文件系統(tǒng)是相對(duì)較大的程序的組合,在較短的時(shí)間內(nèi)很難全面模仿,所以我們對(duì)它在不改變其主要設(shè)計(jì)思想的基礎(chǔ)上,進(jìn)行了適當(dāng)簡(jiǎn)化。編寫程序時(shí)主要遵循的
8、設(shè)計(jì)思想如下:l 設(shè)置全局宏定義。在實(shí)際中,文件系統(tǒng)要引用一些常量,是在各種數(shù)據(jù)結(jié)構(gòu)體中查找的,而我們?yōu)榱耸沟贸绦蛟O(shè)計(jì)的簡(jiǎn)單,使用了全局的宏定義,在程序的任何地方都可方便的使用。l 數(shù)據(jù)分配采用混合索引方式。在數(shù)據(jù)塊的組織上我們使用EXT2的混合索引方式,但我們不準(zhǔn)備照搬EXT2的方式,而是把數(shù)據(jù)指針定為5個(gè),前4個(gè)作為直接指針,第5個(gè)做為單級(jí)指針。這樣我們文件系統(tǒng)中文件最大就定為了:(BLOCKSIZE_BT是以字節(jié)表示的磁盤塊大小)4*BLOCKSIZE_BT+(BLOCKSIZE_BT/4)*BLOCKSIZE_BT=4*512B+(512/4)*512B=67584B=67584B/(
9、1024B/K)=66KBl 目錄采用直接指針?lè)绞?。在?chuàng)建目錄項(xiàng)時(shí),我們把這5個(gè)數(shù)據(jù)指針都作為了直接指針。那么每個(gè)目錄可包含的目錄項(xiàng)為:5*(BLOCKSIZE_BT/DIR_ENTRY_LEN)=40l 在進(jìn)程和文件系統(tǒng)的關(guān)系上,使用了EXT2的組織方式,可用下圖表示:2.3 程序設(shè)計(jì)環(huán)境及工具選擇該試驗(yàn)程序是小組成員在Windows2000平臺(tái)下,使用Microsoft Visual C+ 6.0編輯、編譯及調(diào)試通過(guò)的。之所以選擇這種組合是在考慮了Windows平臺(tái)的易用性、廣泛性和程序文件轉(zhuǎn)儲(chǔ)簡(jiǎn)單等特性,另外Visual C+可自己組織程序的調(diào)用和編譯,省去了在Linux平臺(tái)下使用GNU
10、/GCC書寫Makefile文件系統(tǒng)的麻煩。這樣可以在較短的時(shí)間內(nèi)完成文件系統(tǒng)復(fù)雜程序的編寫??紤]到Visual C+是32位的編譯器,為了在其他一些16位編譯器如TC下編譯通過(guò),我們特意為此設(shè)計(jì)了通用模式。關(guān)于此下文有詳細(xì)的說(shuō)明。2.4 函數(shù)層次圖(即模塊關(guān)系圖)圖例說(shuō)明: 為shell調(diào)用命令為程序調(diào)用函數(shù)三、EXT2文件系統(tǒng)簡(jiǎn)介3.1文件系統(tǒng)概述簡(jiǎn)單地說(shuō),文件系統(tǒng)就是操作系統(tǒng)與存儲(chǔ)介質(zhì)之間交換數(shù)據(jù)的一種協(xié)議約定,它對(duì)文件的組織和存取規(guī)則進(jìn)行詳細(xì)描述,同時(shí)保證數(shù)據(jù)的完整性。有了這種邏輯上的約定,文件系統(tǒng)就不必了解數(shù)據(jù)塊的物理存儲(chǔ)位置,它只需保存邏輯塊的編號(hào),而對(duì)磁盤的物理操作是由文件系統(tǒng)磁
11、盤函數(shù)庫(kù)(Disk Library)中的各種底層函數(shù),通過(guò)塊設(shè)備驅(qū)動(dòng)程序,來(lái)完成由邏輯塊編號(hào)到物理存儲(chǔ)位置的轉(zhuǎn)換。3.2 EXT2文件系統(tǒng)簡(jiǎn)介L(zhǎng)inux第一版的文件系統(tǒng)來(lái)自Minix,隨著Linux的逐步成熟,從而為L(zhǎng)inux量身定做了EXT文件系統(tǒng),但其性能差強(qiáng)人意,并不能滿足實(shí)際的需要。1993年由Remy Card做了進(jìn)一步改良,EXT演變?yōu)镋XT2,它同樣是建立在文件的數(shù)據(jù)以數(shù)據(jù)塊為組織單位的前提下。因其高效和強(qiáng)健的特性,成為了Linux內(nèi)核使用的標(biāo)準(zhǔn)根文件系統(tǒng)。EXT2的英文全稱是Second Extrended File System,亦即第二擴(kuò)展文件系統(tǒng)的意思,它負(fù)責(zé)管理系統(tǒng)外存
12、上的文件,為操作系統(tǒng)和用戶提供對(duì)文件的存取、共享和保護(hù)的手段。Ext2的優(yōu)點(diǎn)是:l 支持達(dá) 4 TB 的內(nèi)存。 l 文件名稱最長(zhǎng)可以到 1012 個(gè)字符。 l 當(dāng)創(chuàng)建文件系統(tǒng)時(shí),管理員可以選擇邏輯塊的大?。ㄍǔ4笮】蛇x擇 1024、2048 和 4096 字節(jié))。 l 實(shí)現(xiàn)快速符號(hào)鏈接:不需要為此目的而分配數(shù)據(jù)塊,并且將目標(biāo)名稱直接存儲(chǔ)在索引節(jié)點(diǎn)(inode)表中。這使性能有所提高,特別是在速度上。因?yàn)?Ext2 文件系統(tǒng)的穩(wěn)定性、可靠性和健壯性,所以幾乎在所有基于 Linux 的系統(tǒng)(包括臺(tái)式機(jī)、服務(wù)器和工作站 并且甚至一些嵌入式設(shè)備)上都使用 Ext2 文件系統(tǒng)。然而,當(dāng)在嵌入式設(shè)備中使用
13、 Ext2fs 時(shí),它有一些缺點(diǎn):Ext2是為象 IDE 設(shè)備那樣的塊設(shè)備設(shè)計(jì)的,這些設(shè)備的邏輯塊大小是 512 字節(jié),1 K 字節(jié)等這樣的倍數(shù)。這不太適合于扇區(qū)大小因設(shè)備不同而不同的閃存設(shè)備。Ext2 文件系統(tǒng)沒有提供對(duì)基于扇區(qū)的擦除寫操作的良好管理。在 Ext2中,為了在一個(gè)扇區(qū)中擦除單個(gè)字節(jié),必須將整個(gè)扇區(qū)復(fù)制到 RAM,然后擦除,然后重寫入??紤]到閃存設(shè)備具有有限的擦除壽命(大約能進(jìn)行 100,000 次擦除),在此之后就不能使用它們,所以這不是一個(gè)特別好的方法。在出現(xiàn)電源故障時(shí),Ext2fs 不是防崩潰的。Ext2 文件系統(tǒng)不支持損耗平衡,因此縮短了扇區(qū)閃存的壽命。(損耗平衡確保將地
14、址范圍的不同區(qū)域輪流用于寫和或擦除操作以延長(zhǎng)閃存設(shè)備的壽命。)Ext2fs 沒有特別完美的扇區(qū)管理,這使設(shè)計(jì)塊驅(qū)動(dòng)程序十分困難。EXT2把硬盤分成多個(gè)分區(qū),通常必須有一個(gè)主分區(qū)(Native)和一個(gè)交換分區(qū)(Swap),Linux把每一個(gè)分區(qū)都當(dāng)作一個(gè)獨(dú)立的設(shè)備對(duì)待。主分區(qū)的大部分空間用來(lái)存儲(chǔ)系統(tǒng)中的各種數(shù)據(jù),例如普通文件、目錄文件等文件,少部分用來(lái)定義文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu);交換分區(qū)用作系統(tǒng)的虛擬內(nèi)存。實(shí)際上每個(gè)分區(qū)都是一個(gè)文件系統(tǒng),有它們各自的頂層目錄和下面的目錄層次結(jié)構(gòu)。這些單獨(dú)的文件系統(tǒng)按照一定的掛接方式形成一個(gè)總的目錄層次結(jié)構(gòu)。邏輯分區(qū)繼續(xù)分成多個(gè)塊組(block group) ,塊組下
15、面又分為超級(jí)塊(SuperBlock)、組描述符表(group descriptors)、塊位圖(Bitmap)、索引節(jié)點(diǎn)(inode)位圖、索引節(jié)點(diǎn)表、目錄塊和數(shù)據(jù)塊等,它們各自占有不同數(shù)量的邏輯塊,在文件系統(tǒng)中起著不同的作用。在塊組0之前還有一個(gè)引導(dǎo)塊,它位于任何EXT2分區(qū)中的第1塊,是為分區(qū)的啟動(dòng)扇區(qū)保留的,不受Ext2 文件系統(tǒng)的管理。若該分區(qū)為系統(tǒng)的主引導(dǎo)分區(qū)時(shí),引導(dǎo)塊的內(nèi)容就為引導(dǎo)信息含有可執(zhí)行代碼,否則為空。在同一個(gè)文件系統(tǒng)中,數(shù)據(jù)塊的大小是固定的,對(duì)于不同的EXT2 文件系統(tǒng)這個(gè)值可以不同。數(shù)據(jù)塊的大小是在建立EXT2文件系統(tǒng)時(shí),由系統(tǒng)管理員指定或由文件系統(tǒng)的創(chuàng)建程序根據(jù)硬盤
16、分區(qū)的大小,自動(dòng)選擇一個(gè)較合理的值確定的,這個(gè)值一經(jīng)確定,文件系統(tǒng)就把它作為基本參數(shù)保存起來(lái),在運(yùn)行期間就不會(huì)改動(dòng)了。以后文件所需的存儲(chǔ)空間就依照這個(gè)指定大小的數(shù)據(jù)塊為基本單位進(jìn)行分配。EXT2文件系統(tǒng)的邏輯硬盤布局在每個(gè)塊組中重復(fù)保存著相對(duì)于其分區(qū)文件系統(tǒng)的一些重要信息,包括一份超級(jí)塊的拷貝和一組塊組描述符的拷貝。這種對(duì)文件系統(tǒng)完整性關(guān)鍵信息的重復(fù)保存,雖然浪費(fèi)了一些存儲(chǔ)空間,但有助于文件系統(tǒng)在發(fā)生故障時(shí)的還原。實(shí)際上只有塊組0 中所包含的超級(jí)塊和組描述符才被內(nèi)核讀取使用,其余的拷貝信息一般保持不變,只有當(dāng)出現(xiàn)數(shù)據(jù)損壞,并且塊組0中的主超級(jí)塊和主描述符表變?yōu)闊o(wú)效時(shí),才被文件系統(tǒng)引用,通過(guò)e2
17、fsck 程序把Ext2 分區(qū)恢復(fù)到某個(gè)一致的狀態(tài)。四、數(shù)據(jù)設(shè)計(jì)與表示4.1 頭文件說(shuō)明4.1.1 頭文件:types.h#ifndef _I386_TYPES_H#define _I386_TYPES_H#define VARTYPE 1 /1為在vc下編譯#if VARTYPE=1typedef unsigned int _U32; typedef unsigned short _U16;typedef unsigned char _U8;typedef int _S32; typedef short _S16;typedef char _S8;#elsetypedef unsigned
18、long _U32;typedef unsigned int _U16;typedef unsigned char _U8;typedef long _S32;typedef int _S16;typedef char _S8;#endif#endif因?yàn)樵?6位和32位的編譯器下表達(dá)int的字節(jié)是不同的,而在寫各種數(shù)據(jù)塊時(shí)又必須按照字節(jié)對(duì)應(yīng)寫入,這就照成了程序的不能通用。鑒于此,我們使用typedef命令把數(shù)據(jù)類型進(jìn)行了規(guī)定。4.1.2頭文件:filetype.h#ifndef _FILETYPE_#define _FILETYPE_#define UKN0x0000 /0 未知#defin
19、e REG0x0001 /1 普通文件#define DIR0x0002 /2 目錄文件#define CHR0x0003 /3 字符設(shè)備#define BLK0x0004 /4 塊設(shè)備#define FIFO 0x0005 /5 命名管道#define SOCK 0x0006 /6 套接字#define LNK0x0007 /7 符號(hào)鏈接#defineS_IREG(flag)(flag=0x01)?REG:0/1 判斷普通文件#defineS_IDIR(flag)(flag=0x02)?DIR:0/2 判斷目錄文件#defineS_ICHR(flag)(flag=0x03)?CHR:0/3
20、判斷字符設(shè)備#defineS_IBLK(flag)(flag=0x04)?BLK:0/4 判斷塊設(shè)備#defineS_IFIFO(flag)(flag=0x05)?FIFO:0/5 判斷命名管道#defineS_ISOCK(flag)(flag=0x06)?SOCK:0/6 判斷套接字#defineS_ILNK(flag)(flag=0x07)?LNK:0/7 判斷符號(hào)鏈接#endif按照UNIX的文件屬性設(shè)置定義該頭文件,及用來(lái)對(duì)文件屬性的判斷。4.1.3頭文件:sys.h該頭文件包括了系統(tǒng)使用的各種宏定義和數(shù)據(jù)結(jié)構(gòu),這部分的內(nèi)容將在“數(shù)據(jù)結(jié)構(gòu)說(shuō)明”和“宏定義說(shuō)明”部分予以介紹。4.2數(shù)據(jù)結(jié)
21、構(gòu)說(shuō)明4.2.1 超級(jí)塊(super block)超級(jí)塊位于每個(gè)塊組的最前面,如前所述對(duì)于每個(gè)塊組其內(nèi)容是相同的,在任何一個(gè)塊組中超級(jí)塊只占用1個(gè)數(shù)據(jù)塊。它是用來(lái)描述EXT2文件系統(tǒng)整體布局信息的數(shù)據(jù)結(jié)構(gòu),包含其所在分區(qū)文件系統(tǒng)目錄和文件的靜態(tài)分布情況,并給出文件系統(tǒng)各組成部分的大小和形狀等信息。struct ext2_super_block _U32s_inodes_count; /* 索引節(jié)點(diǎn)的總數(shù) Inodes count */_U32s_blocks_count; /* 以塊為單位的文件系統(tǒng)的大小 Blocks count */_U32s_free_blocks_count; /* 空
22、閑塊計(jì)數(shù)器 Free blocks count */_U32s_free_inodes_count; /* 空閑索引節(jié)點(diǎn)計(jì)數(shù)器 Free inodes count */_U32s_first_data_block; /* 第一個(gè)使用的塊號(hào) First Data Block */_U32s_log_block_size; /* 塊的大小 Block size */_U32s_blocks_per_group; /* 每組中的塊數(shù) Blocks per group */_U32s_inodes_per_group; /* 每組中的節(jié)點(diǎn)數(shù) Inodes per group */_U32s_mtime
23、; /* 最后一次安裝操作的時(shí)間 Mount time */_U32s_wtime; /* 最后一次寫操作的時(shí)間 Write time */_U16s_magic; /* 魔數(shù)簽名 Magic signature */_U32s_first_ino; /* 第一個(gè)非保留的索引節(jié)點(diǎn)號(hào) */_U16 s_inode_size; /* 磁盤上索引節(jié)點(diǎn)結(jié)構(gòu)的大小 */;#define SUPER_BLOCK_LEN sizeof(struct ext2_super_block) /56B4.2.2 組描述符在設(shè)計(jì)上Linux深受BSD FFS(快速文件系統(tǒng))的影響,它的塊組與 FFS的柱面組很類似。然
24、而,塊組與磁盤上塊的物理布局沒有關(guān)系,因?yàn)楝F(xiàn)代驅(qū)動(dòng)器趨向于順序訪問(wèn)優(yōu)化設(shè)計(jì),并向操作系統(tǒng)隱藏了其中的物理幾何參數(shù)。這個(gè)結(jié)構(gòu)也同樣在性能上帶來(lái)好處:通過(guò)減少i節(jié)點(diǎn)表與數(shù)據(jù)塊之間的距離,就有可能降低磁頭對(duì)文件I/O操作尋道的時(shí)間,從而提高了文件存取的效率。分區(qū)在邏輯上把塊組看作是一個(gè)線性數(shù)組,所含塊組的數(shù)量取決于該分區(qū)的大小和預(yù)設(shè)的塊的大小,主要限制在于塊位圖。每個(gè)塊組中的塊位圖必須存放在1個(gè)單獨(dú)的塊中,用來(lái)標(biāo)識(shí)一個(gè)組中塊的占用和空閑狀況。在數(shù)據(jù)塊的大小確定以后,每個(gè)塊組的大小也同時(shí)被固定了下來(lái),由下面的公式可以得到一組重要的信息:設(shè)數(shù)據(jù)塊及分區(qū)容量分別為: N KB S KB每組中含數(shù)據(jù)塊的最大
25、數(shù): DBMAX=N*1024*8=8192*N塊組最大容量: BGSIZE=DBMAX*N=8192*N2分區(qū)中塊組最小數(shù): BGMIN=S/DBSIZE=S/(8192* N2)每個(gè)塊組與一個(gè)組描述符(ext2_group_desc,見includelinuxext2_fs.h)對(duì)應(yīng),組描述符記錄該塊組的一些重要信息的位置以及該塊組的空間使用情況,struct ext2_group_desc_U32bg_block_bitmap; /* 塊位圖的塊號(hào) */_U32 bg_inode_bitmap; /* 索引節(jié)點(diǎn)位圖的塊號(hào) */_U32 bg_inode_table; /* 第一個(gè)索引節(jié)點(diǎn)
26、表塊的塊號(hào) */_U16 bg_free_blocks_count; /* 組中空閑塊的個(gè)數(shù) */_U16 bg_free_inodes_count; /* 組中索引節(jié)點(diǎn)的個(gè)數(shù) */_U16 bg_used_dirs_count; /* 組中目錄的個(gè)數(shù) */_U16 bg_id; /* 該組描述副的編號(hào) */_U32bg_reserved3; /* 填充字符 */;#define GROUP_DESC_LEN sizeof(struct ext2_group_desc) /32B4.2.3 磁盤索引節(jié)點(diǎn)struct ext2_inode_U16 i_mode; /* 文件類型和訪問(wèn)權(quán)限 */_
27、U16 i_uid; /* 擁有者標(biāo)識(shí)符 */_U32 i_size; /* 以字節(jié)為單位的文件長(zhǎng)度 */_U32 i_atime; /* 最后一次訪問(wèn)文件的時(shí)間 */_U32 i_ctime; /* 索引節(jié)點(diǎn)最后改變的時(shí)間 */_U32 i_mtime; /* 文件內(nèi)容最后改變的時(shí)間 */_U32 i_dtime; /* 文件刪除的時(shí)間 */_U16 i_gid; /* 組標(biāo)識(shí)符 */_U16 i_links_count; /* 硬鏈接計(jì)數(shù)器 */ _U32 i_blocks; /* 文件的數(shù)據(jù)塊數(shù) */_U32 i_flags; /* 文件標(biāo)志 */ _U32 i_blockEXT2_N_
28、BLOCKS; /* 指向數(shù)據(jù)塊的指針 */_U32 re2;#define INODE_LEN sizeof(struct ext2_inode) /644.2.4 內(nèi)存索引節(jié)點(diǎn)struct ext2_inode_info struct ext2_inode_info *i_next;struct ext2_inode_info *i_pri;_U16i_mode; /* 文件類型和訪問(wèn)權(quán)限 */_U32i_dataEXT2_N_BLOCKS; /* 邏輯塊指針 */_U32i_count; /* 內(nèi)存關(guān)聯(lián)文件數(shù) */_U32i_inode; /* 索引接點(diǎn)編號(hào) */_U8i_dirty;
29、/* 臟數(shù)據(jù) */_U32i_links_count; /* 硬鏈接計(jì)數(shù)器 */ _U16i_blocks; /* 文件大小(以塊表示) */_U32i_size; /* 以字節(jié)為單位的文件長(zhǎng)度 */_U16 i_uid; /* 擁有者標(biāo)識(shí)符 */_U32i_atime; /* 最后一次訪問(wèn)文件的時(shí)間 */_U32i_ctime; /* 索引節(jié)點(diǎn)最后改變的時(shí)間 */_U32i_mtime; /* 文件內(nèi)容最后改變的時(shí)間 */_U32i_dtime; /* 文件刪除的時(shí)間 */;#define INODE_INFO_LEN sizeof(struct ext2_inode_info)4.2.5磁
30、盤目錄項(xiàng)結(jié)構(gòu)體在ext2文件系統(tǒng)中,目錄文件包含有下屬文件與子目錄的登記項(xiàng)。當(dāng)創(chuàng)建一個(gè)文件時(shí),就構(gòu)成一個(gè)目錄項(xiàng),并添加到相應(yīng)的目錄文件中。一個(gè)目錄文件可以包含很多目錄項(xiàng),每個(gè)目錄項(xiàng)(如ext2文件系統(tǒng)的ext2_dir_entry_2)包含的信息如下:(1)索引節(jié)點(diǎn)號(hào)。這是相應(yīng)文件在數(shù)據(jù)塊組中的索引節(jié)點(diǎn)號(hào)碼,即檢索索引節(jié)點(diǎn)表數(shù)組的索引值。(2)目錄項(xiàng)長(zhǎng)度。記載該目錄項(xiàng)占多少字節(jié)。(3)名字長(zhǎng)度。記載相應(yīng)文件名的字節(jié)數(shù)。(4)文件類型。用一個(gè)數(shù)字表示文件的類型,例如,1表示普通文件,2表示目錄,3表示字符設(shè)備文件,4表示塊設(shè)備文件等。(5)文件名字。文件名(不包括路徑部分)的最大長(zhǎng)度為255個(gè)字
31、符。每個(gè)目錄的前兩個(gè)目錄始終是標(biāo)準(zhǔn)的“.”和“.”,它們分別代表目錄自身和其父目錄。當(dāng)用戶需要打開某個(gè)文件時(shí),首先要指定該文件的路徑和名稱,文件系統(tǒng)根據(jù)路徑和名稱搜索對(duì)應(yīng)的索引節(jié)點(diǎn),找到該文件的數(shù)據(jù)塊,從而讀取文件中的數(shù)據(jù)。struct ext2_dir_entry _U32inode; /* 索引節(jié)點(diǎn)號(hào) Inode number*/_U16 rec_len; /* 目錄項(xiàng)的長(zhǎng)度 Directory entry length */ _U16 file_type; /* 文件類型 */charnameEXT2_NAME_LEN; /* 文件名 File name length*/;#define
32、 DIR_ENTRY_LEN sizeof(struct ext2_dir_entry) /64B4.2.6當(dāng)前目錄結(jié)構(gòu)體struct fs_struct _U32 count;_U32 lock;_U32 umask;struct ext2_inode_info * root, * pwd;char d_pwdEXT2_NAME_LEN,d_rootEXT2_NAME_LEN;#define FS_STRUCT_LEN sizeof(struct fs_struct)4.2.7用戶打開文件表結(jié)構(gòu)體struct files_struct _U32 count;_U32 file_lock;/*
33、 Protects all the below members. Nests inside tsk-alloc_lock */_S32 max_fds;_S32 max_fdset;_S32 next_fd;struct file * fd;/* current fd array */struct file * fd_arrayNR_OPEN_DEFAULT;#define FILES_STRUCT_LEN sizeof(struct files_struct)4.2.8系統(tǒng)打開文件表結(jié)構(gòu)體struct file struct file * f_next;struct dentry* f_de
34、ntry; /* 所在目錄 */_U32f_count; /* 連接計(jì)數(shù)器 */_U32 f_flags;_U16f_mode;_U32f_pos; /* 文件位移 */_U32f_uid, f_gid;_U32f_maxcount;#define FILE_STRUCT sizeof(struct file)4.2.9用戶結(jié)構(gòu)體#define USER_NAME_LENGTH 10#define PSDMAX 10#define PATH 40struct user_struct _U16 u_uid;_U16 u_gid;char u_nameUSER_NAME_LENGTH;char u
35、_psdPSDMAX;char u_pathPATH;#define USER_STRUCT_LEN sizeof(struct user_struct) /32B4.3 宏定義說(shuō)明#define EXT2_SUPER_MAGIC0xEF53#define VDISKSIZE_MB 16 /* 表示磁盤為多少M(fèi) */#define BLOCKSIZE_BT 512 /* 磁盤塊的大小 (512字節(jié)) */#define RDISKSIZE_MB(VDISKSIZE_MB-VDISKSIZE_MB%GROUPSIZE_MB)#define RDISKSIZE_BT(RDISKSIZE_MB*10
36、24*1024)#define GROUPSIZE_BK (BLOCKSIZE_BT*8) /* 組容量:以邏輯塊個(gè)數(shù)表示 */#define GROUPSIZE_BT (GROUPSIZE_BK*BLOCKSIZE_BT) /* 組容量:以字節(jié)表示 */#define GROUPSIZE_MB (GROUPSIZE_BT/1024/1024) /* 組容量:以M表示 */#define GROUPNUM_FS(RDISKSIZE_MB/GROUPSIZE_MB) /* 文件系統(tǒng)組的總數(shù) */#define GROUPDESCNUM_PBLK(BLOCKSIZE_BT/GROUP_DESC_L
37、EN) /* 每個(gè)邏輯塊含組描述符的個(gè)數(shù) */#define GROUPDESCNUM_BK(GROUPNUM_FS/GROUPDESCNUM_PBLK) /* 組描述符占的數(shù)據(jù)塊數(shù) */#if VDISKSIZE_MB32#define GROUPDESCNUM_BK 1#endif#define DINODENUM_PGUP(BLOCKSIZE_BT*8)/* 每組含索引節(jié)點(diǎn)的個(gè)數(shù) */#define DINODENUM_PBLK(BLOCKSIZE_BT/INODE_LEN)/* 每個(gè)邏輯塊含索引節(jié)點(diǎn)的個(gè)數(shù) */#define DINODETBL_PGUP(DINODENUM_PGUP/DINODENUM_PBLK) /* 索引節(jié)點(diǎn)表占的塊數(shù) */#define DINODENUM_FS(DINODENUM_PGUP*GROUPNUM_FS) /* 索引節(jié)點(diǎn)總數(shù) */#define FREEBLKNUM_PGUP(GROUPDESCNUM_BK-4-DINODETBL_PGUP) /* 每組空閑塊數(shù) */#define FRISTDATA(4+GROUPDESCNUM_BK+DINODETBL_PGUP)
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年新教材高中政治第二單元人民當(dāng)家作主第五課第1課時(shí)人民代表大會(huì):我國(guó)的國(guó)家權(quán)力機(jī)關(guān)練習(xí)含解析部編版必修3
- 賣房后寫合同范例
- 低價(jià)銷售協(xié)議合同范例
- 家政定金合同模板
- 工程租房合同范例
- 房屋出售解除出租合同范例
- 一樓裝修合同模板
- 單位車輛團(tuán)購(gòu)合同模板
- 打公司牌子合同范例
- 配電柜并柜停電方案
- 2024-2025學(xué)年初中九年級(jí)數(shù)學(xué)上冊(cè)期中測(cè)試卷及答案(人教版)
- 2024入團(tuán)知識(shí)題庫(kù)(含答案)
- 電梯日管控、周排查、月調(diào)度內(nèi)容表格
- 1+X數(shù)字營(yíng)銷技術(shù)應(yīng)用題庫(kù)
- 學(xué)校安全隱患排查整治表
- 房屋施工安全協(xié)議書
- HCCDP 云遷移認(rèn)證理論題庫(kù)
- 義務(wù)教育英語(yǔ)課程標(biāo)準(zhǔn)(2022年版)
- 保險(xiǎn)公司招聘銷售的筆試題
- 五大盆地綜合柱狀圖
- 蘇教版數(shù)學(xué)四年級(jí)下冊(cè)《五 解決問(wèn)題的策略 第1課時(shí) 解決問(wèn)題的策略(一)》教學(xué)課件
評(píng)論
0/150
提交評(píng)論